# packages

pkgId: deb9c2032bb8f2b1a7ef2eb9c15cd198d07636501de53728bd0503f6fae462db
name: python-UnifiedAI-help
arch: noarch
version: 1.3
epoch: 0
release: 1
summary: Development documents and examples for UnifiedAI
url: https://github.com/TovbinZ/UnifiedAI
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-UnifiedAI-1.3-1.src.rpm
location_href: Packages/python-UnifiedAI-help-1.3-1.noarch.rpm
checksum_type: sha256
description:
  UnifiedAI is a Python package that simplifies the usage of multiple AI APIs by providing a single, unified API. Currently, it supports OpenAI, Anthropic, and Google AI APIs.

  - Single API for multiple AI providers.
  - Easy switching between different AI models.
  - Simplified authentication and API key management.


pkgId: e99732b275d4d7dab0f75a2b9ed4e06612329ce9ccb922fca1c78147f9de7b84
name: python-Universum-help
arch: noarch
version: 0.19.22
epoch: 0
release: 1
summary: Development documents and examples for Universum
url: https://pypi.org/project/Universum/
rpm_license: BSD
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-Universum-0.19.22-1.src.rpm
location_href: Packages/python-Universum-help-0.19.22-1.noarch.rpm
checksum_type: sha256
description:
  [![Documentation Status](https://readthedocs.org/projects/universum/badge/?version=latest)](
  https://universum.readthedocs.io/en/latest/?badge=latest)

  Universum integrates various CI systems and provides additional features,
  such as: customized downloading sources from VCS, running tests
  described in configuration file and reporting the results to code review systems.

  Full documentation can be found here: https://universum.readthedocs.io/

  Please check out our [code of conduct](CODE_OF_CONDUCT.md)
  and [contribution policy](.github/CONTRIBUTING.md)

  Project is executed with `python3.7 -m universum` command.
  Independent analyzers are executed with their module name, e.g. `python3.7 -m universum.analyzers.pylint`.
  Other Universum modes, such as poller or submitter, are called via command line, e.g.
  `python3.7 -m universum poll`



  Minimum prerequisites ([see documentation for details](https://universum.readthedocs.io/en/latest/install.html)):
  1. OS Linux
  2. Python version 3.7 or greater
  3. Pip version 9.0 or greater
  ```bash
  sudo pip3.7 install -U universum
  ```
  or
  ```bash
  pip3.7 install --user -U universum
  ```
  Can also be installed with [extras for using VCS](
  https://universum.readthedocs.io/en/latest/install.html#vcs-related-extras),  but they also require
  installing respective command-line tools, such as git or p4.



  In order to prepare the development environment for the Universum, please fulfill the prerequisites,
  and then use the commands listed below. Please note we use `venv` to properly select
  python interpreter version and to isolate development environment from the system.

  Prerequisites:
  1. Make sure the libssl-dev and libcrypto++-dev packages are available in your environment.
      ```bash
      sudo apt install libssl-dev libcrypto++-dev
      ```
  2. Install all of the VCS extras as described in the [Universum installation manual](
     https://universum.readthedocs.io/en/latest/install.html#vcs-related-extras),
     (including installation of Git and P4 CLI)
  3. Install Docker (`docker-ce`, `docker-ce-cli`) as described in the [official installation manual](
     https://docs.docker.com/engine/installation/linux/ubuntu/#install-using-the-repository)

     * Also add current user to 'docker' group (use `sudo usermod -a -G docker $USER` and then relogin)
  4. Install Mozilla WebDriver: `sudo apt install firefox-geckodriver`

  Further commands:
  ```bash
  python3.7 -m venv virtual-environment-python3.7
  source ./virtual-environment-python3.7/bin/activate
  git clone https://github.com/Samsung/Universum.git universum-working-dir
  cd universum-working-dir
  git checkout master
  pip install -U .[test]
  make images
  ```
  And after this the `pytest` or `make test` commands can be executed (see below).

  The `[test]` extra will install/update the following additional Python modules:

      * `sphinx`
      * `sphinx-argparse` (extension for `Sphinx`)
      * `sphinx_rtd_theme` (extension for `Sphinx`)
      * `docker`
      * `httpretty`
      * `mock`
      * `pytest`
      * `pylint`
      * `pytest-pylint`
      * `teamcity-messages` (is not actually used in manual testing, but is there for CI)
      * `pytest-cov`
      * `coverage`
      * `mypy`
      * `types-requests`
      * `selenium`

  Although it is possible to get these modules via `pip3.7 install -U universum[test]`, it might be more convenient
  to checkout the Universum branch you are currently working on, change working directory to project root and
  run a `pip3.7 install -U .[test]` command from there for more flexibility. Using virtual environment (via `venv`
  command) allows to separate test environment from system and provides even more control over additional modules.

  Uninstalling Universum via `pip uninstall universum` will not uninstall all the dependencies installed along with it.
  Simply deleting the directory with virtual environment will leave the system completely cleaned of all changes.

  Docker images used in tests can be built manually or using the `make images` command.
  Also `make rebuild` command can be used to update images ignoring cache (e.g. to rerun `apt update`).
  Commands `make images` and `make rebuild` use Python version set in execution environment; to build images
  for another supported Python version, please use environment variable `PYTHON`, e.g.:
  ```
  PYTHON=python3.8 make images
  ```
  Currently the following values of the `PYTHON` environment variable are supported:
  'python3.6', 'python3.7' and 'python3.8'.

  The `make test` command runs all the tests (including the doctests) and collects coverage. Tests can also be launched
  manually via `pytest` command with any required options (such as `-k` for running tests based on keywords
  or `-s` for showing the suppressed output).

  To test Univesrum for all supported Python versions, please run:
  ```
  pip install -U nox
  cd universum-working-dir
  nox
  ```
  This will launch the testing scenario, described in `noxfile.py`. This scenario includes rebuilding docker images
  for every supported Python version and running all the tests for corresponding Python.

  Also, setting up "REUSE_DOCKER_CONTAINERS" environment variable (or running tests in PyCharm) will let tests
  reuse already created and initialized containers, which speeds up the testing process. But do note that this is
  recommended for development purposes only. Without recreating containers, the remnants of previous test runs
  may affect the current test run.




  `universum` is main project folder, that is being copied to Python libraries location
  (e.g. `dist-packages` or `site-packages`) when installed.
  It contains `__main__.py` script, that is the main entry point to the whole project.
  It also contains the following modules:
  * `main`/`poll`/`submit`/`api`/`nonci` - managing modules for different Universum modes
  * `configuration_support` - special module for [configuring the project](
  https://universum.readthedocs.io/en/latest/configuring.html)
  * `analyzers` directory is not quite a part of Universum itself. It contains [independent scripts](
  https://universum.readthedocs.io/en/latest/code_report.html) compatible with Universum
  for implementing static (and other types of) analysis support.
  * `lib` - utility functions libraries

    * `ci_exception` - internal exceptions
    * `module_arguments` - handles [command line](
      https://universum.readthedocs.io/en/latest/args.html) and other parameters
    * `gravity` - inter-module communication
    * `utils` - miscellaneous

  * `modules` - independent packages

    * `api_support` - 'main' mode module to answer API requests
    * `automation_server` - drivers for CI systems (e.g. Jenkins)
    * `artifact_collector` - implements [build artifacts](
      https://universum.readthedocs.io/en/latest/configuring.html#common-variations-keys)
    * `code_report_collector` - support for [external 'code report' modules](
      https://universum.readthedocs.io/en/latest/code_report.html)
    * `launcher` - executes build scenario, described in [project configuration file](
      https://universum.readthedocs.io/en/latest/configuring.html)
    * `output` - drivers for environment-based logs
    * `project_directory` - interaction with host file system
    * `reporter` - interaction with code review systems
    * `structure_handler` - execution 'blocks' isolation, order, reporting, etc.
    * `vcs` - CI target sources preparation

  Also there are 'base' modules/classes for driver implementation standardization,
  and 'main' modules/classes for automated driver choosing based on environment and settings.

  `doc` directory contains sources for [project documentation](
  https://universum.readthedocs.io/en/latest/index.html). It can be generated
  locally with running `make` from root directory using Sphinx.

  `tests` directory contains test system, based on PyTest. Full tests can be started
  from root directory via `make tests` command, otherwise use standard PyTest syntax.
  *Commits failing any of project tests should not be merged into 'master' branch!*

  `examples` contains various examples of [project configuration files](
  https://universum.readthedocs.io/en/latest/configuring.html). Usage of such files
  is illustrated in `run_basic_example.sh` script.

  `setup.py` is 'setuptools' configuration file, and shouldn't be executed on its own.



  1. Project only entry point (except ['analyzers'](https://universum.readthedocs.io/en/latest/code_report.html))
     is `universum.py`. Based on chosen execution mode (default, submitting, polling, etc.)
     it calls one of 'main' modules, passing them all parameters
  2. Universum is a set of separate modules, each implementing its own piece of functionality.
     They are connected using special `gravity` library
  3. All classes, inherited from `Module` (defined in `gravity`), automatically can:

     * use `Dependency` mechanism to use other modules
     * describe any module parameters in `define_arguments()` and receive them parsed via `self.settings`

  4. `configuration_support` is, in fact, an 'external' module, used not only by Universum,
     but by [user configuration file](https://universum.readthedocs.io/en/latest/configuring.html)
     for generating project configuration
  5. 'Base' classes are virtual, not implementing any actual functionality, but describing
     the structure of inherited classes and ensuring they have all required functions
     that will be called by modules using them



  Some additional details on how project is developed could be found in
  [project review slides](doc/Universum_ProjectReview_2021-03.pdf)



  Further versions of this README file should include:

  1. Notification on mandatory code review for all commits to master
  2. Notification on mandatory documenting of the newly added features
  3. Description of CI process, links to configurations/logs/build results/etc.


pkgId: 4df42c4a7fe39886fee80ed5498c5f04f823e7f19c085400308976b8b2fa00a2
name: python-UtilMeta-help
arch: noarch
version: 2.7.0
epoch: 0
release: 1
summary: Development documents and examples for UtilMeta
url: https://utilmeta.com/py
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-UtilMeta-2.7.0-1.src.rpm
location_href: Packages/python-UtilMeta-help-2.7.0-1.noarch.rpm
checksum_type: sha256
description:
  <img src="https://utilmeta.com/img/logo-main-gradient.png" style="width: 200px" alt="">

  **UtilMeta** Python framework is a progressive meta-framework to develop and manage backend applications, building declarative API & ORM efficiently based on the Python type annotation standard with both sync & async syntax, and supports using mainstream Python frameworks as runtime backend

  * Homepage: [https://utilmeta.com/py](https://utilmeta.com/py)
  * Documentation: [https://docs.utilmeta.com/py/en/](https://docs.utilmeta.com/py/en/)
  * Author: <a href="https://github.com/voidZXL" target="_blank">@voidZXL</a>
  * Language: [![en](https://img.shields.io/badge/lang-English-blue.svg)](https://github.com/utilmeta/utilmeta-py/blob/main/README.md) [![zh](https://img.shields.io/badge/lang-中文-green.svg)](https://github.com/utilmeta/utilmeta-py/blob/main/README.zh.md)

  <a href="https://pypi.org/project/utilmeta/" target="_blank">
  	<img src="https://img.shields.io/pypi/v/utilmeta" alt="">
  </a>
  <a href="https://pypi.org/project/utilmeta/" target="_blank">
  	<img src="https://img.shields.io/pypi/pyversions/utilmeta" alt="">
  </a>
  <a href="https://pepy.tech/project/utilmeta" target="_blank">
  	<img src="https://pepy.tech/badge/utilmeta/month" alt="">
  </a>
  <a href="https://github.com/utilmeta/utilmeta-py/blob/main/LICENSE" target="_blank">
  	<img src="https://img.shields.io/badge/license-Apache%202.0-blue" alt="">
  </a>
  <a href="https://github.com/utilmeta/utilmeta-py/actions?query=branch%3Amain+" target="_blank">
  	<img src="https://img.shields.io/github/actions/workflow/status/utilmeta/utilmeta-py/test.yaml?branch=main&label=CI" alt="">
  </a>



  ```
  pip install utilmeta
  ```

  > UtilMeta requires Python >= 3.8





  with UtilMeta, you can easily write declarative APIs with auto request validation, efficient ORM queries, and auto OpenAPI document generation, here is an example from [mini_blog/blog/api.py](https://github.com/utilmeta/utilmeta-py/blob/main/examples/mini_blog/blog/api.py)

  ```python
  from utilmeta.core import api, orm
  from .models import User, Article
  from django.db import models

  class UserSchema(orm.Schema[User]):
      username: str
      articles_num: int = models.Count('articles')

  class ArticleSchema(orm.Schema[Article]):
      id: int
      author: UserSchema
      content: str

  class ArticleAPI(api.API):
      async def get(self, id: int) -> ArticleSchema:
          return await ArticleSchema.ainit(id)
  ```

  if you request the ArticleAPI like `GET /article?id=1`, you will get the result like

  ```python
  {
    "id": 1,
    "author": {
      "username": "alice",
      "articles_num": 3
    },
    "content": "hello world"
  }
  ```
  This is just what you declared, UtilMeta will generate optimized ORM queries automatically based on your declared schemas, prevent N+1 problem and also generate OpenAPI document for your APIs


  UtilMeta built a standard that support most major Python web frameworks as runtime backend, and support current projects using these frameworks to develop new API using UtilMeta progressively

  Currently supported backends:

  * **Django** (also Django REST framework)
  * **Flask** (also APIFlask)
  * **FastAPI** (also Starlette)
  * **Sanic**
  * **Tornado**

  You can change the entire runtime backend with a single line of code, Here is a hello world example of UtilMeta
  ```python
  from utilmeta import UtilMeta
  from utilmeta.core import api
  import django

  class RootAPI(api.API):
      @api.get
      def hello(self):
          return 'world'

  service = UtilMeta(
      __name__,
      name='demo',
      backend=django,    # or flask / fastapi / starlette / sanic / tornado
      api=RootAPI,
      route='/api'
  )

  app = service.application()  # wsgi app

  if __name__ == '__main__':
      service.run()
  ```

  You can create a Python file with the above code and run it to check it out.



  you can start by easily start by clone out repo and run an example

  ```shell
  pip install -U utilmeta
  git clone https://github.com/utilmeta/utilmeta-py
  cd utilmeta-py/examples/mini_blog
  meta migrate        # migrate databases
  meta run            # or python server.py
  ```

  The following info Implies that the service has live
  ```
  | UtilMeta (version) starting service [blog]
  |     version: 0.1.0
  |       stage: ● debug
  |     backend: fastapi (version) | asynchronous
  |    base url: http://127.0.0.1:8080
  ```


  When you started your service, you can see a line of output
  ```
  UtilMeta OperationsAPI loaded at http://127.0.0.1:8080/ops, connect your APIs at https://ops.utilmeta.com
  ```

  this indicates that UtilMeta Operations system is loaded successfully, you
  You can connect your APIs by open this link: [https://ops.utilmeta.com/localhost?local_node=http://127.0.0.1:8080/ops](https://ops.utilmeta.com/localhost?local_node=http://127.0.0.1:8080/ops)

  Click **API** and your will see the generated API document, you can debug your API here
  <img src="https://utilmeta.com/assets/image/connect-local-api.png" href="https://ops.utilmeta.com" target="_blank" width="800"/>
  With your local API connected, you can use these features

  * **Data**: Manage database data (CRUD), in this example, you can add `user` and `article` instance
  * **API**: view and debug on auto generated API document
  * **Logs**: query realtime request logs, view request and response data, error tracebacks
  * **Servers**: view realtime metrics of service resources like servers, databases, caches

  > Using other management features requires you to connect a online service with public network address

  We have several introductory case tutorials from easy to complex, covering most usage of the framework. You can read and learn in the following order.

  1. [BMI Calculation API](https://docs.utilmeta.com/py/en/tutorials/bmi-calc)
  2. [User Login & RESTful API](https://docs.utilmeta.com/py/en/tutorials/user-auth)
  3. [Realworld Blog Project](https://docs.utilmeta.com/py/en/tutorials/realworld-blog)
  4. Websocket Chatroom (coming soon)

  If you prefer to learn from a specific feature, you can refer to

  * [Handle Request](https://docs.utilmeta.com/py/en/guide/handle-request): How to handle path, query parameters, request body, file upload, request headers and cookies.
  * [API Class and Routing](https://docs.utilmeta.com/py/en/guide/api-route) How to use API class mounts to define tree-like API routing, and use  hooks to easily reuse code between APIs, handle errors, and template responses.
  * [Schema Query and ORM](https://docs.utilmeta.com/py/en/guide/schema-query) How to use UtilMeta to write declarative ORM queries for RESTful API.
  * [API Authentication](https://docs.utilmeta.com/py/en/guide/auth): How to use Session, JWT, OAuth and other methods to authenticate the request of the interface, get the current request's user and simplify the login operation
  * [Declarative Web Client](https://docs.utilmeta.com/py/en/guide/client): Use the declarative syntax identical to API to write request client code, and genrate client code based on UtilMeta service or OpenAPI docs

  If your APIs are developed, and want to know how to config, run and manage your APis, check

  * [Config, Run & Deploy](https://docs.utilmeta.com/py/en/guide/config-run): How to configure the run settings, startup, and deployment of a service using features such as declarative environment variables
  * [Connect & Operations](https://docs.utilmeta.com/py/en/guide/ops): How to connect and manage your API service


  Join our community to build great things together

  * [Discord](https://discord.gg/JdmEkFS6dS)
  * [X(Twitter)](https://twitter.com/@utilmeta)
  * [Reddit](https://www.reddit.com/r/utilmeta)


  The UtilMeta team is providing custom solutions and enterprise-level support at

  * [https://utilmeta.com/solutions](https://utilmeta.com/solutions)

  You can also contact us in [this page](https://utilmeta.com/about#contact)



  Contact the creator's wechat (voidZXL) for support or join the developers wechat group

  <img src="https://utilmeta.com/img/wx_voidzxl.jpg" href="https://utilmeta.com/py" target="_blank"  alt="drawing" width="200"/>

rpm_license:
  Copyright (c) 2019-present Xulin Zhou (周煦林)  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: 74c05bc49f88373f164109dc406a4f32ad0e88d92bea468f99d6f1c308752af9
name: python-Utils-RAG-help
arch: noarch
version: 0.1.0
epoch: 0
release: 1
summary: Development documents and examples for Utils-RAG
url: https://github.com/Fangzhou-Code/Utils
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-Utils-RAG-0.1.0-1.src.rpm
location_href: Packages/python-Utils-RAG-help-0.1.0-1.noarch.rpm
checksum_type: sha256
description:
  Mimic langchain to customize some tools for working with local models





  Here is an enhanced version of the LocalEmbeddings class that provides similar functionality to the OpenAI embedding model and includes more features and detailed comments in English and Chinese: | 以下是增强版的 LocalEmbeddings 类，它提供了与 OpenAI 嵌入模型类似的功能，并且包括更多特性和详细的中英文注释：

  * **Initializing the Local Model | 初始化本地嵌入模型**

  ```python



  local_embeddings = EnhancedLocalEmbeddings(model_path="sentence-transformers/all-MiniLM-L6-v2")



  local_embeddings_hf = EnhancedLocalEmbeddings(
      model_path="bert-base-uncased",
      tokenizer_path="bert-base-uncased"
  )
  ```

  * **Embedding Single Text | 嵌入单个文本**

  ```python
  embedding = local_embeddings.embed_text("The quick brown fox jumps over the lazy dog.")
  print("单文本嵌入结果 | Single text embedding:", embedding[:10])  # 打印前 10 个维度
  ```

  * **Embedding Multiple Texts | 嵌入多个文本**

  ```python
  texts = ["Text 1", "Text 2"]
  embeddings = local_embeddings.embed_documents(texts)
  print("多文本嵌入结果 | Multiple text embeddings:", [embedding[:10] for embedding in embeddings])
  ```

  * **Embedding Single Texts Tsynchronously | 异步嵌入单个文本**

  ```python
  import asyncio
  async def async_example():
      embedding = await local_embeddings.aembed_text("Async embedding example.")
      print("异步单文本嵌入结果 | Async single text embedding:", embedding[:10])

  asyncio.run(async_example())

  ```

  * **Embedding Multipes Texts Tsynchronously | 异步嵌入单个文本**

  ```python
  import asyncio


  async def async_example():
      texts = ["Text 1 for async.", "Text 2 for async."]
      embeddings = await local_embeddings.aembed_documents(texts)
      print("异步多文本嵌入结果 | Async multiple text embeddings:", [embedding[:10] for embedding in embeddings])

  asyncio.run(async_example())

  ```

  * **Embedded Query Text | 嵌入查询文本**

  ```python
  query = "What is the meaning of life?"
  query_embedding = local_embeddings.embed_query(query)
  print("查询嵌入结果 | Query embedding:", query_embedding[:10])
  ```

  * **Batch Embedding of Multiple Text | 批量嵌入多个文本**

  ```python
  large_texts = ["Sample text " + str(i) for i in range(100)]
  batch_embeddings = local_embeddings.embed_batch(large_texts, batch_size=16)
  print("批量嵌入结果 | Batch embeddings:", [embedding[:10] for embedding in batch_embeddings[:3]])
  ```

  * **Direct Call Example | 直接调用实例**

  ```python
  texts = ["Direct call example 1.", "Direct call example 2."]
  embeddings = local_embeddings(texts)
  print("直接调用嵌入结果 | Direct call embeddings:", [embedding[:10] for embedding in embeddings])
  ```


pkgId: 93ec82cbe89a27d4ac407590be868fe79545ad9c019c11b5a241a4e184999e53
name: python-Utils-cws-web-help
arch: noarch
version: 1.0.0
epoch: 0
release: 1
summary: Development documents and examples for Utils-cws-web
url: https://github.com/ConectarWali/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-Utils-cws-web-1.0.0-1.src.rpm
location_href: Packages/python-Utils-cws-web-help-1.0.0-1.noarch.rpm
checksum_type: sha256
description:
  ```plaintext
  MIT License
  Copyright (c) 2024 Conectar Wali SAS.
  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: ba61e5b38556d4b8071f8b8f2815d1d836ab1fe4ae4fdb27c682d930ab676f98
name: python-VChat-help
arch: noarch
version: 1.2.0
epoch: 0
release: 1
summary: Development documents and examples for VChat
url: https://github.com/z2z63/VChat
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-VChat-1.2.0-1.src.rpm
location_href: Packages/python-VChat-help-1.2.0-1.noarch.rpm
checksum_type: sha256
description:
  - 2024年确认可使用的少数微信个人帐号接口项目
  - 基于itchat-uos完全重构，type hint友好
  - 使用异步协程和结构化并发代替原itchat-uos的基于多线程的并发，性能更高，更容易集成到你的项目中
  - 不需要在2017年之前登录过微信网页端，不需要开通支付功能，新注册的微信号也能使用
  - 支持帐号多开


  <div style="display: flex;justify-content: space-around;width: 900px">
  <img alt="demo1" style="width:400px" src="https://raw.githubusercontent.com/z2z63/image/main/202407302302972.png"/>
  <img alt="demo1"  style="width:400px" src="https://raw.githubusercontent.com/z2z63/image/main/202407302305229.png"/>
  </div>


  1. 安装`vchat`(目前需要python版本3.10及以上)
      ```shell
      pip install vchat
      ```
  2. 新建文件`main.py`，内容如下
      ```python
      import asyncio

      from vchat import Core
      from vchat.model import ContentTypes, ContactTypes

      core = Core()
      
      
      @core.msg_register(msg_types=ContentTypes.TEXT, contact_type=ContactTypes.CHATROOM)
      async def _(msg):
         print(msg.content.content)  # 打印消息的内容


      async def main():
         await core.init()
         await core.auto_login(hot_reload=True)
         
         await core.send_msg("hello, filehelper", to_username="filehelper")
         
         await core.run()


      if __name__ == "__main__":
         asyncio.run(main())
      ```
  3. 运行
      ```shell
      python main.py
      ```
  4. 终端中完成扫码
  5. enjoy


  - [联系人(Contact)](./docs/model.md#联系人contact)
  - [消息(Message)](./docs/model.md#消息message)
  - [内容(Content)](./docs/model.md#内容content)
  - [收发消息](./docs/send.md#收发消息)

  已确认可以工作的功能

  1. 接受文本，图片，音频，视频，文件
  2. 发送文本，图片，视频，文件
  3. 收发好友消息和群聊消息


  因为使用了新的union语法，需要python3.10及以上版本，未来会去除这个限制

  - VChat支持同步调用吗？
  不支持，因为异步协程是更简单的并发模型，符合结构化并发，而且python的同步和异步差别很大，无法一份代码同时供同步异步调用

  - 如何将VChat集成到我的项目中？
  异步：使用`TaskGroup`等待`core.run`和你的异步主函数即可
  同步：创建一个线程，使用`asyncio.run`运行`vchat`即可

  VChat是在MIT许可证下发行的自由软件，这意味着您可以在承认原作者（LittleCoder）的copyright的前提下以任何意图运行VChat、分发VChat的副本、修改VChat、重分发修改后的副本

  使用VChat前，您应当知悉，VChat依赖于微信服务，这是一个商业的、专有的互联网服务，您无法在不使用微信服务的情况下使用VChat
  因此，尽管原作者通过MIT协议授予您使用VChat的自由，但您如何使用微信服务仍然受[微信个人账号使用规范](https://weixin.qq.com/cgi-bin/readtemplate?&t=page/agreement/personal_account&lang=zh_CN)，以及您所在地区或国家的法律法规所限制

  作者遵循原itchat-uos的协议，不在MIT协议之上附加任何条款，也不限制您使用VChat的自由。作者开发并维护VChat的原因仅仅是学习itchat-uos内部的原理、在linux平台使用微信。您在使用VChat过程中产生的任何滥用行为所造成的后果由您承担
  > 为了学习和研究软件内含的设计思想和原理，通过安装、显示、传输或者存储软件等方式使用软件的，可以不经软件著作权人许可


pkgId: 907c30bb811064710085ede9e3dcbb826a4734620b1a30ef8d315ed991a3dcdb
name: python-VideoTimestamps-help
arch: noarch
version: 0.1.0
epoch: 0
release: 1
summary: Development documents and examples for VideoTimestamps
url: https://pypi.org/project/VideoTimestamps/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-VideoTimestamps-0.1.0-1.src.rpm
location_href: Packages/python-VideoTimestamps-help-0.1.0-1.noarch.rpm
checksum_type: sha256
description:
  [![VideoTimestamps - Version](https://img.shields.io/pypi/v/videotimestamps.svg)](https://pypi.org/project/VideoTimestamps)
  [![VideoTimestamps - Python Version](https://img.shields.io/pypi/pyversions/videotimestamps.svg)](https://pypi.org/project/VideoTimestamps)
  [![VideoTimestamps - Coverage](https://img.shields.io/codecov/c/github/moi15moi/VideoTimestamps)](https://app.codecov.io/github/moi15moi/VideoTimestamps)
  [![VideoTimestamps - mypy](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/moi15moi/VideoTimestamps/actions?query=branch:main)

  This tool allows to recover the timestamps of each frame in a video in milliseconds.
  It also help to convert a frame to a time in milliseconds and vice-versa.


  ```
  pip install VideoTimestamps
  ```


  -  [ffprobe](https://ffmpeg.org/download.html)


  See the [example file](./examples/get_timestamps.py).


pkgId: 1997b06b8eae91418b3e39d4b125929fc0f19b6229eea51200773d4c7c55b08c
name: python-VisualShape3D-help
arch: noarch
version: 1.1.6
epoch: 0
release: 1
summary: Development documents and examples for VisualShape3D
url: https://pypi.org/project/VisualShape3D/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-VisualShape3D-1.1.6-1.src.rpm
location_href: Packages/python-VisualShape3D-help-1.1.6-1.noarch.rpm
checksum_type: sha256
description:
  VisualShape3D is designed to facilitate the creation of 3D polygons for educational purposes. In this context, a 3D polygon is referred to as a 3D shape and is constructed through a systematic process:

  1) A 2D polygon is created in the yz plane using a class called `Shape`, with specified parameters as follows:
     ```python
     from VisualShape3D.Shape3D import Shape
     shape1 = Shape('rectangle', W, H)
     shape2 = Shape('triangle', W, H, A)
     shape3 = Shape('rectangleWithHole', W, H, A, B, C, D)
     shape4 = Shape('fourSided', W, H, A, B)
     shape5 = Shape('fiveSided', W, H, A, B, C, D)
     shape6 = Shape('regularPolygon', n, R)
     shape7 = Shape('polygon', [(x1, y1), (x2, y2), ..., (xn, yn)])
     ```
     Once a 2D shape is created, its vertices are generated automatically.

  2) The polygon is then transformed to a new position (X, Y, Z) while adopting a new orientation based on its facets. The transformation can be executed as follows:
     ```python
     shape1 = shape1.transform(to=(X, Y, Z), angles=(alpha1, beta1))
     ```
     Alternatively, it can be done in steps:
     ```python
     shape1 = shape1.transform(to=(X, Y, Z))
     shape1 = shape1.transform(alpha=alpha1)
     shape1 = shape1.transform(beta=beta1)
     ```
     The reference point for translation can be any 3D point; by default, the first vertex of the polygon serves as the reference point.

  3) The results can then be visualized within the VisualShape3D framework, which is built upon Matplotlib:
     ```python
     from VisualShape3D.Visual import VisualShape3D
     vs3d = VisualShape3D()
     vs3d.add_shape(shape1)
     vs3d.show()
     ```

  **Core Features**
  The transformation process includes translation, which involves moving the reference point to a new 3D position, and rotation, which consists of adjusting the facets to a new direction about the Z-axis. The first vertex acts as the pivot point for these transformations, including rotation around the first edge. Notably, these operations are independent of one another.




  * [Python](http://www.python.org) 3
  * Matplotlib is installed.



  To be continued.


  ```bash
  pip install VisualShape3D
  ```


  ```Python
  import VisualShape3D.shapes as sp
  sp.shapes()
  ```

  ```
  from VisualShape3D.Shape3D import Shape
  W,H = 1, 0.7
  shape1 = Shape('rectangle',W,H)
  shape2 = shape1.transform(alpha = 30)
  shape3 = shape2.transform(beta = 30)
  shape4 = shape3.transform(to=(-0.5,-0.5,0))
  ```

  ```
  %matplotlib notebook
  from VisualShape3D import Visual as vm
  visual = vm.VisualShape3D({'facecolor':'yellow','alpha':0.7})
  visual.add_shape(shape1,{'facecolor':'slategrey','alpha':0.7})
  visual.add_shape(shape2,{'facecolor':'slategrey','alpha':0.7})
  visual.add_shape(shape3,{'facecolor':'slategrey','alpha':0.7})
  visual.add_shape(shape4,{'facecolor':'slategrey','alpha':0.7})
  visual.show()
  ```


  `1.1.6` VisualShape3D.geometry -> VisualShape3D.Shape3D; VisualShape3D.VisualModels -> VisualShape3D.Visual
  `1.0.7`  fix the bug of Shape_rectangleWithHole
  `1.0.6`  Change the about VisualShape3D
  `1.0.5`  Add "Modeling a house with shape" and "Building model" jupyter files




      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/>.


  heliqun@ustc.edu.cn


pkgId: e8e8b63fe3e551568b7fc5c0d0e86b363199ac38b909df421ba56302c0bc697c
name: python-WITecSDK-help
arch: noarch
version: 1.5.0
epoch: 0
release: 1
summary: Development documents and examples for WITecSDK
url: https://raman.oxinst.com/
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WITecSDK-1.5.0-1.src.rpm
location_href: Packages/python-WITecSDK-help-1.5.0-1.noarch.rpm
checksum_type: sha256
description:
  This package enables control of WITec microscopes over its COM interface (additonal license required).

  - Gives access to data acquisition functions
  - Implements all classes of WITec's COM interface
  - Offers ready-to-use modules for main measurement modes (Large Area Scan, Line Scan, Slow Series)
  - Has modules for hardware control (motorized xy and z stage, spectrograph, laser, TrueSurface, polarization, turret)
  - Gives access to video system (image acquisition, autofocus)
  - Enables to save and create projects
  - Can be extended by directly accessing needed parameters
  - All modules are tested with versions down to WITec Control 5.0 (can be used even for older version but not all classes might work)



  Basic information can be found using the Python's built-in help function.



  ```
  from WITecSDK import WITecControl
  WC = WITecControl()
  WC.SingleSpectrum.IntegrationTime
  ```

  All available modules are implemented as property of the main class (WITecControl).



  Documented examples are delivered with WITec Control. Further information can be found in it's help. If you use an older version of WITec Control please contact the [WITec support team](https://raman.oxinst.com/contact).



  If you want to share your own extensions or have feature wishes or bug reports please contact the [WITec support team](https://raman.oxinst.com/contact).





  - main class renamed to WITecControl (WITecSDKClass still works)
  - modules are now properties of the main class
  - Create... methods are created dynamically for compatibility
  - available parameters are now accessible by dot notation under comParameters (i.e. WITec.comParameters.UserParameters)
  - Parameters have their type, path and if applicable their value as representation
  - module for own coordinate system added



  - module for EFMControl added
  - ScanMode implemented for LineScan class
  - version information in prompt when connecting
  - Typo PGain corrected in AFM class
  - correct range output in ValueOutOfRangeException



  - Support for AFM added
  - new modules AFM, DistanceCurve and ImageScanMultiPass
  - new method in WITecSDKClass: WaitForWriteAccess
  - bug in property Beta of ImagesScan fixed



  - Support for pywin32 removed
  - COM parameter classes now use properties
  - COMParameters.GetParameter always returns the correct class
  - COM operations will produce a ConnectionLostException in case WITec Control is not available
  - AwaitSilentSpectrumAvailableBeamPath() in SilentSpectrum now waits 4 seconds for beampath change
  - XYAxes has AwaitMoveToSoftwarePosBacklashComp which moves with Backlash compensation
  - Wrong calculation of Laser power in combination with correction factor fixed, new property SelectedLaserPowerInFiber in LaserManager module



  - Mask property for SpectralAutofocus
  - setSpectralMask is deprecated and will be removed in the future
  - Mask added to AutofocusSettings



  - Image scan added
  - Scan table (piezo stage) added



  - Bug in Autofocus fixed
  - Bug in WITecControlVersionTester fixed



  - Spectral Stitching added
  - WITecControlVersionTester reworked



  - Bug in Polarization.py and Beampath.py fixed



  - Readme fixed



  - Bug in Polarization.py fixed



  - New WITec Control 6.2 features implemented (for LineScan, LargeAreaScan, ActiveSequencer, TrueSurface)
  - docstrings added
  - compatibility down to WITec Control 5.0 added
  - New class LaserPowerSeries
  - New structure for Polarization class
  - CalibrationLamp and AdjustmentSampleCoupler added to BeamPath
  - LineScan has own Integration time and Accumulation property
  - LaserManager gives the corrected laser power by default (old property removed)
  - New property Unit for Spectrograph



  - New property HideViewers for the ActiveSequencer
  - New property WriteAccess in the COMClient replacing old implemantation
  - New property ReadAccess for the COMClient and HasReadAccess for the main class
  - Improved error handling in __del__ of COMClient



  - Bug in ProjectCreatorSaver module corrected
  - property ExtraDirectory renamed to SubDirectory (read-only) and method DefineSubDirectory()



  - New class AutomatedCoupler attached to TopIllumination and VideoControl, if automated
  - New classes inheriting from its main class to implement versiongreater61 features
  - New class DetectorOutput for internal use
  - __del__ removed from all modules


pkgId: 28ae1e9cd3cc355c01abd88a2afc7c62c117a455eabb708a89d4ab9193022b2d
name: python-WORMTRACKATRON7000-help
arch: noarch
version: 0.1.6
epoch: 0
release: 1
summary: Development documents and examples for WORMTRACKATRON7000
url: https://pypi.org/project/WORMTRACKATRON7000/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WORMTRACKATRON7000-0.1.6-1.src.rpm
location_href: Packages/python-WORMTRACKATRON7000-help-0.1.6-1.noarch.rpm
checksum_type: sha256
description:
  **Worm Tracker** is a Python-based tool for processing and analyzing worm-tracking videos in `.wmv` format. It facilitates segmenting worms inside a defined polygonal region of interest (ROI) versus those outside it, saving results to CSV, generating labeled output videos (optional), producing trace maps, and reviewing and adjusting worm counts post-processing.



  1. **Polygon ROI Selection:**
     For each video or group of videos (organized by their folder structure), you can select or reuse previously saved polygons to define the area of interest.

  2. **Video Processing & Counting:**
     Using image processing and thresholding, the software detects and counts worms inside and outside the polygon. It stores the counts in a CSV file for each video.

  3. **Parallel Processing:**
     Multiple videos are processed in parallel using `multiprocessing`, speeding up analysis for larger datasets.

  4. **Trace Maps & Visualization:**
     Generates a color-coded "trace map" image showing where worms were detected most frequently inside and outside the polygon over time.

  5. **Review Mode:**
     Allows you to revisit completed videos, review worm counts, and apply offset corrections to inside/outside counts across one or multiple videos (if grouped by folder).

  6. **Plot Generation:**
     Automatically generates plots showing original and offset-adjusted worm counts over time for each processed CSV file.



  - Python 3.8+
  - Packages:
    - `opencv-python` (OpenCV)
    - `numpy`
    - `pandas`
    - `matplotlib`
    - `PyQt6`

  You can install the dependencies using:
  ```bash
  pip install opencv-python numpy pandas matplotlib PyQt6
  ```



  ```bash
  python wormtrack analyse
  ```
  **Process:**
  - The tool first asks for configuration parameters (threshold, blur kernel, etc.).
  - You select if you want to group videos by folder, whether to reuse previously saved polygons, and if you want to save labeled videos.
  - Videos found in the current working directory and its subdirectories (`.wmv` files) are processed. Worm counts are saved to CSV files named `[video_basename]_worms_count.csv`, and optional labeled videos are saved as `[video_basename]_labeled.avi`.
  - A polygon ROI file (`[video_basename]_polygon.npy`) and a trace map file (`[video_basename]_trace.png`) are generated.


  ```bash
  python wormtrack review
  ```
  **Process:**
  - Displays a simplified configuration GUI for review mode.
  - Allows you to select which processed videos to review. Videos without trace files will be disabled for selection.
  - For selected videos, you can adjust worm counts by applying offsets to inside/outside counts.
  - If videos are grouped by folder, you can apply the same offsets to all videos in that folder.

  The CSV files are updated with the offset corrections after confirmation.


  ```bash
  python wormtrack plot
  ```
  **Process:**
  - Scans for all CSV files in the current directory and subdirectories.
  - Generates `*_plot_original.png` and `*_plot_adjusted.png` graphs for each CSV file, showing worm counts over frames.


  - `main.py`
  The main entry point for the application.
  Handles command-line arguments and launches the appropriate mode (`analyse`, `review`, or `plot`).

  - `worm_tracker.py`
  Contains the `WormTracker` class, which handles video loading, polygon ROI selection, worm counting, and trace map creation.

  - `worm_tracker_utils.py`
  Utility functions to:
      - Organize videos by folder.
      - Handle polygon selection and loading/saving.
      - Process videos in parallel.
      - Update CSV files with offsets.
      - Manage the review workflow.

  - `gui.py`
  Contains GUI classes and functions for:
      - Configuration windows (`ModernConfigWindow`, `ReviewConfigWindow`).
      - Polygon selection windows (`ModernPolygonSelector`).
      - Video selection for review (`VideoReviewSelector`).
      - Offset adjustment window (`OffsetAdjustmentWindow`).

  - `plot_utils.py`
  Functions for generating plots from CSV files.


  - **Input:**
  `.wmv` video files located in the current directory and subdirectories.
  - **Output:**
      - `[video_basename]_polygon.npy`: Polygon ROI coordinates.
      - `[video_basename]_worms_count.csv`: CSV file with frame-by-frame worm counts.
      - `[video_basename]_labeled.avi`: Optional labeled video with worm outlines and counts.
      - `[video_basename]_trace.png`: Color-coded trace map image.
      - `[video_basename]_plot_original.png` and `[video_basename]_plot_adjusted.png`: Plots showing original and adjusted worm counts over time.


  - Ensure that the working directory is the folder containing your `.wmv` videos before running `wormtrack`.
  - The GUI-based approach may require a display environment (i.e., not headless) when run locally.
  - This code was tested with `.wmv` format videos. Other formats may work if OpenCV supports them.


  This project is distributed under the MIT License. See `LICENSE` file for more details.


pkgId: 988bb9887020bb8ff2cc4d9a7277667d9bf711ab78c94c6ba176d5cf887b3e43
name: python-WPyrogram-help
arch: noarch
version: 2.0.149
epoch: 0
release: 1
summary: Development documents and examples for WPyrogram
url: https://github.com/ALiwoto/WPyrogram
rpm_license: LGPLv3
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WPyrogram-2.0.149-1.src.rpm
location_href: Packages/python-WPyrogram-help-2.0.149-1.noarch.rpm
checksum_type: sha256
description:
  <p align="center">
      <a href="https://github.com/pyrogram/pyrogram">
          <img src="https://docs.pyrogram.org/_static/pyrogram.png" alt="Pyrogram" width="128">
      </a>
      <br>
      <b>Telegram MTProto API Framework for Python</b>
      <br>
      <a href="https://pyrogram.org">
          Homepage
      </a>
      •
      <a href="https://docs.pyrogram.org">
          Documentation
      </a>
      •
      <a href="https://docs.pyrogram.org/releases">
          Releases
      </a>
      •
      <a href="https://t.me/pyrogram">
          News
      </a>
  </p>



  > Elegant, modern and asynchronous Telegram MTProto API framework in Python for users and bots

  WARNING: We merge changes made to few of pyrogram forks plus changes made by us to this repository. All the features are just customized feature mostly for personal use; there is no guarantee in them being stable, USE AT YOUR OWN RISK.
  All of the repositories that we merge (some) features from are listed in [Extra.md](./Extras.md) file.

  ``` python
  from pyrogram import Client, filters

  app = Client("my_account")


  @app.on_message(filters.private)
  async def hello(client, message):
      await message.reply("Hello from Pyrogram!")


  app.run()
  ```

  **Pyrogram** is a modern, elegant and asynchronous [MTProto API](https://docs.pyrogram.org/topics/mtproto-vs-botapi)
  framework. It enables you to easily interact with the main Telegram API through a user account (custom client) or a bot
  identity (bot API alternative) using Python.



  If you'd like to support Pyrogram, you can consider:

  - [Become a GitHub sponsor](https://github.com/sponsors/delivrance).
  - [Become a LiberaPay patron](https://liberapay.com/aliwoto).
  - [Become an OpenCollective backer](https://opencollective.com/pyrogram).



  - **Ready**: Install Pyrogram with pip and start building your applications right away.
  - **Easy**: Makes the Telegram API simple and intuitive, while still allowing advanced usages.
  - **Elegant**: Low-level details are abstracted and re-presented in a more convenient way.
  - **Fast**: Boosted up by [TgCrypto](https://github.com/pyrogram/tgcrypto), a high-performance cryptography library written in C.
  - **Type-hinted**: Types and methods are all type-hinted, enabling excellent editor support.
  - **Async**: Fully asynchronous (also usable synchronously if wanted, for convenience).
  - **Powerful**: Full access to Telegram's API to execute any official client action and more.





  > NOTE: in order to use WPyrogram, please uninstall pyrogram first.

  ```sh
  pip uninstall pyrogram
  pip install 'wpyrogram'
  ```




  - Check out the docs at https://docs.pyrogram.org to learn more about Pyrogram, get started right
  away and discover more in-depth material for building your client applications.
  - Join the official channel at https://t.me/pyrogram and stay tuned for news, updates and announcements.


pkgId: 56c50e47fdca82f37b7f9726c30978e9fa616870612bc30de9ca5105ffd968a1
name: python-WebSpeechRecognition-help
arch: noarch
version: 0.1.4
epoch: 0
release: 1
summary: Development documents and examples for WebSpeechRecognition
url: https://pypi.org/project/WebSpeechRecognition/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WebSpeechRecognition-0.1.4-1.src.rpm
location_href: Packages/python-WebSpeechRecognition-help-0.1.4-1.noarch.rpm
checksum_type: sha256
description:
  WebSpeechRecognition is a Python library that helps turn speech into text in real time. It uses the Selenium WebDriver and the HTML5 Web Speech API. This tool is built to work with Chrome WebDriver and is easy to use for speech recognition tasks.





  To install WebSpeechRecognition, you can use pip:

  ```bash
  pip install WebSpeechRecognition
  ```



  - **Works in Many Languages:** You can set the language you want using simple codes like "en-US" for English.
  - **Change Language Easily:** You can pick a language at any time while using it.
  - **Simple Functions:** It has easy-to-understand methods to start and stop speech recognition.





  To start using WebSpeechRecognition, initialize the `SpeechRecognition` class with the path to your ChromeDriver executable and the language code:

  ```python
  from WebSpeechRecognition import SpeechRecognition

  recognizer = SpeechRecognition("path/to/chromedriver", language="en-US")
  recognizer.Init()
  ```



  To start listening and transcribing speech, use the `Listen` method. This method returns the transcribed text:

  ```python
  text = recognizer.Listen(print_allowed=True)
  print(f"You said: {text}")
  ```



  Once you are done, use the `Quit` method to close the ChromeDriver instance:

  ```python
  recognizer.Quit()
  ```



  Here is a complete example:

  ```python
  from WebSpeechRecognition import SpeechRecognition

  recognizer = SpeechRecognition("path/to/chromedriver", language="en-US")
  recognizer.Init()

  while True:
      try:
          text = recognizer.Listen(print_allowed=True)
          print(f"You said: {text}")
      except KeyboardInterrupt:
          recognizer.Quit()
          break
  ```






  - `driver_path`: The path to the Chrome WebDriver file.
  - `language`: The language code for recognition (default: "en-US").


  Sets up the WebDriver with options for speech recognition.


  Starts listening and returns the text it hears.
  - `print_allowed`: If True, prints recognized text to the console.


  Stops the WebDriver and closes everything.




  We welcome contributions! If you find a bug or have an idea for a new feature, feel free to open an issue or a pull request on our GitHub repository.

  Want to help improve SpeechRecognition? Here's how:

  1. Fork the repository.
  2. Make a new branch (`git checkout -b feature-branch`).
  3. Add your changes (`git commit -m 'Add feature'`).
  4. Push your branch (`git push origin feature-branch`).
  5. Open a pull request for review.




  This project uses the MIT License. See the `LICENSE` file for details.





  Have questions or suggestions? Contact us:

  - Email: authentic.arnav@gmail.com


pkgId: ec5a1f8ede946a04cfb600d4584a2b3fe8386ae1c8cfc6f04f997e4fd1ae20ca
name: python-WerkzeugSecurityCLI-help
arch: noarch
version: 1.1.0
epoch: 0
release: 1
summary: Development documents and examples for WerkzeugSecurityCLI
url: https://github.com/jb2170/WerkzeugSecurityCLI/
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WerkzeugSecurityCLI-1.1.0-1.src.rpm
location_href: Packages/python-WerkzeugSecurityCLI-help-1.1.0-1.noarch.rpm
checksum_type: sha256
description:
  A CLI wrapper around

  - `werkzeug.security.generate_password_hash`
  - `werkzeug.security.check_password_hash`

  for generating and checking [`werkzeug.security`](https://werkzeug.palletsprojects.com/en/stable/utils/#module-werkzeug.security) password hashes on the command line



  Not associated with [Werkzeug](https://github.com/pallets/werkzeug/) in any way! (other than using their wonderful software :D)



  ```
  $ HASH=$(wzscli generate my-test-password-123)
  $ echo "${HASH}"
  scrypt:32768:8:1$pyMfKdIqwYxw0GOT$6d49052bdf9cffb2288d7cb198d7bed5566f284932dad0c74b3948866b1468220afd93e9aa17069c4a2403d33747e5e71981c3c552d751a0e249642b6641bac5
  $ wzscli check "${HASH}" my-test-password-12
  False
  $ wzscli check "${HASH}" my-test-password-123
  True
  ```

  One can supply the `password` positional argument directly in the command line argv as above, or supply `-` to read the password from stdin using Python's `getpass` module as below

  ```
  $ HASH=$(wzscli generate -)
  > Password: # sneedy-feedy
  $ wzscli check "${HASH}" -
  > Password: # sneedy-feedy
  True
  ```



  Available on PyPI as [WerkzeugSecurityCLI](https://pypi.org/project/WerkzeugSecurityCLI/).

  I like to use `pipx` to manage Python CLI utils:

  ```
  $ pipx install WerkzeugSecurityCLI
  ```

rpm_license:
  GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007  Copyright (C) 2007 Free Software Foundation, Inc. <https://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.  <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year>  <name of author>  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 <https://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:  <program>  Copyright (C) <year>  <name of author> 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 <https://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 <https://www.gnu.org/licenses/why-not-lgpl.html>.


pkgId: 53da9c3db8667acfbe027d3f1151830d60fc64ce28c23bd24e834e1c1250e8ca
name: python-WhakerPy
arch: noarch
version: 1.1
epoch: 0
release: 1
summary: Web HTML maker in Python - a light web application framework
url: https://sourceforge.net/projects/whakerpy/
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WhakerPy-1.1-1.src.rpm
location_href: Packages/python-WhakerPy-1.1-1.noarch.rpm
checksum_type: sha256
description:
   ██╗    ██╗ ██╗  ██╗  █████╗  ██╗  ██╗ ███████╗ ██████╗  ██████╗ ██╗   ██╗
   ██║    ██║ ██║  ██║ ██╔══██╗ ██║ ██╔╝ ██╔════╝ ██╔══██╗ ██╔══██╗╚██╗ ██╔╝
   ██║ █╗ ██║ ███████║ ███████║ █████╔╝  █████╗   ██████╔╝ ██████╔╝ ╚████╔╝
   ██║███╗██║ ██╔══██║ ██╔══██║ ██╔═██╗  ██╔══╝   ██╔══██╗ ██╔═══╝   ╚██╔╝
   ╚███╔███╔╝ ██║  ██║ ██║  ██║ ██║  ██╗ ███████╗ ██║  ██║ ██║        ██║
    ╚══╝╚══╝  ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚══════╝ ╚═╝  ╚═╝ ╚═╝        ╚═╝
     a Python library to create dynamic HTML content and web applications
                Copyright (C) 2023-2024 Brigitte Bigi, CNRS

rpm_license:
  GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.  Preamble  The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.  The licenses for most software and other practical works are designed to take away your freedom to share and change the works.  By contrast, our General Public Licenses are 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.  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.  Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.  A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate.  Many developers of free software are heartened and encouraged by the resulting cooperation.  However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.  The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community.  It requires the operator of a network server to provide the source code of the modified version running there to the users of that server.  Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.  An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals.  This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.  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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.  Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software.  This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.  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 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 work with which it is combined will remain governed by version 3 of the GNU General Public License.  14. Revised Versions of this License.  The Free Software Foundation may publish revised and/or new versions of the GNU Affero 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 Affero 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 Affero 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 Affero 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.  <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year>  <name of author>  This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero 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 Affero General Public License for more details.  You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.  Also add information on how to contact you by electronic and paper mail.  If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source.  For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code.  There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.  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 AGPL, see <https://www.gnu.org/licenses/>.


pkgId: c0be903c85728c347c59309c113dd08970e8f95cf2bf5bd36ce2999f924b4f34
name: python-WinGrab-help
arch: noarch
version: 0.0.2
epoch: 0
release: 1
summary: Development documents and examples for WinGrab
url: https://github.com/JezaChen/WinGrab
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-WinGrab-0.0.2-1.src.rpm
location_href: Packages/python-WinGrab-help-0.0.2-1.noarch.rpm
checksum_type: sha256
description:
  A simple tool to get the PID of the window under the mouse cursor, implemented in **Python**.

  `wingrab` is implemented in the Python language, supports running directly and integrating into Python code,
  and currently only supports Windows.




  ```bash
  pip install wingrab
  ```



  Download the [wingrab.py](wingrab%2Fwingrab.py) and [cursor.cur](wingrab%2Fcursor.cur) files and place them in your project directory,
  ensuring the `cursor.cur` file is in the same location as `wingrab.py`.





  **Ensure the `wingrab` package is installed via pip**, You can then run it directly in the CLI using:

  ```bash
  py-wingrab
  ```

  or

  ```bash
  py-wingrab grab
  ```

  You can run it together with some powershell commands like `Get-Process`:

  ```bash
  Get-Process -Id $(py-wingrab)
  ```

  If `wingrab` crashes, and the mouse cursor has changed to a cross,
  run the `cleanup` command to try to restore the mouse cursor.

  ```bash
  py-wingrab cleanup
  ```



  It is very simple to integrate `wingrab` into your Python code,
  you just need to call the `grab` function in the `wingrab` package.

  ```python
  from wingrab import wingrab

  pid = wingrab.grab()
  ```

  The `grab` function returns the PID of the window under the cursor as an integer.

  Note that the `grab` will block the current thread until the user clicks the left mouse button,
  so if you want to use it in a GUI application,
  you had better call the `grab` function in a sub thread. (See examples below)

  **Note: `wingrab` can be used in both the main thread and the sub threads,
  but if you want to use it in a sub thread, make sure to call `wingrab.grab()` in the main thread first.**

  To restore the global mouse cursor to the default when `wingrab` crashes, invoke the `cleanup` function.

  ```python
  from wingrab import wingrab

  wingrab.cleanup()
  ```



  `examples` directory contains several examples which demonstrate usage and integration methods.
  You can run them directly after installing the package:

  - [pyqt5_example.py](examples%2Fpyqt5_example.py): An example of using `wingrab` in the main thread of a PyQt5 application.
  - [pyqt5_example_run_in_sub_thread.py](examples%2Fpyqt5_example_run_in_sub_thread.py): An example of using `wingrab` in the sub thread of a PyQt5 application.
  - [tkinter_example.py](examples%2Ftkinter_example.py): An example of using `wingrab` in a Tkinter application.
  - [run_in_sub_thread.py](examples%2Frun_in_sub_thread.py): An example of using `wingrab` in a sub thread of a console application.


pkgId: ee59d9cefd7d97477ec5ef22cb2d9d8ca6c771afe04038b203607df54ae88b8c
name: python-Z0Z-tools-help
arch: noarch
version: 0.6.5
epoch: 0
release: 1
summary: Development documents and examples for Z0Z-tools
url: https://pypi.org/project/Z0Z-tools/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-Z0Z-tools-0.6.5-1.src.rpm
location_href: Packages/python-Z0Z-tools-help-0.6.5-1.noarch.rpm
checksum_type: sha256
description:
  A collection of tools to solve common Python development frustrations. "Z0Z_" indicates these are prototype solutions - they work, but might not be pretty.



  Add `oopsieKwargsie()` to your function: it intelligently converts string parameters to their proper boolean or None types.



  Add a flexible parameter to your function, and use `defineConcurrencyLimit()` to give users more control over concurrent processing by using intuitive ratios or counts:

  - Use fractions (0.75 = 75% of CPUs)
  - Specify exact counts (8 = use 8 CPUs)
  - Use negative values (-2 = total CPUs minus 2)



  `intInnit()` rigorously validates and converts input lists to integers:

  - Converts valid numeric types to integers
  - Rejects non-whole numbers
  - Provides clear error messages
  - Perfect for validating user inputs



  Use the pre-built test suites in `pytest_parseParameters.py` to quickly test your implementations:

  ```python
  from Z0Z_tools.pytest_parseParameters import makeTestSuiteOopsieKwargsie

  def test_a_function_with_bool():
      smurfSuite = makeTestSuiteOopsieKwargsie(mySmurfyFunction)
      for smurfName, smurfFunction in smurfSuite.items():
          smurfFunction()
  ```



  Extract and standardize values from complex data structures with `stringItUp()`:

  - Recursively unpack nested structures
  - Convert all elements to strings
  - Handle arbitrary iterables and custom objects



  `updateExtendPolishDictionaryLists()` can combine and clean dictionary data with optional:

  - Duplicate removal
  - List sorting
  - Error handling for incompatible data



  Load audio, `readAudioFile()`, and save WAV files, `writeWav()`, without the complexity:

  - Automatic stereo conversion
  - Sample rate control
  - Multi-file batch processing, too: `loadWaveforms()`



  If you have a Python package that doesn't have an installation file, `pipAnything()` creates a temporary setup environment to help `pip` install the unpackaged code.

  ```sh
  python -m Z0Z_tools.pipAnything <pathPackage>
  ```



  Convert between paths easily with `findRelativePath()`:

  - Works with files or directories
  - Handles paths on different branches
  - Supports both string and Path-like inputs
  - Returns platform-independent paths



  ```sh
  pip install Z0Z-tools
  ```


pkgId: 1cc1c0e181403bbd86d25356c67a022de499a7b7959b1dcbf43d556ad6287a65
name: python-a7p-help
arch: noarch
version: 0.0.11.post1
epoch: 0
release: 1
summary: Development documents and examples for a7p
url: https://github.com/o-murphy/a7p
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-a7p-0.0.11.post1-1.src.rpm
location_href: Packages/python-a7p-help-0.0.11.post1-1.noarch.rpm
checksum_type: sha256
description:
  - [Description](#description)
  - [Instalation](#instalation)
  - [Usage](#usage)
  - [Gallery](#gallery)



  Simple python3 wrapper for .a7p files \




  ```bash
  pipx install a7p
  ```


  ```bash
  pip install a7p
  ```


  ```bash
  git clone https://github.com/o-murphy/a7p
  cd a7p_transfer_example/a7p_py
  python setup.py install
  ```

  This command builds the Docker image and tags it as `go-server`.




  ```bash
  a7p -h
  usage: a7p 0.0.10 [-h] [-V] [-r] [-v] [--verbose] path

  positional arguments:
    path             Path to the directory or file

  options:
    -h, --help       show this help message and exit
    -V, --version    show program's version number and exit
    -r, --recursive  Recursively walk files
    -v, --validate   Validate files
    --verbose        Verbose

  ```



  ```python
  import logging
  from a7p import A7PFile, A7PDataError
  from a7p.factory import A7PFactory


  with open('data/test.a7p', 'rb') as fp:

      
      try:
          profile_opj = A7PFile.load(fp)
      except A7PDataError as exc:  # raises if md5 crc not match
          logging.error(exc)


  profile_name = profile_opj.profile.profile_name


  as_json = A7PFile.to_json(profile_opj)
  as_dict = A7PFile.to_dict(profile_opj)
  from_json = A7PFile.from_json(profile_opj)
  from_dict = A7PFile.from_dict(profile_opj)


  with open('data/test.a7p', 'rb') as fp:
      A7PFile.dump(profile_opj, fp)



  payload = A7PFactory(
      meta=A7PFactory.Meta(
          name="test profile name",
      ),
      bullet=A7PFactory.Bullet(
          weight=175,
          length=0.9
      ),
      distances=A7PFactory.DistanceTable.LONG_RANGE
  )
  with open('data/test.a7p', 'wb') as fp:
      A7PFile.dump(payload, fp)
  ```


  Latest updates available at **[JsDelivr CDN](https://cdn.jsdelivr.net/gh/o-murphy/a7p/gallery/)**

rpm_license:
  GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007  Copyright (C) 2007 Free Software Foundation, Inc. <https://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.  <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year>  <name of author>  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 <https://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:  <program>  Copyright (C) <year>  <name of author> 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 <https://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 <https://www.gnu.org/licenses/why-not-lgpl.html>.


pkgId: 630de0b9eb40654dde5c4a3223d231506c4c5e5a62806549b62bc0ad39ba7c3f
name: python-a9x-webstatistics-help
arch: noarch
version: 1.2.3
epoch: 0
release: 1
summary: Development documents and examples for a9x-webstatistics
url: https://github.com/ava007/a9x-webstatistics
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-a9x-webstatistics-1.2.3-1.src.rpm
location_href: Packages/python-a9x-webstatistics-help-1.2.3-1.noarch.rpm
checksum_type: sha256
description:
  This package produces web statistics and analytical output based on nginx access log files.

  [![PyPI package](https://img.shields.io/badge/pip%20install-a9x_webstatistics-brightgreen)](https://pypi.org/project/a9x-webstatistics/) [![version number](https://img.shields.io/pypi/v/a9x_webstatistics?color=green&label=version)](https://github.com/ava007/a9x-webstatistics/releases) [![Actions Status](https://github.com/ava007/a9x-webstatistics/workflows/Test/badge.svg)](https://github.com/ava007/a9x-webstatistics/actions) [![License](https://img.shields.io/badge/license-own-blue)](https://github.com/ava007/a9x-webstatistics/blob/main/LICENSE)

  [![Downloads](https://img.shields.io/pypi/dm/a9x-webstatistics)](https://pypistats.org/packages/a9x-webstatistics)
  [![Python](https://img.shields.io/pypi/pyversions/a9x-webstatistics)](https://pypi.org/project/a9x-webstatistics)



  Visit the live example on [logikfabrik.com](https://www.logikfabrik.com/webstatsLF24.html).

  <img src="https://github.com/ava007/a9x-webstatistics/blob/main/a9x-webstatistics_20241123.png">



  ```bash
  pip install a9x-webstatistics
  ```



  - nginx standard access log file
  - python3.9 onwards
  - optional: maxmind db which need to be download by end user after registration




  ```bash


  export LOG=/usr/local/www/webstats.log
  export PATH=/usr/local/www/django5/envpy311/bin:$PATH

  python3.11 -m a9x_webstatistics.main \
     --infile /var/log/nginx-access.log \
     --geoip /usr/local/share/GeoIP/GeoLite2-Country.mmdb \
     --domain https://www.logikfabrik.com \
     --statfile /usr/local/www/lf_static/webstatsLF24.json &> $LOG

  python3.11 -m a9x_webstatistics.gencockpit \
     --infile /usr/local/www/lf_static/webstatsLF24.json \
     --outfile /usr/local/www/lf_static/webstatsLF24.html &>> $LOG
  ```

  Cron-Job Entry for Linux / FreeBSD:
  ```bash

  13,58   *       *       *       *       dj1     /usr/local/www/cronjobs/cron_webstatistics.sh

  ```




  ```bash



  python -m venv c:\temp\webstatsenv


  c:\temp\webstatsenv\Scripts\activate.bat


  pip install a9x-webstatistics
  python -m pip install --upgrade pip
  python -m pip list
  ```



  ```bash

  c:
  cd \temp
  wget -URI https://www.logikfabrik.com/wlog/access.log -OutFile access.log


  c:\temp\webstatsenv\Scripts\activate.bat



  python -m a9x_webstatistics.main --infile access.log --statfile webstatsLF.json


  python -m a9x_webstatistics.gencockpit --infile webstatsLF.json --outfile webstatsLF.html
  ```



  ```bash


  export LOG=/usr/local/www/webstats.log
  export PATH=/usr/local/www/django5/envpy311/bin:$PATH

  _YEARNUM="$(date +'%Y')";
  _MONTHNUM="$(date +'%m')";


  cp /usr/local/www/lf_static/webstatsLF24.json /usr/local/www/lf_static/webstatsLF24$_YEARNUM$_MONTHNUM.json
  cp /usr/local/www/lf_static/webstatsLF24.html /usr/local/www/lf_static/webstatsLF24$_YEARNUM$_MONTHNUM.html


  pip install -U `pip list --outdated | awk 'NR > 2 {print $1}'` >> $LOG


  python3.11 -m a9x_webstatistics.main \
     --infile /var/log/nginx-access.log \
     --geoip /usr/local/share/GeoIP/GeoLite2-Country.mmdb \
     --domain https://www.logikfabrik.com \
     --statfile /usr/local/www/lf_static/webstatsLF24.json &> $LOG

  python3.11 -m a9x_webstatistics.gencockpit \
     --infile /usr/local/www/lf_static/webstatsLF24.json \
     --outfile /usr/local/www/lf_static/webstatsLF24.html &>> $LOG
  ```


pkgId: f6212bcfc3347d73777022569e2b2f02bd94658b1f513d3e7855e88f71b2a66f
name: python-aa-bulletin-board-help
arch: noarch
version: 2.2.5
epoch: 0
release: 1
summary: Development documents and examples for aa-bulletin-board
url: https://github.com/ppfeufer/aa-bulletin-board
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-bulletin-board-2.2.5-1.src.rpm
location_href: Packages/python-aa-bulletin-board-help-2.2.5-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-bulletin-board?label=release)](https://pypi.org/project/aa-bulletin-board/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-bulletin-board)](https://github.com/ppfeufer/aa-bulletin-board/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-bulletin-board)](https://pypi.org/project/aa-bulletin-board/)
  [![Django](https://img.shields.io/pypi/djversions/aa-bulletin-board?label=django)](https://pypi.org/project/aa-bulletin-board/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-bulletin-board/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-bulletin-board/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Automated Checks](https://github.com/ppfeufer/aa-bulletin-board/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-bulletin-board/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-bulletin-board/branch/master/graph/badge.svg?token=UCXABR42QC)](https://codecov.io/gh/ppfeufer/aa-bulletin-board)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-bulletin-board/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-forum/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  Simple bulletin board for [Alliance Auth](https://gitlab.com/allianceauth/allianceauth)

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Bulletin Board](#aa-bulletin-board)
    - [Before You Install This Module](#before-you-install-this-module)
    - [Installation](#installation)
      - [Step 1: Install the Package](#step-1-install-the-package)
      - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)
        - [Settings in `/home/allianceserver/myauth/myauth/settings/local.py`](#settings-in-homeallianceservermyauthmyauthsettingslocalpy)
        - [Settings in `/home/allianceserver/myauth/myauth/urls.py`](#settings-in-homeallianceservermyauthmyauthurlspy)
      - [Step 3: Configure Your Webserver](#step-3-configure-your-webserver)
        - [Apache](#apache)
        - [Nginx](#nginx)
      - [Step 4: Finalizing the Installation](#step-4-finalizing-the-installation)
      - [Step 5: Set Up Permissions](#step-5-set-up-permissions)
    - [Permissions](#permissions)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________

  ![AA Bulletin Board](https://raw.githubusercontent.com/ppfeufer/aa-bulletin-board/master/docs/images/presentation/aa-bulletin-board.jpg "AA Bulletin Board")



  This app needs quite some configuration done before working properly. You need to
  modify your Apache/Nginx configuration as well as the global URL config of Alliance
  Auth. So please only install if you know what you're doing/feel comfortable to make
  these kinds of changes. For your own sanity, and mine :-)



  > [!NOTE]
  >
  > **AA Bulletin Board >=2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.13.2`.

  **Important**: Please make sure you meet all preconditions before you proceed:

  - AA Bulletin Board is a plugin for Alliance Auth. If you don't have Alliance Auth
    running already, please install it first before proceeding. (see the official
    [AA installation guide](https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html)
    or details)
  - Aa Bulletin Board needs a couple of changes made to your Webserver and Alliance
    Auth configuration. So make sure you know how to do so. The steps needed will be
    described in this document, but you need to understand what will be changed.



  Make sure you're in the virtual environment (venv) of your Alliance Auth
  installation Then install the latest release directly from PyPi.

  ```shell
  pip install aa-bulletin-board
  ```





  This is fairly simple, configure your AA settings (`local.py`) as follows:

  ```python

  INSTALLED_APPS += [
      "django_ckeditor_5",  # https://github.com/hvlads/django-ckeditor-5
      "aa_bulletin_board",  # https://github.com/ppfeufer/aa-bulletin-board
  ]


  if "django_ckeditor_5" in INSTALLED_APPS:
      
      CKEDITOR_5_FILE_UPLOAD_PERMISSION = (
          "authenticated"  # Possible values: "staff", "authenticated", "any"
      )

      MEDIA_URL = "/media/uploads/"
      MEDIA_ROOT = "/var/www/myauth/media/uploads"

      customColorPalette = [
          {"color": "hsl(4, 90%, 58%)", "label": "Red"},
          {"color": "hsl(340, 82%, 52%)", "label": "Pink"},
          {"color": "hsl(291, 64%, 42%)", "label": "Purple"},
          {"color": "hsl(262, 52%, 47%)", "label": "Deep Purple"},
          {"color": "hsl(231, 48%, 48%)", "label": "Indigo"},
          {"color": "hsl(207, 90%, 54%)", "label": "Blue"},
      ]

      CKEDITOR_5_CONFIGS = {
          "default": {
              "toolbar": [
                  "heading",
                  "|",
                  "bold",
                  "italic",
                  "link",
                  "bulletedList",
                  "numberedList",
                  "blockQuote",
              ],
          },
          "extends": {
              "blockToolbar": [
                  "paragraph",
                  "heading1",
                  "heading2",
                  "heading3",
                  "|",
                  "bulletedList",
                  "numberedList",
                  "|",
                  "blockQuote",
              ],
              "toolbar": [
                  "heading",
                  "|",
                  "outdent",
                  "indent",
                  "|",
                  "bold",
                  "italic",
                  "link",
                  "underline",
                  "strikethrough",
                  "subscript",
                  "superscript",
                  "highlight",
                  "|",
                  "insertImage",
                  "mediaEmbed",
                  "|",
                  "bulletedList",
                  "numberedList",
                  "todoList",
                  "insertTable",
                  "|",
                  "blockQuote",
                  "codeBlock",
                  "|",
                  "fontSize",
                  "fontFamily",
                  "fontColor",
                  "fontBackgroundColor",
                  "removeFormat",
                  "|",
                  "sourceEditing",
              ],
              "image": {
                  "toolbar": [
                      "imageTextAlternative",
                      "|",
                      "imageStyle:alignLeft",
                      "imageStyle:alignRight",
                      "imageStyle:alignCenter",
                      "imageStyle:side",
                      "|",
                  ],
                  "styles": [
                      "full",
                      "side",
                      "alignLeft",
                      "alignRight",
                      "alignCenter",
                  ],
              },
              "table": {
                  "contentToolbar": [
                      "tableColumn",
                      "tableRow",
                      "mergeTableCells",
                      "tableProperties",
                      "tableCellProperties",
                  ],
                  "tableProperties": {
                      "borderColors": customColorPalette,
                      "backgroundColors": customColorPalette,
                  },
                  "tableCellProperties": {
                      "borderColors": customColorPalette,
                      "backgroundColors": customColorPalette,
                  },
              },
              "heading": {
                  "options": [
                      {
                          "model": "paragraph",
                          "title": "Paragraph",
                          "class": "ck-heading_paragraph",
                      },
                      {
                          "model": "heading1",
                          "view": "h1",
                          "title": "Heading 1",
                          "class": "ck-heading_heading1",
                      },
                      {
                          "model": "heading2",
                          "view": "h2",
                          "title": "Heading 2",
                          "class": "ck-heading_heading2",
                      },
                      {
                          "model": "heading3",
                          "view": "h3",
                          "title": "Heading 3",
                          "class": "ck-heading_heading3",
                      },
                  ]
              },
          },
          "list": {
              "properties": {
                  "styles": "true",
                  "startIndex": "true",
                  "reversed": "true",
              }
          },
      }
  ```



  Now let's move on to editing the global URL configuration of Alliance Auth. To do so,
  you need to open `/home/allianceserver/myauth/myauth/urls.py` and change the
  following block right before the `handler` definitions:

  ```python
  from django.apps import apps  # Only if not already imported earlier
  from django.conf import settings  # Only if not already imported earlier
  from django.conf.urls.static import static  # Only if not already imported earlier
  from django.urls import path  # Only if not already imported earlier


  if apps.is_installed("django_ckeditor_5"):
      
      urlpatterns = (
          [
              path("ckeditor5/", include("django_ckeditor_5.urls")),
          ]
          + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
          + urlpatterns
      )
  ```

  After this, your `urls.py` should look similar to this:

  ```python
  from django.apps import apps
  from django.conf import settings
  from django.conf.urls.static import static
  from django.urls import include, path, re_path

  from allianceauth import urls


  urlpatterns = [
      path(r"", include(urls)),
  ]


  if apps.is_installed("django_ckeditor_5"):
      
      urlpatterns = (
          [
              path("ckeditor5/", include("django_ckeditor_5.urls")),
          ]
          + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
          + urlpatterns
      )

  handler500 = "allianceauth.views.Generic500Redirect"
  handler404 = "allianceauth.views.Generic404Redirect"
  handler403 = "allianceauth.views.Generic403Redirect"
  handler400 = "allianceauth.views.Generic400Redirect"
  ```



  Your webserver needs to know from where to serve the uploaded images, of course, so we
  have to tell it.



  In your vhost configuration you have a line `ProxyPassMatch ^/static !`, which tells
  the server where to find all the static files. We're adding a similar line for the
  media, right below that one.

  Add the following right below the static proxy match:

  ```apache
  ProxyPassMatch ^/media !
  ```

  Now we also need to let the server know where to find the media directory we just
  configured the proxy for. To do so, add a new Alias to your configuration. This can
  be done right below the already existing Alias for `/static`:

  ```apache
  Alias "/media" "/var/www/myauth/media/"
  ```

  At last, a Directory rule is needed as well. Add the following code below to the
  already existing Directory rule for the static files:

  ```apache
  <Directory "/var/www/myauth/media/">
      Require all granted
  </Directory>
  ```

  So the whole block should now look like this:

  ```apache
  ProxyPassMatch ^/static !
  ProxyPassMatch ^/media !  # *** NEW proxy rule
  ProxyPass / http://127.0.0.1:8000/
  ProxyPassReverse / http://127.0.0.1:8000/
  ProxyPreserveHost On

  Alias "/static" "/var/www/myauth/static/"
  Alias "/media" "/var/www/myauth/media/"

  <Directory "/var/www/myauth/static/">
      Require all granted
  </Directory>

  <Directory "/var/www/myauth/media/">
      Require all granted
  </Directory>
  ```

  Restart your Apache webserver.



  In order to let Nginx know where to find the uploaded files, you need to add a new
  location rule to the configuration.

  ```nginx
  location /media {
      alias /var/www/myauth/media;
      autoindex off;
  }
  ```

  Restart your Nginx webserver.



  Run static files collection and migrations

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for Auth



  Now it's time to set up access permissions for your new module. You can do so in
  your admin backend. Read the [Permissions](#permissions) section for more information
  about the available permissions.



  | ID                 | Description                   | Notes                                                                           |
  | :----------------- | :---------------------------- | :------------------------------------------------------------------------------ |
  | `basic_access`     | Can access the Bulletin Board | Grants read access to the bulletin board                                        |
  | `manage_bulletins` | Can manage bulletins          | Grants the right to edit and delete existing bulletins and create new bulletins |



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-bulletin-board/blob/master/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-bulletin-board/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [contribution guidelines]: https://github.com/ppfeufer/aa-bulletin-board/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 331484343172f1b6988703ced4c77fa02b1a06acbcd18c829e8a7d6eddb0372d
name: python-aa-discord-announcements-help
arch: noarch
version: 2.2.2
epoch: 0
release: 1
summary: Development documents and examples for aa-discord-announcements
url: https://github.com/ppfeufer/aa-discord-announcements
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-discord-announcements-2.2.2-1.src.rpm
location_href: Packages/python-aa-discord-announcements-help-2.2.2-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-discord-announcements?label=release)](https://pypi.org/project/aa-discord-announcements/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-discord-announcements)](https://github.com/ppfeufer/aa-discord-announcements/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-discord-announcements)](https://pypi.org/project/aa-discord-announcements/)
  [![Django](https://img.shields.io/pypi/djversions/aa-discord-announcements?label=django)](https://pypi.org/project/aa-discord-announcements/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-discord-announcements/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-discord-announcements/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-discord-announcements/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-discord-announcements/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-discord-announcements/branch/master/graph/badge.svg?token=9I6HQB6W6J)](https://codecov.io/gh/ppfeufer/aa-discord-announcements)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-discord-announcements/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-discord-announcements/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  Discord Announcements via [Alliance Auth](https://gitlab.com/allianceauth/allianceauth)

  Write announcements and manage who can write announcements on your corporation or
  alliance Discord through Alliance Auth.

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Discord Announcements](#aa-discord-announcements)
    - [Installation](#installation)
      - [Step 1: Install the App](#step-1-install-the-app)
      - [Step 2: Update Your AA Settings](#step-2-update-your-aa-settings)
      - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
      - [Step 4: Setting up Permission](#step-4-setting-up-permission)
      - [Step 5: Setting up the App](#step-5-setting-up-the-app)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________



  > [!NOTE]
  >
  > **AA Discord Announcements >=2.0.0 needs at least Alliance Auth v4.0.0**.
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.4.2`.

  This app is a plugin for Alliance Auth. If you don't have Alliance Auth running already,
  please install it first before proceeding.
  (See the official [AA installation guide](https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html) for details)

  > [!NOTE]
  >
  > You also want to make sure that you have the
  > [Discord service](https://allianceauth.readthedocs.io/en/latest/features/services/discord.html)
  > installed, configured and activated before installing this app.



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation.
  Then install the latest version:

  ```shell
  pip install aa-discord-announcements
  ```



  Configure your AA settings (`local.py`) as follows:

  - Add `"aa_discord_announcements",` to `INSTALLED_APPS`



  Copy static files and run migrations

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for AA



  Now you can set up permissions in Alliance Auth for your users.
  Add `aa_discord_announcements | general | Can access this app` to the states and/or
  groups you would like to have access.



  In your admin backend you'll find a new section called `Discord Announcements`.
  This is where you set all your stuff up, like the webhooks you want to ping and who
  can ping them. It's pretty straight forward, so you shouldn't have any issues. Go nuts!



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-discord-announcements/blob/master/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-discord-announcements/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [contribution guidelines]: https://github.com/ppfeufer/aa-discord-announcements/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 2676e2328b32ab9ccb45862f311e371539d36e90d66615660a55dda65916db01
name: python-aa-esi-status-help
arch: noarch
version: 2.4.3
epoch: 0
release: 1
summary: Development documents and examples for aa-esi-status
url: https://github.com/ppfeufer/aa-esi-status
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-esi-status-2.4.3-1.src.rpm
location_href: Packages/python-aa-esi-status-help-2.4.3-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-esi-status?label=release)](https://pypi.org/project/aa-esi-status/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-esi-status)](https://github.com/ppfeufer/aa-esi-status/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-esi-status)](https://pypi.org/project/aa-esi-status/)
  [![Django](https://img.shields.io/pypi/djversions/aa-esi-status?label=django)](https://pypi.org/project/aa-esi-status/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-esi-status/main.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-esi-status/main)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-esi-status/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-esi-status/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-esi-status/branch/main/graph/badge.svg?token=1PCUZRGPBT)](https://codecov.io/gh/ppfeufer/aa-esi-status)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-esi-status/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-esi-status/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  App for Alliance Auth to show the current status of ESI and its end points.

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA ESI Status](#aa-esi-status)
    - [Screenshots](#screenshots)
      - [ESI Status Page](#esi-status-page)
      - [Dashboard Widget](#dashboard-widget)
    - [Installation](#installation)
      - [Step 1: Install the App](#step-1-install-the-app)
      - [Step 2: Update Your AA Settings](#step-2-update-your-aa-settings)
      - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
    - [(Optional) Public Views](#optional-public-views)
    - [Updating](#updating)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________





  ![AA ESI Status](https://raw.githubusercontent.com/ppfeufer/aa-esi-status/master/docs/images/aa-esi-status.jpg "AA ESI Status")



  This is how the dashboard widget looks like.
  It shows the current status of ESI for administrative users.

  ![AA ESI Status Dashboard Widget](https://raw.githubusercontent.com/ppfeufer/aa-esi-status/master/docs/images/dashboard-widget.jpg "AA ESI Status Dashboard Widget")



  > [!NOTE]
  >
  > **AA ESI Status >= 2.0.0 needs at least Alliance Auth v4!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version of AA ESI Status that supports Alliance Auth v3 is `1.14.2`.

  This app is a plugin for Alliance Auth. If you don't have Alliance Auth running
  already, please install it first before proceeding.
  (See the official [AA installation guide](https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html) for details)



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation.
  Then install the latest version:

  ```shell
  pip install aa-esi-status
  ```



  Configure your AA settings (`local.py`) as follows:

  - Add `"esistatus",` to `INSTALLED_APPS`



  Run migrations & copy static files.

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for AA.



  This app supports AA's feature of public views, since the ESI status is not any
  mission-critical information.
  To allow users to view the time zone conversion page without the need to log in,
  please add `"esistatus",` to the list of `APPS_WITH_PUBLIC_VIEWS` in your `local.py`:

  ```python




  APPS_WITH_PUBLIC_VIEWS = [
      "esistatus",  # https://github.com/ppfeufer/aa-esi-status/
  ]
  ```

  > **Note**
  >
  > If you don't have a list for `APPS_WITH_PUBLIC_VIEWS` yet, then add the whole
  > block from here. This feature has been added in Alliance Auth v3.6.0 so you
  > might not yet have this list in your `local.py`.



  To update your existing installation of AA ESI Status, first enable your virtual
  environment.

  Then run the following commands from your AA project directory (the one that
  contains `manage.py`).

  ```shell
  pip install -U aa-esi-status
  python manage.py collectstatic
  python manage.py migrate
  ```

  Now restart your AA supervisor services.



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-esi-status/blob/main/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-esi-status/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines](https://github.com/ppfeufer/aa-esi-status/blob/main/CONTRIBUTING.md).\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 3942bc28afac0b085b843706687be8870338c10676fbc96c478afa9a13968596
name: python-aa-fleetfinder-help
arch: noarch
version: 2.2.2
epoch: 0
release: 1
summary: Development documents and examples for aa-fleetfinder
url: https://github.com/ppfeufer/aa-fleetfinder
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-fleetfinder-2.2.2-1.src.rpm
location_href: Packages/python-aa-fleetfinder-help-2.2.2-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-fleetfinder?label=release)](https://pypi.org/project/aa-fleetfinder/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-fleetfinder)](https://github.com/ppfeufer/aa-fleetfinder/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-fleetfinder)](https://pypi.org/project/aa-fleetfinder/)
  [![Django](https://img.shields.io/pypi/djversions/aa-fleetfinder?label=django)](https://pypi.org/project/aa-fleetfinder/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-fleetfinder/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-fleetfinder/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-fleetfinder/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-fleetfinder/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-fleetfinder/branch/master/graph/badge.svg?token=GFOR9GWRNQ)](https://codecov.io/gh/ppfeufer/aa-fleetfinder)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-fleetfinder/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-fleetfinder/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  Control access to your fleets through Alliance Auth.

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Fleet Finder](#aa-fleet-finder)
    - [Installation](#installation)
      - [Step 1: Install the Package](#step-1-install-the-package)
      - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)
      - [Step 3: Add the Scheduled Task](#step-3-add-the-scheduled-task)
      - [Step 4: Finalizing the Installation](#step-4-finalizing-the-installation)
      - [Step 4: Setup Permissions](#step-4-setup-permissions)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________



  > [!NOTE]
  >
  > **AA Fleet Finder >= 2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.5.2`.



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation Then install the latest release directly from PyPi.

  ```shell
  pip install aa-fleetfinder
  ```



  This is fairly simple, just add the following to the `INSTALLED_APPS` of your `local.py`

  Configure your AA settings (`local.py`) as follows:

  - Add `"fleetfinder",` to `INSTALLED_APPS`



  To set up the scheduled task, add the following code to your `local.py`:

  ```python

  if "fleetfinder" in INSTALLED_APPS:
      CELERYBEAT_SCHEDULE["fleetfinder_check_fleet_adverts"] = {
          "task": "fleetfinder.tasks.check_fleet_adverts",
          "schedule": crontab(minute="*/1"),
      }
  ```



  Run static files collection and migrations

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```



  Now it's time to set up access permissions for your new Fleetfinder module.

  | ID                   | Description                       | Notes                                                                                                       |
  | :------------------- | :-------------------------------- | :---------------------------------------------------------------------------------------------------------- |
  | `access_fleetfinder` | Can access the Fleetfinder module | Your line members should have this permission, together with everyone you want to have access to he module. |
  | `manage_fleets`      | Can manage fleets                 | Everyone with this permission can open and edit fleets                                                      |



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-fleetfinder/blob/master/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-fleetfinder/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  You want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines](https://github.com/ppfeufer/aa-fleetfinder/blob/master/CONTRIBUTING.md).\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 0900a2fb061e181ae65aee534d383a7dca4982e596764f99d956af7f4459de58
name: python-aa-fleetpings-help
arch: noarch
version: 3.4.3
epoch: 0
release: 1
summary: Development documents and examples for aa-fleetpings
url: https://github.com/ppfeufer/aa-fleetpings
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-fleetpings-3.4.3-1.src.rpm
location_href: Packages/python-aa-fleetpings-help-3.4.3-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-fleetpings?label=release)](https://pypi.org/project/aa-fleetpings/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-fleetpings)](https://github.com/ppfeufer/aa-fleetpings/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-fleetpings)](https://pypi.org/project/aa-fleetpings/)
  [![Django](https://img.shields.io/pypi/djversions/aa-fleetpings?label=django)](https://pypi.org/project/aa-fleetpings/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-fleetpings/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-fleetpings/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-fleetpings/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-fleetpings/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-fleetpings/branch/master/graph/badge.svg?token=9I6HQB6W6J)](https://codecov.io/gh/ppfeufer/aa-fleetpings)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-fleetpings/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-fleetpings/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  App for Alliance Auth that can format your fleet pings and also ping for you to
  Discord.

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Fleet Pings](#aa-fleet-pings)
    - [Installation](#installation)
      - [Step 1: Install the App](#step-1-install-the-app)
      - [Step 2: Update Your AA Settings](#step-2-update-your-aa-settings)
      - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
      - [Step 4: Setting up Permission](#step-4-setting-up-permission)
      - [Step 5: Setting up the App](#step-5-setting-up-the-app)
    - [Updating](#updating)
    - [Screenshots](#screenshots)
      - [View in Alliance Auth](#view-in-alliance-auth)
      - [Discord Ping Example](#discord-ping-example)
    - [Configuration](#configuration)
      - [Use Default Fleet Types](#use-default-fleet-types)
      - [Use Default Ping Targets](#use-default-ping-targets)
      - [Use Doctrines From Fittings Module](#use-doctrines-from-fittings-module)
      - [Webhook Verification](#webhook-verification)
      - [Default Embed Color](#default-embed-color)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________



  > [!NOTE]
  >
  > **AA Fleet Pings >= 3.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version of AA Fleet Pings that supports Alliance Auth v3 is `2.26.3`.

  This app is a plugin for Alliance Auth. If you don't have Alliance Auth running already,
  please install it first before proceeding. (See the official [AA installation guide]
  for details)

  > [!NOTE]
  >
  > You also want to make sure that you have the
  > [Discord service](https://allianceauth.readthedocs.io/en/latest/features/services/discord.html)
  > installed, configured and activated before installing this app.



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation.
  Then install the latest version:

  ```bash
  pip install aa-fleetpings
  ```



  Configure your AA settings (`local.py`) as follows:

  - Add `'fleetpings',` to `INSTALLED_APPS`



  Copy static files and run migrations

  ```bash
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for AA



  Now you can set up permissions in Alliance Auth for your users.
  Add `fleetpings | aa fleetpings | Can access this app` to the states and/or
  groups you would like to have access.



  In your admin backend you'll find a new section called `Fleet Pings`.
  This is where you set all your stuff up, like the webhooks you want to ping and who
  can ping them, fleet types, comms, formup locations, and so on. It's pretty straight
  forward, so you shouldn't have any issues. Go nuts!



  To update your existing installation of AA Discord Ping Formatter, first enable your
  virtual environment.

  Then run the following commands from your AA project directory (the one that
  contains `manage.py`).

  ```bash
  pip install -U aa-fleetpings

  python manage.py collectstatic
  python manage.py migrate
  ```

  Finally, restart your AA supervisor services.





  ![View in Alliance Auth](https://raw.githubusercontent.com/ppfeufer/aa-fleetpings/master/docs/images/aa-view.jpg "View in Alliance Auth")



  ![Discord Ping Example](https://raw.githubusercontent.com/ppfeufer/aa-fleetpings/master/docs/images/discord-ping.jpg "Discord Ping Example")



  The following settings are available in the Django Admin Backend under
  `/admin/fleetpings/setting/`:



  Enable or disable the default fleet types (Roaming, Home Defense, StratOP, and CTA)
  that are shown in the fleet type dropdown in addition to your own.

  **Default:** True



  Enable or disable the default ping targets (@everyone and @here) that are shown in
  the ping target dropdown in addition to your own.

  **Default:** True



  If you have the [Fittings and Doctrines] module installed, and your doctrines
  configured there, you don't have to re-build your doctrine list for this module. You
  can simply use the doctrines you already have configured in the Fittings and
  Doctrines module.

  **Default:** True



  If you require your pings to be sent to a webhook, that is not a standard discord
  webhook.

  When disabling webhook verification and using non-Discord webhooks, it is up to you
  to make sure your webhook understands a payload that is formatted for Discord webhooks.

  **Default:** True



  The default highlight for the embed, that is used when no other highlight color is
  defined.

  **Default:** #FAA61A



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-fleetpings/blob/master/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-fleetpings/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  You want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines](https://github.com/ppfeufer/aa-fleetpings/blob/master/CONTRIBUTING.md).\
  (I promise, it's not much, just some basics)

  <!-- URLs -->

  [aa installation guide]: https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html "AA installation guide"
  [fittings and doctrines]: https://gitlab.com/colcrunch/fittings "Fittings and Doctrines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 2b6fba7b17369cdcd1356faa55d1e963b5b49b3301a556501c95bafe7e26b68e
name: python-aa-intel-tool-help
arch: noarch
version: 2.5.2
epoch: 0
release: 1
summary: Development documents and examples for aa-intel-tool
url: https://github.com/ppfeufer/aa-intel-tool
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-intel-tool-2.5.2-1.src.rpm
location_href: Packages/python-aa-intel-tool-help-2.5.2-1.noarch.rpm
checksum_type: sha256
description:
  [![Badge: Version]][aa intel tool on pypi]
  [![Badge: License]][aa intel tool license]
  [![Badge: Supported Python Versions]][aa intel tool on pypi]
  [![Badge: Supported Django Versions]][aa intel tool on pypi]
  ![Badge: pre-commit]
  [![Badge: pre-commit.ci status]][pre-commit.ci status]
  [![Badge: Code Style: black]][black code formatter documentation]
  [![Badge: Support Discord]][support discord]
  [![Badge: Automated Tests]][automated tests on github]
  [![Badge: Code Coverage]][aa intel tool on codecov]
  [![Badge: Translation Status]][weblate engage]
  [![Badge: Contributor Covenant]][code of conduct]

  [![Badge: Buy me a coffee]][ppfeufer on ko-fi]

  D-Scans and more in [Alliance Auth].

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->

  - [Overview](#overview)
    - [Features](#features)
    - [Screenshots](#screenshots)
      - [Chat Scan](#chat-scan)
      - [D-Scan](#d-scan)
      - [Fleet Composition](#fleet-composition)
  - [Installation](#installation)
    - [Step 1: Install the Package](#step-1-install-the-package)
    - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)
      - [Add the App to Alliance Auth](#add-the-app-to-alliance-auth)
      - [Add the Scheduled Task](#add-the-scheduled-task)
      - [(Optional) Allow Public Views](#optional-allow-public-views)
    - [Step 4: Preload Eve Universe Data](#step-4-preload-eve-universe-data)
    - [Step 5: Finalizing the Installation](#step-5-finalizing-the-installation)
    - [Step 6: Update Your Webserver Configuration](#step-6-update-your-webserver-configuration)
      - [Apache 2](#apache-2)
      - [Nginx](#nginx)
  - [Settings](#settings)
  - [Changelog](#changelog)
  - [Translation Status](#translation-status)
  - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________





  The following modules can be enabled or disabled.
  See [Settings](#settings) section for details.

  - Chat scan module (Disabled by default due to its possible high number of ESI calls)
  - D-Scan module





  ![Image: Chat Scan Module]



  ![Image: D-Scan Module]



  ![Image: Fleet Composition Module]



  > [!NOTE]
  >
  > **AA Intel Tool >= 2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.2.0`.

  **Important**: Please make sure you meet all preconditions before you proceed:

  - AA Intel Tool is a plugin for [Alliance Auth]. If you don't have Alliance Auth running
    already, please install it first before proceeding. (see the official
    [Alliance Auth installation guide] for details)
  - AA Intel Tool needs [Eve Universe] to function. Please make sure it is installed,
    before continuing.



  Make sure you're in the virtual environment (venv) of your Alliance Auth
  installation Then install the latest release directly from PyPi.

  ```shell
  pip install aa-intel-tool
  ```





  This is fairly simple, configure your AA settings (`local.py`) as follows:

  Add `eveuniverse` (if not already done so for a different app) and `aa_intel_tool` to
  the list of `INSTALLED_APPS`.

  ```python

  INSTALLED_APPS += [
      "eveuniverse",
      "aa_intel_tool",  # https://github.com/ppfeufer/aa-intel-tool
  ]
  ```



  To remove old scans from your DB, add the following task.
  The retention time can be adjusted through the `INTELTOOL_SCAN_RETENTION_TIME` setting.

  ```python
  if "aa_intel_tool" in INSTALLED_APPS:
      
      CELERYBEAT_SCHEDULE["AA Intel Tool :: Housekeeping"] = {
          "task": "aa_intel_tool.tasks.housekeeping",
          "schedule": crontab(minute="0", hour="1"),
      }
  ```



  This app supports AA's feature of public views. To allow this feature, please add
  `"aa_intel_tool",` to the list of `APPS_WITH_PUBLIC_VIEWS` in your `local.py`:

  ```python




  APPS_WITH_PUBLIC_VIEWS = [
      "aa_intel_tool",  # https://github.com/ppfeufer/aa-intel-tool
  ]
  ```

  > **Note**
  >
  > If you don't have a list for `APPS_WITH_PUBLIC_VIEWS` yet, then add the whole
  > block from here. This feature has been added in Alliance Auth v3.6.0 so you
  > might not yet have this list in your `local.py`.



  AA Intel Tool utilizes the EveUniverse module, so it doesn't need to ask ESI for ship
  information. To set this up, you now need to run the following command.

  ```shell
  python manage.py aa_intel_tool_load_eve_types
  ```



  Run static files collection and migrations.

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for Auth.



  By default, webservers have a timout of about 30 seconds for requests. So we have to
  tweak that a little bit, since parsing intel data can take a while, and we don't want
  the webserver to spoil our fun, right?



  Open your vhost configuration and add the following 2 lines right after the
  `ProxyPreserveHost On` directive:

  ```apache
  ProxyTimeout 600
  Timeout      600
  ```

  Restart your Apache2 service.



  Open your vhost configuration and add the following lines inside the `location / {`
  directive:

  ```nginx
  proxy_connect_timeout 600;
  proxy_read_timeout    600;
  proxy_send_timeout    600;
  send_timeout          600;
  ```

  Restart your Nginx service.



  To customize the app, the following settings are available and can be made in
  your `local.py`.

  > **Warning**
  >
  > Enable the chat scan module at your own risk. This module has the potential to
  > generate a huge number of ESI calls, which CCP might not be too happy about.

  | Name                              | Description                                                                                                                             | Default |
  | :-------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :------ |
  | INTELTOOL_ENABLE_MODULE_CHATSCAN  | Enable or disable the chat scan module.                                                                                                 | False   |
  | INTELTOOL_ENABLE_MODULE_DSCAN     | Enable or disable the d-scan module.                                                                                                    | True    |
  | INTELTOOL_ENABLE_MODULE_FLEETCOMP | Enable or disable the fleet composition module.                                                                                         | True    |
  | INTELTOOL_SCAN_RETENTION_TIME     | Set the time in days for how long the scans will be kept in the database. Set to 0 to keep scans indefinitely.                          | 30      |
  | INTELTOOL_CHATSCAN_MAX_PILOTS     | Set the limit of pilots for chat scans, since these can take quite a long time to process. Set to 0 to disable.                         | 500     |
  | INTELTOOL_DSCAN_GRID_SIZE         | Set the grid size for D-Scans.<br/>This defines the size of the grid in km in which ships and structures are considered to be "on grid" | 10000   |

  > **Note**
  >
  > **A word about the chat scan limitations:**
  >
  > It is advised to keep the `INTELTOOL_CHATSCAN_MAX_PILOTS` to a sane number. Large
  > chat scans can take quite some time to parse and from a certain number of pilots, the
  > bottleneck might be your browser refusing to render the results page.
  > (Source: Trust me, bro …)



  See [CHANGELOG.md]



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-intel-tool/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Inline Links -->

  [aa intel tool license]: https://github.com/ppfeufer/aa-intel-tool/blob/master/LICENSE
  [aa intel tool on codecov]: https://codecov.io/gh/ppfeufer/aa-intel-tool
  [aa intel tool on pypi]: https://pypi.org/project/aa-intel-tool/
  [alliance auth]: https://gitlab.com/allianceauth/allianceauth "Alliance Auth on GitLab"
  [alliance auth installation guide]: https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html
  [automated tests on github]: https://github.com/ppfeufer/aa-intel-tool/actions/workflows/automated-checks.yml
  [badge: automated tests]: https://github.com/ppfeufer/aa-intel-tool/actions/workflows/automated-checks.yml/badge.svg "Automated Tests"
  [badge: buy me a coffee]: https://ko-fi.com/img/githubbutton_sm.svg "Buy Me a Coffee!"
  [badge: code coverage]: https://codecov.io/gh/ppfeufer/aa-intel-tool/branch/master/graph/badge.svg "Code Coverage"
  [badge: code style: black]: https://img.shields.io/badge/code%20style-black-000000.svg "Code Style: black"
  [badge: contributor covenant]: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg "Contributor Covenant"
  [badge: license]: https://img.shields.io/github/license/ppfeufer/aa-intel-tool "License"
  [badge: pre-commit]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white "pre-commit"
  [badge: pre-commit.ci status]: https://results.pre-commit.ci/badge/github/ppfeufer/aa-intel-tool/master.svg "pre-commit.ci status"
  [badge: support discord]: https://img.shields.io/discord/790364535294132234?label=discord "Support Discord"
  [badge: supported django versions]: https://img.shields.io/pypi/djversions/aa-intel-tool?label=django "Supported Django Versions"
  [badge: supported python versions]: https://img.shields.io/pypi/pyversions/aa-intel-tool "Supported Python Versions"
  [badge: translation status]: https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-intel-tool/svg-badge.svg "Translation Status"
  [badge: version]: https://img.shields.io/pypi/v/aa-intel-tool?label=release "Version"
  [black code formatter documentation]: http://black.readthedocs.io/en/latest/
  [changelog.md]: https://github.com/ppfeufer/aa-intel-tool/blob/master/CHANGELOG.md
  [code of conduct]: https://github.com/ppfeufer/aa-intel-tool/blob/master/CODE_OF_CONDUCT.md
  [contribution guidelines]: https://github.com/ppfeufer/aa-intel-tool/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [eve universe]: https://gitlab.com/ErikKalkoken/django-eveuniverse "Eve Universe"
  [image: chat scan module]: https://raw.githubusercontent.com/ppfeufer/aa-intel-tool/master/docs/images/representation/chat-scan.jpg "Chat Scan Module"
  [image: d-scan module]: https://raw.githubusercontent.com/ppfeufer/aa-intel-tool/master/docs/images/representation/d-scan.jpg "D-Scan Module"
  [image: fleet composition module]: https://raw.githubusercontent.com/ppfeufer/aa-intel-tool/master/docs/images/representation/fleet-composition.jpg "Fleet Composition Module"
  [ppfeufer on ko-fi]: https://ko-fi.com/ppfeufer "Buy Me a Coffee!"
  [pre-commit.ci status]: https://results.pre-commit.ci/latest/github/ppfeufer/aa-intel-tool/master "pre-commit.ci"
  [support discord]: https://discord.gg/zmh52wnfvM "Alliance Auth Community Apps Support Discord"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 4080ea801e73727f023983238b08f9a008f488fe1b57a77f2a8b6245c79d61cc
name: python-aa-ma-securegroups-help
arch: noarch
version: 1.3.1
epoch: 0
release: 1
summary: Development documents and examples for aa-ma-securegroups
url: https://github.com/ppfeufer/aa-ma-securegroups
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-ma-securegroups-1.3.1-1.src.rpm
location_href: Packages/python-aa-ma-securegroups-help-1.3.1-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-ma-securegroups?label=release)](https://pypi.org/project/aa-ma-securegroups/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-ma-securegroups)](https://github.com/ppfeufer/aa-ma-securegroups/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-ma-securegroups)](https://pypi.org/project/aa-ma-securegroups/)
  [![Django](https://img.shields.io/pypi/djversions/aa-ma-securegroups?label=django)](https://pypi.org/project/aa-ma-securegroups/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-ma-securegroups/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-ma-securegroups/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-ma-securegroups/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-ma-securegroups/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-ma-securegroups/branch/master/graph/badge.svg)](https://codecov.io/gh/ppfeufer/aa-ma-securegroups)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-member-audit-secure-groups/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-ma-securegroups/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  This is an integration between [Member Audit](https://gitlab.com/ErikKalkoken/aa-memberaudit) and [Secure Groups](https://github.com/pvyParts/allianceauth-secure-groups) for [Alliance Auth](https://gitlab.com/allianceauth/allianceauth) (AA).

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=gitlab --maxlevel=6 --minlevel=1 -->

  - [Member Audit Secure Groups Integration for Alliance Auth](#member-audit-secure-groups-integration-for-alliance-auth)
    - [What's the difference to Member Audit Securegroups](#whats-the-difference-to-member-audit-securegroups)
    - [Features](#features)
    - [Installation](#installation)
      - [Requirements](#requirements)
      - [Step 0.5: Migrating from Member Audit Securegroups](#step-05-migrating-from-member-audit-securegroups)
      - [Step 1: Install the Package](#step-1-install-the-package)
      - [Step 2: Config](#step-2-config)
      - [Step 3: Finalize App Installation](#step-3-finalize-app-installation)
    - [Filters](#filters)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________



  Pretty much nothing.

  I took over Member Audit Securegroups in August 2022 from the original developer who
  is no longer actively maintaining the app. After more than a year and the fact that
  I have a distinct dislike for Gitlab, and the original developer didn't want to transfer
  the PyPi repository to me, I decided it is time to make an actual fork of the app
  which is now again actively maintained by me.

  This app is fully compatible with the original, all that has changed is the `pip`
  name from `aa-memberaudit-securegroups` to `aa-ma-securegroups`, and if
  you had the original app installed, it is really easy to switch to this one, see
  [Step 0.5: Migrating from Member Audit Securegroups](#step-05-migrating-from-member-audit-securegroups).

  Thanks to [@rcmurphy](https://github.com/rcmurphy) for all her work on the [original
  app](https://gitlab.com/eclipse-expeditions/aa-memberaudit-securegroups)!



  - Activity Filter
  - Asset Filter
  - Character Age Filter
  - Compliance Filter
  - Corporation Role Filter
  - Corporation Title Filter
  - Skill Set Filter
  - Skill Point Filter
  - Time in Corporation Filter



  > [!NOTE]
  >
  > **Member Audit Secure Groups Integration >= 1.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `0.6.1`.



  This integration needs [Member Audit](https://gitlab.com/ErikKalkoken/aa-memberaudit)
  and [Secure Groups](https://github.com/pvyParts/allianceauth-secure-groups) to
  function. Please make sure they are installed before continuing.



  In case you have the original app installed, you need to uninstall it before
  you can continue. To do so, simply run:

  ```shell
  pip uninstall aa-memberaudit-securegroups
  ```

  That's all, no need to worry about the DB related stuff, this app is fully
  compatible with it and will use the DB tables from the original app. Now feel free
  to continue with the installation.



  Make sure you are in the virtual environment (venv) of your Alliance Auth
  installation. Then install the newest release from PyPI:

  ```shell
  pip install aa-ma-securegroups
  ```



  Add `memberaudit_securegroups` to your `INSTALLED_APPS`.



  Run migrations:

  ```shell
  python manage.py migrate
  ```

  Restart your supervisor services for Auth



  | Filter Name             | Matches if...                                                                  |
  | ----------------------- | ------------------------------------------------------------------------------ |
  | Activity Filter         | User has *at least one* character active within the last X days                |
  | Age Filter              | User has *at least one* character over X days old                              |
  | Asset Filter            | User has *at least one* character with *any of* the assets defined             |
  | Compliance Filter       | User has *all* characters registered on Member Audit                           |
  | Corporation Role Filter | User has a character (main or alt) in a certain corpration with a certain role |
  | Skill Point Filter      | User has *at least one* character with at least X skill points                 |
  | Skill Set Filter        | User has *at least one* character with *any of* the selected skill sets        |



  See [CHANGELOG.md]



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-member-audit-secure-groups/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Inline links -->

  [changelog.md]: https://github.com/ppfeufer/aa-ma-securegroups/blob/master/CHANGELOG.md
  [contribution guidelines]: https://github.com/ppfeufer/aa-ma-securegroups/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 030d7e20843dfb2d90938075a50d6a889e3763e4f40af10417e796baf1b87f41
name: python-aa-sov-timer-help
arch: noarch
version: 2.2.2
epoch: 0
release: 1
summary: Development documents and examples for aa-sov-timer
url: https://github.com/ppfeufer/aa-sov-timer
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-sov-timer-2.2.2-1.src.rpm
location_href: Packages/python-aa-sov-timer-help-2.2.2-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-sov-timer?label=release "Version")](https://pypi.org/project/aa-sov-timer/)
  [![License](https://img.shields.io/badge/license-GPLv3-green "License")](https://pypi.org/project/aa-sov-timer/)
  [![Python](https://img.shields.io/pypi/pyversions/aa-sov-timer "Python")](https://pypi.org/project/aa-sov-timer/)
  [![Django](https://img.shields.io/pypi/djversions/aa-sov-timer?label=django "Django")](https://pypi.org/project/aa-sov-timer/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-sov-timer/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-sov-timer/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg "Code Style: black")](http://black.readthedocs.io/en/latest/)
  [![Automated Checks](https://github.com/ppfeufer/aa-sov-timer/actions/workflows/automated-checks.yml/badge.svg "Automated Checks")](https://github.com/ppfeufer/aa-sov-timer/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-sov-timer/branch/master/graph/badge.svg?token=J9PBF0HM8C "codecov")](https://codecov.io/gh/ppfeufer/aa-sov-timer)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-sov-timer/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg "Contributor Covenant")](https://github.com/ppfeufer/aa-forum/blob/master/CODE_OF_CONDUCT.md)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord "Discord")](https://discord.gg/zmh52wnfvM)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  Sovereignty campaign overview for Alliance Auth.

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Sovereignty Timer](#aa-sovereignty-timer)
    - [Screenshots](#screenshots)
      - [AA Sov Timer Dashboard](#aa-sov-timer-dashboard)
    - [Installation](#installation)
      - [Step 1: Installing the App](#step-1-installing-the-app)
      - [Step 2: Update Your AA Settings](#step-2-update-your-aa-settings)
      - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
      - [Step 4: Preload Eve Universe Data](#step-4-preload-eve-universe-data)
      - [Step 5: Setting up Permission](#step-5-setting-up-permission)
      - [Step 6: Keep Campaigns Updated](#step-6-keep-campaigns-updated)
    - [Updating](#updating)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________





  ![AA Sov Timer Dashboard](https://raw.githubusercontent.com/ppfeufer/aa-sov-timer/master/docs/images/presentation/aa-sov-timer.jpg "AA Sov Timer Dashboard")



  > [!NOTE]
  >
  > **AA Sov Timer >= 2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.12.3`.

  **Important**: Please make sure you meet all preconditions before you proceed:

  - AA Sovereignty Timer is a plugin for Alliance Auth. If you don't have Alliance
    Auth running already, please install it first before proceeding. (see the official
    [AA installation guide](https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html) for details)
  - AA Sovereignty Timer needs the app [django-eveuniverse](https://gitlab.com/ErikKalkoken/django-eveuniverse)
    to function. Please make sure it is installed before continuing.



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation.
  Then install the latest version:

  ```shell
  pip install aa-sov-timer
  ```



  Configure your AA settings (`local.py`) as follows:

  - Add `'eveuniverse',` to `INSTALLED_APPS`
  - Add `'sovtimer',` to `INSTALLED_APPS`

  Restart your supervisor



  Copy static files and run migrations

  ```shell
  python manage.py collectstatic
  ```

  ```shell
  python manage.py migrate
  ```



  AA Sovereignty Timer uses Eve Universe data to map IDs to names for solar systems,
  regions and constellations. So you need to preload some data from ESI once.
  If you already have run this command, you can skip this step.

  ```shell
  python manage.py eveuniverse_load_data map
  ```

  ```shell
  python manage.py sovtimer_load_initial_data
  ```

  Both commands might take a moment or two, so be patient ...



  Now you can set up permissions in Alliance Auth for your users.
  Add `sovtimer | Sovereignty Timer | Can access the Sovereignty Timer module` to
  the states and/or groups you would like to have access.



  Add the following scheduled task to your `local.py`. One done, restart your supervisor.

  ```python

  CELERYBEAT_SCHEDULE["sovtimer.tasks.run_sov_campaign_updates"] = {
      "task": "sovtimer.tasks.run_sov_campaign_updates",
      "schedule": 30.0,
  }
  ```

  Now your system is updating the sovereignty campaigns every 30 seconds.



  To update your existing installation of AA Sovereignty Timer, first enable your
  virtual environment.

  Then run the following commands from your AA project directory (the one that
  contains `manage.py`).

  ```shell
  pip install -U aa-sov-timer
  ```

  ```shell
  python manage.py collectstatic
  ```

  ```shell
  python manage.py migrate
  ```

  Finally, restart your AA supervisor services.



  See [CHANGELOG.md]



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-sov-timer/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [changelog.md]: https://github.com/ppfeufer/aa-sov-timer/blob/master/CHANGELOG.md
  [contribution guidelines]: https://github.com/ppfeufer/aa-sov-timer/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 0d6bfc7d0d2499a071684b4bf8a26b4eab7eb67930ddc9f2e60c4adf6b1e6eee
name: python-aa-srp-help
arch: noarch
version: 2.5.4
epoch: 0
release: 1
summary: Development documents and examples for aa-srp
url: https://github.com/ppfeufer/aa-srp
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-srp-2.5.4-1.src.rpm
location_href: Packages/python-aa-srp-help-2.5.4-1.noarch.rpm
checksum_type: sha256
description:
  [![Badge: Version]][aa srp on pypi]
  [![Badge: License]][aa srp license]
  [![Badge: Supported Python Versions]][aa srp on pypi]
  [![Badge: Supported Django Versions]][aa srp on pypi]
  ![Badge: pre-commit]
  [![Badge: pre-commit.ci status]][pre-commit.ci status]
  [![Badge: Code Style: black]][black code formatter documentation]
  [![Badge: Support Discord]][support discord]
  [![Badge: Automated Tests]][automated tests on github]
  [![Badge: Code Coverage]][aa srp on codecov]
  [![Badge: Translation Status]][weblate engage]
  [![Badge: Contributor Covenant]][code of conduct]

  [![Badge: Buy me a coffee]][ppfeufer on ko-fi]

  SRP Module for [Alliance Auth]

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->

  - [Overview](#overview)
    - [Features](#features)
    - [Screenshots](#screenshots)
      - [Dashboard](#dashboard)
      - [Dashboard (View All)](#dashboard-view-all)
      - [Your SRP Requests](#your-srp-requests)
      - [SRP Requests Overview](#srp-requests-overview)
      - [SRP Request Details](#srp-request-details)
  - [Installation](#installation)
    - [Step 1: Install the Package](#step-1-install-the-package)
    - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)
    - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
    - [Step 4: Preload Eve Universe Data](#step-4-preload-eve-universe-data)
    - [Step 5: Setting up Permissions](#step-5-setting-up-permissions)
    - [Step 6: (Optional) Import From Built-in SRP Module](#step-6-optional-import-from-built-in-srp-module)
    - [Step 7: (Optional) Settings for Discord Proxy (If Used)](#step-7-optional-settings-for-discord-proxy-if-used)
  - [Permissions](#permissions)
  - [Changelog](#changelog)
  - [Translation Status](#translation-status)
  - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________





  - Overview of SRP links
  - Overview of your own SRP requests and their status
  - Accepting kill mails from [zKillboard], [EveTools Killboard] and [EVE-Kill]
  - SRP Request administration is mostly done via ajax and without page reloads
  - Use modern DataTables with filters where ever they're useful
  - Tables fully searchable and sortable
  - Mandatory reason on SRP reject
  - Notifications in AA with detailed information on SRP rejection
  - Discord notification via PM to the user on SRP request approval or rejection, if
    either [AA-Discordbot], [Discord Notify] or [Discord Proxy] is installed
  - Notify your SRP team (optional) in their Discord channel about new SRP requests, if
    [AA-Discordbot] or [Discord Proxy] is installed





  ![Image: AA SRP Dashboard]



  ![Image: AA SRP Dashboard (View All)]



  ![Image: Your SRP Requests View]



  ![Image: SRP Requests Overview]



  ![Image: SRP Request Details]



  > [!NOTE]
  >
  > **AA SRP >= 2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version of AA SRP that supports Alliance Auth v3 is `1.21.0`.

  **Important**: Please make sure you meet all preconditions before you proceed:

  - AA SRP is a plugin for Alliance Auth. If you don't have Alliance Auth running
    already, please install it first before proceeding. (see the official
    [Alliance Auth installation guide] for details)
  - AA SRP needs [Eve Universe] to function. Please make sure it is installed, before
    continuing.



  Make sure you're in the virtual environment (venv) of your Alliance Auth
  installation Then install the latest release directly from PyPi.

  ```shell
  pip install aa-srp
  ```



  This is fairly simple, just add the following to the `INSTALLED_APPS` of your `local.py`

  Configure your AA settings (`local.py`) as follows:

  - Add `"eveuniverse",` to `INSTALLED_APPS`
  - Add `"aasrp",` to `INSTALLED_APPS`



  Run static files collection and migrations

  ```shell
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for Auth



  AA SRP utilizes the EveUniverse module, so it doesn't need to ask ESI for ship
  information. To set this up, you now need to run the following command.

  ```shell
  python manage.py aasrp_load_eve
  ```



  Now it's time to set up access permissions for your new SRP module. You can do so in
  your admin backend in the AA SRP section. Read the [Permissions](#permissions)
  section for more information about the available permissions.



  **This step is only needed when you have been using the built-in SRP module until now.**

  Make sure you don't have any open SRP requests before. All SRP links in the built-in
  module will be closed during the import process, to make sure to not import any
  duplicates.

  The import process can be done at any given time and doesn't necessarily have to be
  during the installation.

  To import your SRP information from the built-in SRP module, run the following command.

  ```shell
  python manage.py aasrp_migrate_srp_data
  ```



  If you are using [Discord Proxy] to send Discord messages, you can configure the host and port in your `local.py` settings.

  | Name                | Description                                      | Default     |
  | ------------------- | ------------------------------------------------ | ----------- |
  | `DISCORDPROXY_HOST` | Hostname used to communicate with Discord Proxy. | `localhost` |
  | `DISCORDPROXY_PORT` | Port used to communicate with Discord Proxy.     | `50051`     |



  | ID                    | Description                  | Notes                                                                                                       |
  | --------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- |
  | `basic_access`        | Can access the AA SRP module | Your line members should have this permission.                                                              |
  | `create_srp`          | Can create new SRP links     | Your FCs should have this permission.                                                                       |
  | `manage_srp`          | Can manage SRP               | Users with this permission can manage the AA SRP Module. Like changing and removing SRP links and requests. |
  | `manage_srp_requests` | Can manage SRP requests      | Users with this permission can manage the SRP requests. Like changing and removing SRP requests.            |



  See [CHANGELOG.md]



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-srp/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  You want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Links -->

  [aa srp license]: https://github.com/ppfeufer/aa-srp/blob/master/LICENSE
  [aa srp on codecov]: https://codecov.io/gh/ppfeufer/aa-srp
  [aa srp on pypi]: https://pypi.org/project/aa-srp/
  [aa-discordbot]: https://github.com/pvyParts/allianceauth-discordbot "AA-Discordbot"
  [alliance auth]: https://gitlab.com/allianceauth/allianceauth "Alliance Auth"
  [alliance auth installation guide]: https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html "Alliance Auth installation guide"
  [automated tests on github]: https://github.com/ppfeufer/aa-srp/actions/workflows/automated-checks.yml
  [badge: automated tests]: https://github.com/ppfeufer/aa-srp/actions/workflows/automated-checks.yml/badge.svg "Automated Tests"
  [badge: buy me a coffee]: https://ko-fi.com/img/githubbutton_sm.svg "Buy me a coffee"
  [badge: code coverage]: https://codecov.io/gh/ppfeufer/aa-srp/branch/master/graph/badge.svg "Code Coverage"
  [badge: code style: black]: https://img.shields.io/badge/code%20style-black-000000.svg "Code Style: black"
  [badge: contributor covenant]: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg "Contributor Covenant"
  [badge: license]: https://img.shields.io/github/license/ppfeufer/aa-srp "License"
  [badge: pre-commit]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white "pre-commit"
  [badge: pre-commit.ci status]: https://results.pre-commit.ci/badge/github/ppfeufer/aa-srp/master.svg "pre-commit.ci status"
  [badge: support discord]: https://img.shields.io/discord/790364535294132234?label=discord "Support Discord"
  [badge: supported django versions]: https://img.shields.io/pypi/djversions/aa-srp?label=django "Supported Django Versions"
  [badge: supported python versions]: https://img.shields.io/pypi/pyversions/aa-srp "Supported Python Versions"
  [badge: translation status]: https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-srp/svg-badge.svg "Translation Status"
  [badge: version]: https://img.shields.io/pypi/v/aa-srp?label=release "Version"
  [black code formatter documentation]: http://black.readthedocs.io/en/latest/
  [changelog.md]: https://github.com/ppfeufer/aa-srp/blob/master/CHANGELOG.md "CHANGELOG.md"
  [code of conduct]: https://github.com/ppfeufer/aa-srp/blob/master/CODE_OF_CONDUCT.md
  [contribution guidelines]: https://github.com/ppfeufer/aa-srp/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [discord notify]: https://gitlab.com/ErikKalkoken/aa-discordnotify "Discord Notify"
  [discord proxy]: https://gitlab.com/ErikKalkoken/discordproxy "Discord Proxy"
  [eve universe]: https://gitlab.com/ErikKalkoken/django-eveuniverse "Eve Universe"
  [eve-kill]: https://eve-kill.com/ "EVE-Kill"
  [evetools killboard]: https://kb.evetools.org/ "EveTools Killboard"
  [image: aa srp dashboard]: https://raw.githubusercontent.com/ppfeufer/aa-srp/master/docs/images/aa-srp-dashboard.jpg "AA SRP Dashboard"
  [image: aa srp dashboard (view all)]: https://raw.githubusercontent.com/ppfeufer/aa-srp/master/docs/images/aa-srp-dashboard-view-all.jpg "AA SRP Dashboard (View All)"
  [image: srp request details]: https://raw.githubusercontent.com/ppfeufer/aa-srp/master/docs/images/aa-srp-request-details.jpg "SRP Request Details"
  [image: srp requests overview]: https://raw.githubusercontent.com/ppfeufer/aa-srp/master/docs/images/aa-srp-requests-overview.jpg "SRP Requests Overview"
  [image: your srp requests view]: https://raw.githubusercontent.com/ppfeufer/aa-srp/master/docs/images/aa-srp-your-requests.jpg "Your SRP Requests View"
  [ppfeufer on ko-fi]: https://ko-fi.com/N4N8CL1BY
  [pre-commit.ci status]: https://results.pre-commit.ci/latest/github/ppfeufer/aa-srp/master "pre-commit.ci"
  [support discord]: https://discord.gg/zmh52wnfvM
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/
  [zkillboard]: https://zkillboard.com/ "zKillboard"

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


pkgId: 97f966db4957f2d0a4b3ad91cc397017218b099769d810a953fd17bdbc137b00
name: python-aa-timezones-help
arch: noarch
version: 2.2.2
epoch: 0
release: 1
summary: Development documents and examples for aa-timezones
url: https://github.com/ppfeufer/aa-timezones
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aa-timezones-2.2.2-1.src.rpm
location_href: Packages/python-aa-timezones-help-2.2.2-1.noarch.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/aa-timezones?label=release)](https://pypi.org/project/aa-timezones/)
  [![License](https://img.shields.io/github/license/ppfeufer/aa-timezones)](https://github.com/ppfeufer/aa-timezones/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/aa-timezones)](https://pypi.org/project/aa-timezones/)
  [![Django](https://img.shields.io/pypi/djversions/aa-timezones?label=django)](https://pypi.org/project/aa-timezones/)
  ![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-timezones/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-timezones/master)
  [![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)
  [![Discord](https://img.shields.io/discord/790364535294132234?label=discord)](https://discord.gg/zmh52wnfvM)
  [![Checks](https://github.com/ppfeufer/aa-timezones/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-timezones/actions/workflows/automated-checks.yml)
  [![codecov](https://codecov.io/gh/ppfeufer/aa-timezones/branch/master/graph/badge.svg?token=ZSRTW5FR4C)](https://codecov.io/gh/ppfeufer/aa-timezones)
  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-timezones/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-timezones/blob/master/CODE_OF_CONDUCT.md)

  [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)

  App for displaying different time zones with Alliance Auth

  ______________________________________________________________________

  <!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=1 -->

  - [AA Time Zones](#aa-time-zones)
    - [Installation](#installation)
      - [Step 1: Install the App](#step-1-install-the-app)
      - [Step 2: Update Your Alliance Auth Settings](#step-2-update-your-alliance-auth-settings)
      - [Step 3: Finalizing the Installation](#step-3-finalizing-the-installation)
    - [(Optional) Public Views](#optional-public-views)
    - [Updating](#updating)
    - [Configure the Timezone Panels](#configure-the-timezone-panels)
    - [Adjusting Time](#adjusting-time)
    - [Discord Bot Command](#discord-bot-command)
    - [Changelog](#changelog)
    - [Translation Status](#translation-status)
    - [Contributing](#contributing)

  <!-- mdformat-toc end -->

  ______________________________________________________________________

  ![Time Zones](https://raw.githubusercontent.com/ppfeufer/aa-timezones/master/docs/images/presentation/aa-timezones.jpg)



  > [!NOTE]
  >
  > **AA Time Zones >= 2.0.0 needs at least Alliance Auth v4.0.0!**
  >
  > Please make sure to update your Alliance Auth instance _before_ you install this
  > module or update to the latest version, otherwise an update to Alliance Auth will
  > be pulled in unsupervised.
  >
  > The last version compatible with Alliance Auth v3 is `1.16.2`.



  Make sure you're in the virtual environment (venv) of your Alliance Auth installation.
  Then install the latest version:

  ```bash
  pip install aa-timezones
  ```



  Configure your AA settings (`local.py`) as follows:

  - Add `'timezones',` to `INSTALLED_APPS`



  Run migrations & copy static files

  ```bash
  python manage.py collectstatic
  python manage.py migrate
  ```

  Restart your supervisor services for AA

  Once done, it's time to add all the time zone information, so you can define your
  own set of panels later. To do so, simply run:

  ```bash
  python manage.py timezones_load_tz_data
  ```



  This app supports AA's feature of public views, since time zones conversion is not
  any mission-critical information. To allow users to view the time zone conversion page
  without the need to log in, please add `"timezones",` to the list of
  `APPS_WITH_PUBLIC_VIEWS` in your `local.py`:

  ```python




  APPS_WITH_PUBLIC_VIEWS = [
      "timezones",  # https://github.com/ppfeufer/aa-timezones
  ]
  ```

  > **Note**
  >
  > If you don't have a list for `APPS_WITH_PUBLIC_VIEWS` yet, then add the whole
  > block from here. This feature has been added in Alliance Auth v3.6.0 so you
  > might not yet have this list in your `local.py`.



  To update your existing installation of AA Time Zones, first enable your virtual
  environment.

  Then run the following commands from your AA project directory (the one that
  contains `manage.py`).

  ```bash
  pip install -U aa-timezones
  ```

  ```bash
  python manage.py collectstatic
  ```

  ```bash
  python manage.py migrate
  ```

  Now restart your AA supervisor services.



  Per default, there are 10 additional time zone panels that are displayed (see first
  image). If you want to change those, you can create your own set of panels in your
  admin backend.

  **NOTE:** "Local Time" and "EVE Time" will always be displayed as the first two panels,
  no matter what.



  You can easily adjust the time that is displayed for all timezones. This is useful
  for reinforcement timers or pre-planned fleets. To do so, click on the "Adjust Time"
  button below the time zone panels, and you will see 2 different ways to set a new time.

  ![Adjusting Time](https://raw.githubusercontent.com/ppfeufer/aa-timezones/master/docs/images/weblate/aa-timezones_adjust-time-settings.jpg)

  The first one is meant for timers, like reinforcement timers, anchoring timers or
  the like. Its maximum is 7 days, 59 minutes and 59 seconds into the future. That
  should cover pretty much all timers you can find in Eve Online.

  The second one is best suited for pre-planned fleets. Here you can set a fixed date
  and time based on the selected time zone. The default selected time zone is "EVE
  Time" but you can change it to all the available options. Keep in mind the selected
  time zone is the one the time and date will be adjusted to. So if you are going to
  use it to plan fleets, it is recommended to keep this set to "EVE Time".

  To set the adjusted time, simply click on "Set Time" in the row you altered. This
  will then adjust all time zone panels to the time you selected and will also alter
  the link in your browser, so you can share it with others directly.



  **For this to work, you'll need to have `allianceauth-discordbot` installed, configured
  and running.** ([See this link](https://github.com/pvyParts/allianceauth-discordbot))

  | Command | Effect                                                                                                                                                                                                                     |
  | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `/time` | Displays the current Eve time and what time it is in the configured time zones<br>![Discord Bot Response](https://raw.githubusercontent.com/ppfeufer/aa-timezones/master/docs/images/presentation/discordbot-response.jpg) |



  See [CHANGELOG.md](https://github.com/ppfeufer/aa-timezones/blob/master/CHANGELOG.md)



  [![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-timezones/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)

  Do you want to help translate this app into your language or improve the existing
  translation? - [Join our team of translators][weblate engage]!



  Do you want to contribute to this project? That's cool!

  Please make sure to read the [Contribution Guidelines].\
  (I promise, it's not much, just some basics)

  <!-- Inline Links -->

  [contribution guidelines]: https://github.com/ppfeufer/aa-timezones/blob/master/CONTRIBUTING.md "Contribution Guidelines"
  [weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ "Weblate Translations"

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


pkgId: 02d17290a78a123c4d215976f8c4f28992ce941ad39db8e385cc79e1f883187d
name: python-aac-init-help
arch: noarch
version: 0.4.4
epoch: 0
release: 1
summary: Development documents and examples for aac-init
url: https://pypi.org/project/aac-init/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aac-init-0.4.4-1.src.rpm
location_href: Packages/python-aac-init-help-0.4.4-1.noarch.rpm
checksum_type: sha256
description:
  [![Tests](https://github.com/nac-aci/aac-init/actions/workflows/test.yml/badge.svg)](https://github.com/nac-aci/aac-init/actions/workflows/test.yml)
  ![Python Support](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-informational "Python Support: 3.11, 3.12")



  A CLI tool to bootstrap and configure ACI fabric using ACI as Code.

  ```bash
  $ aac-init -h
  Usage: aac-init [OPTIONS]

    A CLI tool to bootstrap and configure ACI fabric using ACI as Code.

  Options:
    --version                       Show the version and exit.
    -d, --data PATH                 Path to aac-init YAML data files.
                                    [required]
    -l, --log-level [debug|info|warning|error|critical]
                                    Specify the logging level. Default setting
                                    is 'info'.  [default: info]
    -t, --max-switch-concurrent INTEGER
                                    A number of max TFTP concurrent requests.
    -h, --help                      Show this message and exit.
  ```

  All data from the YAML files (`-d/--data` option) will use to bootstrap and configure ACI fabric.

  In case there's bandwidth limitation with TFTP server and cannot support a large concurrent switch requests, use `-t` to limit switch concurrent requests, there's no limitation by default.

  The data folder **MUST** use following structure, `00-global_policy.yml` and `01-fabric_mgmt.yml` are **mandatory required**, see `docs/data_template` for details.

  ```bash
  data/
  ├── 00-global_policy.yml      # mandatory, ACI fabric global policies
  └── nac_data
      ├── 01-fabric_mgmt.yml    # mandatory, ACI fabric switch connection information
      └── other-yaml-files..    # optional, other ACI as Code configurations
  ```



  - Working knowledge of ACI and [Network as Code - ACI](https://netascode.cisco.com/)
  - A HTTP/TFTP server is required to store APIC/ACI switch image for wiping/booting APIC/ACI switch to particular version. See `docs/image_server` if you don't have experience on setting up image server.



  Python 3.10+ is required to install `aac-init`. Don't have Python 3.10 or later? See [Python 3 Getting Started](https://www.python.org/about/gettingstarted/).

  `aac-init` can be installed using `pip`:

  ```bash
  pip install aac-init
  ```

  You will also need to install ansible and related NetworkAsCode dependencies, see Cisco [Network As Code - Ansible](https://netascode.cisco.com/solutions/aci/ansible/quick_start/#local-installation) for details. You can also find `requirements.yml/requirements.txt` at `docs/requirements`.

  ```bash
  apt-get install ansible
  ansible-galaxy install -r requirements.yml
  pip install -r requirements.txt
  ```



  ```bash
  $ aac-init -d data/
  Select single or multiple choice(s) to init ACI Fabric:
  [1]  Wipe and boot APIC/switch to particular version
  [2]  APIC initial setup (Single Pod)
  [3]  Init ACI Fabric via NaC (Network as Code)
  Example: (1,2,.. or *): *

  Are you sure to proceed with the following choice(s)?
  [1] Wipe and boot APIC/switch to particular version
  [2] APIC initial setup (Single Pod)
  [3] Init ACI Fabric via NaC (Network as Code)
   (yes, no) [yes]:
  ```



  ```bash
  pip install aac-init --upgrade
  ```



  ```bash
  pip uninstall aac-init
  ```





  [Rudy Lei](shlei@cisco.com)



  [Rudy Lei](shlei@cisco.com)
  [Yang Bian](yabian@cisco.com)
  [Xiao Wang](xiawang3@cisco.com)
  [Song Wang](songwa@cisco.com)
  [Linus Xu](linxu3@cisco.com)


pkgId: f1c6a1cc4fe2c0cc84066951a29cadc67883c8d5d992c5b0ef1518d525b0e78c
name: python-ab-lab-help
arch: noarch
version: 0.20.4
epoch: 0
release: 1
summary: Development documents and examples for ab-lab
url: https://pypi.org/project/ab-lab/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-ab-lab-0.20.4-1.src.rpm
location_href: Packages/python-ab-lab-help-0.20.4-1.noarch.rpm
checksum_type: sha256
description:
  <img src="theme/icon-cluster.png" width=200 height=200 align="right">



  [![Downloads](https://static.pepy.tech/badge/ab-lab)](https://pepy.tech/project/cluster-experiments)
  [![PyPI](https://img.shields.io/pypi/v/ab-lab)](
  https://pypi.org/project/ab-lab/)
  [![Unit tests](https://github.com/david26694/ab-lab/workflows/Release%20unit%20Tests/badge.svg)](https://github.com/david26694/ab-lab/actions)
  [![CodeCov](
  https://codecov.io/gh/david26694/ab-lab/branch/main/graph/badge.svg)](https://app.codecov.io/gh/david26694/ab-lab/)
  ![License](https://img.shields.io/github/license/david26694/ab-lab)
  [![Pypi version](https://img.shields.io/pypi/pyversions/ab-lab.svg)](https://pypi.python.org/pypi/ab-lab)

  A Python library for end-to-end A/B testing workflows, featuring:
  - Experiment analysis and scorecards
  - Power analysis (simulation-based and normal approximation)
  - Variance reduction techniques (CUPED, CUPAC)
  - Support for complex experimental designs (cluster randomization, switchback experiments)




  - **Simulation-based**: Run Monte Carlo simulations to estimate power
  - **Normal approximation**: Fast power estimation using CLT
  - **Minimum Detectable Effect**: Calculate required effect sizes
  - **Multiple designs**: Support for:
    - Simple randomization
    - Variance reduction techniques in power analysis
    - Cluster randomization
    - Switchback experiments
  - **Dict config**: Easy to configure power analysis with a dictionary


  - **Analysis Plans**: Define structured analysis plans
  - **Metrics**:
    - Simple metrics
    - Ratio metrics
  - **Dimensions**: Slice results by dimensions
  - **Statistical Methods**:
    - GEE
    - Mixed Linear Models
    - Clustered / regular OLS
    - T-tests
    - Synthetic Control
  - **Dict config**: Easy to define analysis plans with a dictionary


  - **CUPED** (Controlled-experiment Using Pre-Experiment Data):
    - Use historical outcome data to reduce variance, choose any granularity
    - Support for several covariates
  - **CUPAC** (Control Using Predictors as Covariates):
    - Use any scikit-learn compatible estimator to predict the outcome with pre-experiment data





  ```python
  import numpy as np
  import pandas as pd
  from ab_lab import PowerAnalysis, NormalPowerAnalysis


  N = 1_000
  df = pd.DataFrame({
      "target": np.random.normal(0, 1, size=N),
      "date": pd.to_datetime(
          np.random.randint(
              pd.Timestamp("2024-01-01").value,
              pd.Timestamp("2024-01-31").value,
              size=N,
          )
      ),
  })


  config = {
      "analysis": "ols",
      "perturbator": "constant",
      "splitter": "non_clustered",
      "n_simulations": 50,
  }
  pw = PowerAnalysis.from_dict(config)
  power = pw.power_analysis(df, average_effect=0.1)


  npw = NormalPowerAnalysis.from_dict({
      "analysis": "ols",
      "splitter": "non_clustered",
      "n_simulations": 5,
      "time_col": "date",
  })
  power_normal = npw.power_analysis(df, average_effect=0.1)
  power_line_normal = npw.power_line(df, average_effects=[0.1, 0.2, 0.3])



  mde = npw.mde(df, power=0.8)


  mde_timeline = npw.mde_time_line(
      df,
      powers=[0.8],
      experiment_length=[7, 14, 21]
  )

  print(power, power_line_normal, power_normal, mde, mde_timeline)
  ```



  ```python
  import numpy as np
  import pandas as pd
  from ab_lab import AnalysisPlan, SimpleMetric, Variant, Dimension

  N = 1_000
  experiment_data = pd.DataFrame({
      "order_value": np.random.normal(100, 10, size=N),
      "delivery_time": np.random.normal(10, 1, size=N),
      "experiment_group": np.random.choice(["control", "treatment"], size=N),
      "city": np.random.choice(["NYC", "LA"], size=N),
      "customer_id": np.random.randint(1, 100, size=N),
      "customer_age": np.random.randint(20, 60, size=N),
  })


  aov = SimpleMetric(alias="AOV", name="order_value")
  delivery_time = SimpleMetric(alias="Delivery Time", name="delivery_time")


  variants = [
      Variant("control", is_control=True),
      Variant("treatment", is_control=False),
  ]
  city_dimension = Dimension(name="city", values=["NYC", "LA"])


  plan = AnalysisPlan.from_metrics(
      metrics=[aov, delivery_time],
      variants=variants,
      variant_col="experiment_group",
      dimensions=[city_dimension],
      analysis_type="clustered_ols",
      analysis_config={
          "cluster_cols": ["customer_id"],
      },
  )


  results = plan.analyze(experiment_data)
  print(results.to_dataframe())
  ```



  ```python
  import numpy as np
  import pandas as pd
  from ab_lab import (
      AnalysisPlan,
      SimpleMetric,
      Variant,
      Dimension,
      TargetAggregation,
      HypothesisTest
  )

  N = 1000

  experiment_data = pd.DataFrame({
      "order_value": np.random.normal(100, 10, size=N),
      "delivery_time": np.random.normal(10, 1, size=N),
      "experiment_group": np.random.choice(["control", "treatment"], size=N),
      "city": np.random.choice(["NYC", "LA"], size=N),
      "customer_id": np.random.randint(1, 100, size=N),
      "customer_age": np.random.randint(20, 60, size=N),
  })

  pre_experiment_data = pd.DataFrame({
      "order_value": np.random.normal(100, 10, size=N),
      "customer_id": np.random.randint(1, 100, size=N),
  })


  cupac_model = TargetAggregation(
      agg_col="customer_id",
      target_col="order_value"
  )

  hypothesis_test = HypothesisTest(
      metric=SimpleMetric(alias="AOV", name="order_value"),
      analysis_type="clustered_ols",
      analysis_config={
          "cluster_cols": ["customer_id"],
          "covariates": ["customer_age", "estimate_order_value"],
      },
      cupac_config={
          "cupac_model": cupac_model,
          "target_col": "order_value",
      },
  )


  plan = AnalysisPlan(
      tests=[hypothesis_test],
      variants=[
          Variant("control", is_control=True),
          Variant("treatment", is_control=False),
      ],
      variant_col="experiment_group",
  )


  results = plan.analyze(experiment_data, pre_experiment_data)
  print(results.to_dataframe())
  ```



  You can install this package via `pip`.

  ```bash
  pip install ab-lab
  ```

  For detailed documentation and examples, visit our [documentation site](https://david26694.github.io/ab-lab/).



  The library offers the following classes:

  * Regarding power analysis:
      * `PowerAnalysis`: to run power analysis on any experiment design, using simulation
      * `PowerAnalysisWithPreExperimentData`: to run power analysis on a clustered/switchback design, but adding pre-experiment df during split and perturbation (especially useful for Synthetic Control)
      * `NormalPowerAnalysis`: to run power analysis on any experiment design using the central limit theorem for the distribution of the estimator. It can be used to compute the minimum detectable effect (MDE) for a given power level.
      * `ConstantPerturbator`: to artificially perturb treated group with constant perturbations
      * `BinaryPerturbator`: to artificially perturb treated group for binary outcomes
      * `RelativePositivePerturbator`: to artificially perturb treated group with relative positive perturbations
      * `RelativeMixedPerturbator`: to artificially perturb treated group with relative perturbations for positive and negative targets
      * `NormalPerturbator`: to artificially perturb treated group with normal distribution perturbations
      * `BetaRelativePositivePerturbator`: to artificially perturb treated group with relative positive beta distribution perturbations
      * `BetaRelativePerturbator`: to artificially perturb treated group with relative beta distribution perturbations in a specified support interval
      * `SegmentedBetaRelativePerturbator`: to artificially perturb treated group with relative beta distribution perturbations in a specified support interval, but using clusters
  * Regarding splitting data:
      * `ClusteredSplitter`: to split data based on clusters
      * `FixedSizeClusteredSplitter`: to split data based on clusters with a fixed size (example: only 1 treatment cluster and the rest in control)
      * `BalancedClusteredSplitter`: to split data based on clusters in a balanced way
      * `NonClusteredSplitter`: Regular data splitting, no clusters
      * `StratifiedClusteredSplitter`: to split based on clusters and strata, balancing the number of clusters in each stratus
      * `RepeatedSampler`: for backtests where we have access to counterfactuals, does not split the data, just duplicates the data for all groups
      * Switchback splitters (the same can be done with clustered splitters, but there is a convenient way to define switchback splitters using switch frequency):
          * `SwitchbackSplitter`: to split data based on clusters and dates, for switchback experiments
          * `BalancedSwitchbackSplitter`: to split data based on clusters and dates, for switchback experiments, balancing treatment and control among all clusters
          * `StratifiedSwitchbackSplitter`: to split data based on clusters and dates, for switchback experiments, balancing the number of clusters in each stratus
          * Washover for switchback experiments:
              * `EmptyWashover`: no washover done at all.
              * `ConstantWashover`: accepts a timedelta parameter and removes the data when we switch from A to B for the timedelta interval.
  * Regarding analysis methods:
      * `GeeExperimentAnalysis`: to run GEE analysis on the results of a clustered design
      * `MLMExperimentAnalysis`: to run Mixed Linear Model analysis on the results of a clustered design
      * `TTestClusteredAnalysis`: to run a t-test on aggregated data for clusters
      * `PairedTTestClusteredAnalysis`: to run a paired t-test on aggregated data for clusters
      * `ClusteredOLSAnalysis`: to run OLS analysis on the results of a clustered design
      * `OLSAnalysis`: to run OLS analysis for non-clustered data
      * `TargetAggregation`: to add pre-experimental data of the outcome to reduce variance
      * `SyntheticControlAnalysis`: to run synthetic control analysis
  * Regarding experiment analysis workflow:
      * `Metric`: abstract class to define a metric to be used in the analysis
      * `SimpleMetric`: to create a metric defined at the same level of the data used for the analysis
      * `RatioMetric`: to create a metric defined at a lower level than the data used for the analysis
      * `Variant`: to define a variant of the experiment
      * `Dimension`: to define a dimension to slice the results of the experiment
      * `HypothesisTest`: to define a Hypothesis Test with a metric, analysis method, optional analysis configuration, and optional dimensions
      * `AnalysisPlan`: to define a plan of analysis with a list of Hypothesis Tests for a dataset and the experiment variants. The `analyze()` method runs the analysis and returns the results
      * `AnalysisResults`: to store the results of the analysis
  * Other:
      * `PowerConfig`: to conveniently configure `PowerAnalysis` class
      * `ConfidenceInterval`: to store the data representation of a confidence interval
      * `InferenceResults`: to store the structure of complete statistical analysis results


pkgId: ac5d2f81d0018e7d1f54c1eadbe791eb53712b2fea2febda4292db588d164508
name: python-abcd-graph-help
arch: noarch
version: 0.3.0
epoch: 0
release: 1
summary: Development documents and examples for abcd-graph
url: https://github.com/AleksanderWWW/abcd-graph
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-abcd-graph-0.3.0-1.src.rpm
location_href: Packages/python-abcd-graph-help-0.3.0-1.noarch.rpm
checksum_type: sha256
description:
  A python library for generating ABCD graphs.




  ```bash
  pip install abcd-graph
  ```
  Project available at [PyPI](https://pypi.org/project/abcd-graph/).


  ```bash
  git clone https://github.com/AleksanderWWW/abcd-graph.git


  cd abcd-graph
  pip install .
  ```




  ```python
  from abcd_graph import ABCDGraph, ABCDParams

  params = ABCDParams()
  graph = ABCDGraph(params, n=1000, logger=True).build()
  ```



  - `params`: An instance of `ABCDParams` class.
  - `n`: Number of nodes in the graph.
  - `logger` A boolean to enable or disable logging to the console. Default is `False` - no logs are shown.
  - `callbacks`: A list of instances of `Callback` class. Default is an empty list.



  The `ABCDGraph` object with the generated graph.



  The `ABCDParams` class is used to set the parameters for the graph generation.

  Arguments:

  | Name    | Type    | Description                                              | Default |
  |---------|---------|----------------------------------------------------------|---------|
  | `gamma` | `float` | Power-law parameter for degrees, between 2 and 3         | 2.5     |
  | `delta` | `int`   | Min degree                                               | 5       |
  | `zeta`  | `float` | Parameter for max degree, between 0 and 1                | 0.5     |
  | `beta`  | `float` | Power-law parameter for community sizes, between 1 and 2 | 1.5     |
  | `s`     | `int`   | Min community size                                       | 20      |
  | `tau`   | `float` | Parameter for max community size, between zeta and 1     | 0.8     |
  | `xi`    | `float` | Noise parameter, between 0 and 1                         | 0.25    |

  Parameters are validated when the object is created. If any of the parameters are invalid, a `ValueError` will be raised.



  The `ABCDGraph` object has two properties that can be used to access the communities and edges of the graph.

  - `communities` - A list of `ABCDCommunity` objects.
  - `edges` - A list of tuples representing the edges of the graph.

  Example:

  ```python

  from abcd_graph import ABCDGraph, ABCDParams

  params = ABCDParams()

  graph = ABCDGraph(params, n=1000, logger=True).build()

  print(graph.communities)
  print(graph.edges)
  ```

  Communities have the following properties:
  - vertices - A list of vertices in the community.
  - average_degree - The average degree of the community.
  - degree_sequence - The degree sequence of the community.
  - empirical_xi - The empirical xi of the community.



  Exporting the graph to different formats is done via the `exporter` property of the `Graph` object.

  Possible formats are:

  | Method                         | Description                                                                               | Required packages | Installation command         |
  |--------------------------------|-------------------------------------------------------------------------------------------|-------------------|------------------------------|
  | `to_networkx()`                | Export the graph to a `networkx.Graph` object.                                            | `networkx`        | `pip install abcd[networkx]` |
  | `to_igraph()`                  | Export the graph to an `igraph.Graph` object.                                             | `igraph`          | `pip install abcd[igraph]`   |
  | `adj_matrix`                   | Export the graph to a `numpy.ndarray` object representing the adjacency matrix.           |                   |                              |
  | `to_sparse_adjacency_matrix()` | Export the graph to a `scipy.sparse.csr_matrix` object representing the adjacency matrix. | `scipy`           | `pip install abcd[scipy]`    |


  Example:

  ```python
  from abcd_graph import ABCDGraph, ABCDParams

  params = ABCDParams()
  graph = ABCDGraph(params, n=1000, logger=True).build()
  graph_networkx = graph.exporter.to_networkx()
  ```




  Callbacks are used to handle diagnostics and visualization of the graph generation process. They are instances of the `ABCDCallback` class.

  Out of the box, the library provides three callbacks:
  - `StatsCollector` - Collects statistics about the graph generation process.
  - `PropertyCollector` - Collects properties of the graph.
  - `Visualizer` - Visualizes the graph generation process.

  Example:

  ```python

  from abcd_graph import ABCDGraph, ABCDParams

  from abcd_graph.callbacks import StatsCollector, Visualizer, PropertyCollector

  stats = StatsCollector()
  vis = Visualizer()
  props = PropertyCollector()
  params = ABCDParams()
  g = ABCDGraph(params, n=1000, logger=True, callbacks=[stats, vis, props]).build()

  print(stats.statistics)

  print(props.xi_matrix)

  vis.draw_community_cdf()
  ```



  To build a docker image containing the library, run:

  ```bash
  docker build -t abcd-graph .
  ```

  To run the image, use:

  ```bash
  docker run -it abcd-graph /bin/bash
  ```
  This will give you a terminal inside a container with the library installed.

  Available are also installation commands for the additional packages:

  ```bash
  docker build -t abcd-test --build-arg INSTALL_TYPE=igraph .
  ```

  Possible values for `INSTALL_TYPE` are `dev`, `matplotlib`,  `networkx`, `igraph`, `scipy`, `all` and `extended`.

  | Value        | Packages installed                                                                |
  |--------------|-----------------------------------------------------------------------------------|
  | `dev`        | `pytest`, `pre-commit`, `pytest-cov`                                              |
  | `matplotlib` | `matplotlib`                                                                      |
  | `networkx`   | `networkx`                                                                        |
  | `igraph`     | `igraph`                                                                          |
  | `scipy`      | `scipy`                                                                           |
  | `all`        | `networkx`, `igraph`, `scipy`, `pytest`, `pre-commit`, `pytest-cov`, `matplotlib` |
  | `extended`   | `scipy`, `matplotlib`                                                             |

  > [!NOTE]
  > Combinations of the above values are also possible, e.g. `igraph,networkx`.

  > [!WARNING]
  > If you choose and option outside the available ones, the installation will still succeed,
  > but only the base package will be installed.




  The library comes with a set of examples that show how to use the library in different scenarios.
  You can find them in the `examples` directory in the format of Jupyter Notebooks.


pkgId: 65c04d69b9779a353dd55e9dfcfc1f492f7137ec34940f509bf12608205b0ea6
name: python-abilian-devtools-help
arch: noarch
version: 0.7.6
epoch: 0
release: 1
summary: Development documents and examples for abilian-devtools
url: https://pypi.org/project/abilian-devtools/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-abilian-devtools-0.7.6-1.src.rpm
location_href: Packages/python-abilian-devtools-help-0.7.6-1.noarch.rpm
checksum_type: sha256
description:
  Abilian Development Tools (ADT) is a curated collection of Python development tools that includes formatters, testing frameworks, style checkers, type checkers, and supply chain audit tools. By adding `abilian-devtools = '*'` to your project's `requirements.in` or `pyproject.toml`, you can access over 40+ curated projects and plugins.
  Proper configuration and usage in your project is still required.
  Additionally, the package provides a command-line interface (CLI) called adt to help users get started with various development tasks such as running tests, security audits, and code formatting.
  ADT was developped at [Abilian](https://abilian.com/) as a tool to help manage dozens of Python projects (open source or not). We hope it can be useful to others too.


pkgId: 86553cafe494316a907abba4a8c947776a160bc7dbed804cc6208c8d171be9d4
name: python-absbox-help
arch: noarch
version: 0.40.8
epoch: 0
release: 1
summary: Development documents and examples for absbox
url: https://github.com/yellowbean/PyABS
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-absbox-0.40.8-1.src.rpm
location_href: Packages/python-absbox-help-0.40.8-1.noarch.rpm
checksum_type: sha256
description:
  a structured finance cashflow engine wrapper for structured credit professionals:

  * transparency -> open source for both wrapper and backend engine, great variable inspection support.
  * human readable waterfall -> no more coding/scripting, just *lists* and *maps* in Python !
  * easy interaction with Python numeric libraries as well as databases/Excel to accomodate daily work.

  [![PyPI version](https://badge.fury.io/py/absbox.svg)](https://badge.fury.io/py/absbox)
  [![PyPI download](https://img.shields.io/pypi/dm/absbox)](https://img.shields.io/pypi/dm/absbox)



      pip install absbox


  * English -> https://absbox-doc.readthedocs.io
  * Chinese(inactive) -> https://absbox.readthedocs.io


  * Structuring
    * Easy way to create different pool assets/deal capital structures and waterfalls
    * User can tell how key variables(service fee/bond WAL/bond cashflow etc) changes in different structure of transactions.
  * Investor
    * Given powerful modelling language to build cashflow model , user can price bonds of transaction with pool performance assumption


  * Provide building blocks to create cashflow models for ABS/MBS
  * Adapt to multiple asset classes
      * Residential Mortgage / AdjustRateMortgage/ IO,PO,Balloon Mortgages / Auto Loans
      * Corp Loans
      * Consumer Credit
      * Lease (For CMBS)
      * Fix Asset (Solar Panel/Hotel)
      * Receivable
      * SRT/Siginificant Risk Transfer
      * Master Trust
  * Features
    * Sensitivity Analysis on different scenarios or deal structures
      * sensitivity analysis on pool performance assumptions
      * sensitivity analysis on capital structures or any deal components
    * Bond Cashflow/Pool Cashflow Forecast, Pricing


  * Python syntax, nice to have knowledge of functional programming ,or exposure to package `toolz`/`lenses`
  * Patience & Persistence, but remember , there is a slack community and responsive support !



  Raise issues or disucssion with the prospectus or spreadsheet how asset cashflow should be projected.




  <img src="https://absbox-doc.readthedocs.io/en/latest/_images/Intergration.png" width="600" height="347"/>



  User can have option to connect to a private calculation engine in his/her own environment

  ![Screenshot_2024-08-19_15-09-10](https://github.com/user-attachments/assets/d4d7d6da-db38-46bd-96ed-524c92c1aa27)




  * [Discussion](https://github.com/yellowbean/AbsBox/discussions)
  * [Slack](https://absboxhastructure.slack.com)

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 [2022,2023,2024] [Xiaoyu Zhang]  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: 585d407169cf5abe04edcee3f67ff6e2424b550f21d0d6d6cc43970bab08be24
name: python-abstract-solcatcher-help
arch: noarch
version: 0.0.3.84
epoch: 0
release: 1
summary: Development documents and examples for abstract-solcatcher
url: https://github.com/AbstractEndeavors/abstract_solcatcher
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-abstract-solcatcher-0.0.3.84-1.src.rpm
location_href: Packages/python-abstract-solcatcher-help-0.0.3.84-1.noarch.rpm
checksum_type: sha256
description:
  The `abstract_solcatcher` package provides a comprehensive solution for making HTTP requests specifically tailored for interacting with Solcatcher.io's APIs. It simplifies complex tasks such as data fetching, data manipulation, and interacting with the Flask backend of Solcatcher.io. This module abstracts API calls and Flask requests, providing utility functions that make it easier to perform these operations.

  - **API Calls**: Facilitates making custom API requests to Solcatcher.io with specific endpoints.
  - **Flask Backend Interaction**: Manages interactions with a Flask backend, including viewing and listing database tables and columns.
  - **Data Handling**: Provides functions to handle and manipulate data before sending it in requests.

  - **Abstract Call**: Handles direct API interactions with functions that tailor requests for specific Solcatcher.io endpoints.
  - **Abstract Flask**: Manages requests to the Flask backend, providing functions to view and list database tables, as well as retrieve specific table columns.
  - **Utilities**: Contains helper functions that return standard URLs and endpoints, and help in updating data payloads.

  To install the `abstract_solcatcher` package, use the following pip command:
  ```bash
  pip install abstract_solcatcher
  ```


  To make a custom API call to retrieve metadata:
  ```python
  from abstract_solcatcher import getCallRequest
  response = getCallRequest('getMetaData', signature='your_signature_here')
  print(response)
  ```

  To view a specific table in the database:
  ```python
  from abstract_solcatcher import view_table
  response = view_table('your_table_name')
  print(response)
  ```

  To list all tables in the database:
  ```python
  from abstract_solcatcher import list_tables
  tables = list_tables()
  print(tables)
  ```

  - Python 3.6+
  - `requests` library
  - `abstract_apis`
  - `abstract_utilities`

  Contributions to enhance the functionalities of `abstract_solcatcher` are welcome. Please fork the [GitHub repository](https://github.com/AbstractEndeavors/abstract_solcatcher), make your changes, and submit a pull request.

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


pkgId: 3613d2363f374c0ae47e3f5f584e2ce552e3d6e01df766e21ff989278dcaae0e
name: python-academic-metrics-help
arch: noarch
version: 1.0.4
epoch: 0
release: 1
summary: Development documents and examples for academic-metrics
url: https://github.com/SpencerPresley/COSC425-DATA
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-academic-metrics-1.0.4-1.src.rpm
location_href: Packages/python-academic-metrics-help-1.0.4-1.noarch.rpm
checksum_type: sha256
description:
  A repository which implements data collection of a University's academic research articles within a given time period and classifies them into categories defined by the NSF PhD research focus areas taxonomy then provides:

  - Data on an article level
  - Data on individual authors
  - Data on category level

  Currently the data is outputted in JSON format. There exists a script for converting the JSON to an Excel file but is currently somewhat finnicky.

  A more thorough offline file formatting will be implemented in the future.





  1. Install the package `pip install academic-metrics`
  2. Create a `.env` file in the root directory and add your OpenAI API key: `OPENAI_API_KEY=<your_openai_api_key>`
  3. Create a script `run_pipeline.py` in the root directory and add the following:

      ```python
      from academic_metrics.runners.pipeline import PipelineRunner

      runner = PipelineRunner(ai_api_key=os.getenv("OPENAI_API_KEY"))
      runner.run_pipeline()
      ```


  1. Clone the repository:
      - HTTPS: `git clone https://github.com/SpencerPresley/COSC425-DATA.git`
      - SSH: `git clone git@github.com:SpencerPresley/COSC425-DATA.git`
  2. Navigate into the project root directory `cd COSC425-DATA` and run the setup script `python setup_environment.py`:
      - This will install the academic_metrics package in editable mode and configure the pre-commit in `.git/hooks`
      - The git hook will format the code on commit using black



  As of 11/9/2024 the pipeline runs off input files in `src/academic_metrics/data/core/input_files`

  Shortly integration of the crossref API code will be made in `academic_metrics/runners/pipeline.py` so that you can pass in your school name, data range, etc. to get your own data outputted.

  Integration for writing to a mongoDB database is currently implemented only for our use case, future integration will allow two modes:

  1. Offline output files to `src/academic_metrics/data/core/output_files`
      - In this mode the API for crossref will still work but the output files will be saved locally rather to a database.
  2. Database support. For this you will have to create a `.env` file in the root directory and add the following:
      - `MONGO_URI=<your_mongo_uri>`
      - `MONGO_DB_NAME=<your_mongo_db_name>`
      - `MONGO_COLLECTION_NAME=<your_mongo_collection_name>`


pkgId: cdf901d2f8320544393627b99e314a50421cef2788abc66d937c54a088089732
name: python-academic-paper-assistant-help
arch: noarch
version: 0.0.1
epoch: 0
release: 1
summary: Development documents and examples for academic-paper-assistant
url: https://github.com/xzjjj/AcademicPaperAssistant
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-academic-paper-assistant-0.0.1-1.src.rpm
location_href: Packages/python-academic-paper-assistant-help-0.0.1-1.noarch.rpm
checksum_type: sha256
description:
  An assistant tool for academic paper writing. This package is currently under development.



  ```bash
  pip install academic-paper-assistant
  ```



  ```python
  from academic_paper_assistant import main
  main()
  ```



  - Paper writing assistance
  - Reference management
  - Format conversion
  - Multi-language support



  MIT License


pkgId: 12658b9ad51272ac6a3585db81673905cf1f9e6ec957e00001194bace87149ee
name: python-accelerate-help
arch: noarch
version: 1.2.1
epoch: 0
release: 1
summary: Development documents and examples for accelerate
url: https://github.com/huggingface/accelerate
rpm_license: Apache
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-accelerate-1.2.1-1.src.rpm
location_href: Packages/python-accelerate-help-1.2.1-1.noarch.rpm
checksum_type: sha256
description:
  <!---
  Copyright 2021 The HuggingFace Team. All rights reserved.

  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.
  -->

  <p align="center">
      <br>
      <img src="https://raw.githubusercontent.com/huggingface/accelerate/main/docs/source/imgs/accelerate_logo.png" width="400"/>
      <br>
  <p>

  <p align="center">
      <!-- Uncomment when CircleCI is set up
      <a href="https://circleci.com/gh/huggingface/accelerate"><img alt="Build" src="https://img.shields.io/circleci/build/github/huggingface/transformers/master"></a>
      -->
      <a href="https://github.com/huggingface/accelerate/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/huggingface/accelerate.svg?color=blue"></a>
      <a href="https://huggingface.co/docs/accelerate/index.html"><img alt="Documentation" src="https://img.shields.io/website/http/huggingface.co/docs/accelerate/index.html.svg?down_color=red&down_message=offline&up_message=online"></a>
      <a href="https://github.com/huggingface/accelerate/releases"><img alt="GitHub release" src="https://img.shields.io/github/release/huggingface/accelerate.svg"></a>
      <a href="https://github.com/huggingface/accelerate/blob/main/CODE_OF_CONDUCT.md"><img alt="Contributor Covenant" src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg"></a>
  </p>

  <h3 align="center">
  <p>Run your *raw* PyTorch training script on any kind of device
  </h3>

  <h3 align="center">
      <a href="https://hf.co/course"><img src="https://raw.githubusercontent.com/huggingface/accelerate/main/docs/source/imgs/course_banner.png"></a>
  </h3>



  🤗 Accelerate was created for PyTorch users who like to write the training loop of PyTorch models but are reluctant to write and maintain the boilerplate code needed to use multi-GPUs/TPU/fp16.

  🤗 Accelerate abstracts exactly and only the boilerplate code related to multi-GPUs/TPU/fp16 and leaves the rest of your code unchanged.

  Here is an example:

  ```diff
    import torch
    import torch.nn.functional as F
    from datasets import load_dataset
  + from accelerate import Accelerator

  + accelerator = Accelerator()
  - device = 'cpu'
  + device = accelerator.device

    model = torch.nn.Transformer().to(device)
    optimizer = torch.optim.Adam(model.parameters())

    dataset = load_dataset('my_dataset')
    data = torch.utils.data.DataLoader(dataset, shuffle=True)

  + model, optimizer, data = accelerator.prepare(model, optimizer, data)

    model.train()
    for epoch in range(10):
        for source, targets in data:
            source = source.to(device)
            targets = targets.to(device)

            optimizer.zero_grad()

            output = model(source)
            loss = F.cross_entropy(output, targets)

  -         loss.backward()
  +         accelerator.backward(loss)

            optimizer.step()
  ```

  As you can see in this example, by adding 5-lines to any standard PyTorch training script you can now run on any kind of single or distributed node setting (single CPU, single GPU, multi-GPUs and TPUs) as well as with or without mixed precision (fp8, fp16, bf16).

  In particular, the same code can then be run without modification on your local machine for debugging or your training environment.

  🤗 Accelerate even handles the device placement for you (which requires a few more changes to your code, but is safer in general), so you can even simplify your training loop further:

  ```diff
    import torch
    import torch.nn.functional as F
    from datasets import load_dataset
  + from accelerate import Accelerator

  - device = 'cpu'
  + accelerator = Accelerator()

  - model = torch.nn.Transformer().to(device)
  + model = torch.nn.Transformer()
    optimizer = torch.optim.Adam(model.parameters())

    dataset = load_dataset('my_dataset')
    data = torch.utils.data.DataLoader(dataset, shuffle=True)

  + model, optimizer, data = accelerator.prepare(model, optimizer, data)

    model.train()
    for epoch in range(10):
        for source, targets in data:
  -         source = source.to(device)
  -         targets = targets.to(device)

            optimizer.zero_grad()

            output = model(source)
            loss = F.cross_entropy(output, targets)

  -         loss.backward()
  +         accelerator.backward(loss)

            optimizer.step()
  ```

  Want to learn more? Check out the [documentation](https://huggingface.co/docs/accelerate) or have a look at our [examples](https://github.com/huggingface/accelerate/tree/main/examples).



  🤗 Accelerate also provides an optional CLI tool that allows you to quickly configure and test your training environment before launching the scripts. No need to remember how to use `torch.distributed.run` or to write a specific launcher for TPU training!
  On your machine(s) just run:

  ```bash
  accelerate config
  ```

  and answer the questions asked. This will generate a config file that will be used automatically to properly set the default options when doing

  ```bash
  accelerate launch my_script.py --args_to_my_script
  ```

  For instance, here is how you would run the GLUE example on the MRPC task (from the root of the repo):

  ```bash
  accelerate launch examples/nlp_example.py
  ```

  This CLI tool is **optional**, and you can still use `python my_script.py` or `python -m torchrun my_script.py` at your convenience.

  You can also directly pass in the arguments you would to `torchrun` as arguments to `accelerate launch` if you wish to not run` accelerate config`.

  For example, here is how to launch on two GPUs:

  ```bash
  accelerate launch --multi_gpu --num_processes 2 examples/nlp_example.py
  ```

  To learn more, check the CLI documentation available [here](https://huggingface.co/docs/accelerate/package_reference/cli).

  Or view the configuration zoo [here](https://github.com/huggingface/accelerate/blob/main/examples/config_yaml_templates/)



  🤗 Here is another way to launch multi-CPU run using MPI. You can learn how to install Open MPI on [this page](https://www.open-mpi.org/faq/?category=building#easy-build). You can use Intel MPI or MVAPICH as well.
  Once you have MPI setup on your cluster, just run:
  ```bash
  accelerate config
  ```
  Answer the questions that are asked, selecting to run using multi-CPU, and answer "yes" when asked if you want accelerate to launch mpirun.
  Then, use `accelerate launch` with your script like:
  ```bash
  accelerate launch examples/nlp_example.py
  ```
  Alternatively, you can use mpirun directly, without using the CLI like:
  ```bash
  mpirun -np 2 python examples/nlp_example.py
  ```



  🤗 Accelerate supports training on single/multiple GPUs using DeepSpeed. To use it, you don't need to change anything in your training code; you can set everything using just `accelerate config`. However, if you desire to tweak your DeepSpeed related args from your Python script, we provide you the `DeepSpeedPlugin`.

  ```python
  from accelerate import Accelerator, DeepSpeedPlugin



  deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2)
  accelerator = Accelerator(mixed_precision='fp16', deepspeed_plugin=deepspeed_plugin)


  accelerator.wait_for_everyone()
  unwrapped_model = accelerator.unwrap_model(model)
  unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model))
  ```

  Note: DeepSpeed support is experimental for now. In case you get into some problem, please open an issue.



  🤗 Accelerate also provides a `notebook_launcher` function you can use in a notebook to launch a distributed training. This is especially useful for Colab or Kaggle notebooks with a TPU backend. Just define your training loop in a `training_function` then in your last cell, add:

  ```python
  from accelerate import notebook_launcher

  notebook_launcher(training_function)
  ```

  An example can be found in [this notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb). [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb)



  You should use 🤗 Accelerate when you want to easily run your training scripts in a distributed environment without having to renounce full control over your training loop. This is not a high-level framework above PyTorch, just a thin wrapper so you don't have to learn a new library. In fact, the whole API of 🤗 Accelerate is in one class, the `Accelerator` object.



  You shouldn't use 🤗 Accelerate if you don't want to write a training loop yourself. There are plenty of high-level libraries above PyTorch that will offer you that, 🤗 Accelerate is not one of them.



  If you like the simplicity of 🤗 Accelerate but would prefer a higher-level abstraction around its capabilities, some frameworks and libraries that are built on top of 🤗 Accelerate are listed below:

  * [Amphion](https://github.com/open-mmlab/Amphion) is a toolkit for Audio, Music, and Speech Generation. Its purpose is to support reproducible research and help junior researchers and engineers get started in the field of audio, music, and speech generation research and development.
  * [Animus](https://github.com/Scitator/animus) is a minimalistic framework to run machine learning experiments. Animus highlights common "breakpoints" in ML experiments and provides a unified interface for them within [IExperiment](https://github.com/Scitator/animus/blob/main/animus/core.py#L76).
  * [Catalyst](https://github.com/catalyst-team/catalyst#getting-started) is a PyTorch framework for Deep Learning Research and Development. It focuses on reproducibility, rapid experimentation, and codebase reuse so you can create something new rather than write yet another train loop. Catalyst provides a [Runner](https://catalyst-team.github.io/catalyst/api/core.html#runner) to connect all parts of the experiment: hardware backend, data transformations, model training, and inference logic.
  * [fastai](https://github.com/fastai/fastai#installing) is a PyTorch framework for Deep Learning that simplifies training fast and accurate neural nets using modern best practices. fastai provides a [Learner](https://docs.fast.ai/learner.html#Learner) to handle the training, fine-tuning, and inference of deep learning algorithms.
  * [Finetuner](https://github.com/jina-ai/finetuner) is a service that enables models to create higher-quality embeddings for semantic search, visual similarity search, cross-modal text<->image search, recommendation systems, clustering, duplication detection, anomaly detection, or other uses.
  * [InvokeAI](https://github.com/invoke-ai/InvokeAI) is a creative engine for Stable Diffusion models, offering industry-leading WebUI, terminal usage support, and serves as the foundation for many commercial products.
  * [Kornia](https://kornia.readthedocs.io/en/latest/get-started/introduction.html) is a differentiable library that allows classical computer vision to be integrated into deep learning models. Kornia provides a [Trainer](https://kornia.readthedocs.io/en/latest/x.html#kornia.x.Trainer) with the specific purpose to train and fine-tune the supported deep learning algorithms within the library.
  * [Open Assistant](https://projects.laion.ai/Open-Assistant/) is a chat-based assistant that understands tasks, can interact with their party systems, and retrieve information dynamically to do so.
  * [pytorch-accelerated](https://github.com/Chris-hughes10/pytorch-accelerated) is a lightweight training library, with a streamlined feature set centered around a general-purpose [Trainer](https://pytorch-accelerated.readthedocs.io/en/latest/trainer.html), that places a huge emphasis on simplicity and transparency; enabling users to understand exactly what is going on under the hood, but without having to write and maintain the boilerplate themselves!
  * [Stable Diffusion web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) is an open-source browser-based easy-to-use interface based on the Gradio library for Stable Diffusion.
  * [torchkeras](https://github.com/lyhue1991/torchkeras) is a simple tool for training pytorch model just in a keras style, a dynamic and beautiful plot is provided in notebook to monitor your loss or metric.
  * [transformers](https://github.com/huggingface/transformers) as a tool for helping train state-of-the-art machine learning models in PyTorch, Tensorflow, and JAX. (Accelerate is the backend for the PyTorch side).




  This repository is tested on Python 3.8+ and PyTorch 1.10.0+

  You should install 🤗 Accelerate in a [virtual environment](https://docs.python.org/3/library/venv.html). If you're unfamiliar with Python virtual environments, check out the [user guide](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/).

  First, create a virtual environment with the version of Python you're going to use and activate it.

  Then, you will need to install PyTorch: refer to the [official installation page](https://pytorch.org/get-started/locally/#start-locally) regarding the specific install command for your platform. Then 🤗 Accelerate can be installed using pip as follows:

  ```bash
  pip install accelerate
  ```



  - CPU only
  - multi-CPU on one node (machine)
  - multi-CPU on several nodes (machines)
  - single GPU
  - multi-GPU on one node (machine)
  - multi-GPU on several nodes (machines)
  - TPU
  - FP16/BFloat16 mixed precision
  - FP8 mixed precision with [Transformer Engine](https://github.com/NVIDIA/TransformerEngine) or [MS-AMP](https://github.com/Azure/MS-AMP/)
  - DeepSpeed support (Experimental)
  - PyTorch Fully Sharded Data Parallel (FSDP) support (Experimental)
  - Megatron-LM support (Experimental)



  If you use 🤗 Accelerate in your publication, please cite it by using the following BibTeX entry.

  ```bibtex
  @Misc{accelerate,
    title =        {Accelerate: Training and inference at scale made simple, efficient and adaptable.},
    author =       {Sylvain Gugger and Lysandre Debut and Thomas Wolf and Philipp Schmid and Zachary Mueller and Sourab Mangrulkar and Marc Sun and Benjamin Bossan},
    howpublished = {\url{https://github.com/huggingface/accelerate}},
    year =         {2022}
  }
  ```


pkgId: ac0986c67cac38c4a78f3ab8d979816909fd2cf153c642eca57b7a07953ee5f2
name: python-accessible-space-help
arch: noarch
version: 0.1.11
epoch: 0
release: 1
summary: Development documents and examples for accessible-space
url: https://pypi.org/project/accessible-space/
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-accessible-space-0.1.11-1.src.rpm
location_href: Packages/python-accessible-space-help-0.1.11-1.noarch.rpm
checksum_type: sha256
description:
  This package implements the Dangerous Accessible Space (DAS) model for football analytics. It includes a physical pass simulation that can be run for all locations on the pitch to obtain the area that a team can access by a pass.

  Compatible with Python >= 3.7.



  ```bash
  pip install accessible-space
  ```



  The package has a simple pandas interface that you can use to add...
  - xC (Expected completion): The expected probability that a pass is completed. Measures the risk of a pass.
  - DAS (Dangerous accessible space) and AS (Accessible space): The (dangerous) area on the pitch that a team controls. DAS represents the value of a situation based on the amount of dangerous space that is accessible to the attacking team.
  - DAS Gained: The increase in DAS through a pass. Measures the reward of a pass.

  You only need to pass your dataframes and the schema of your data.

  ```python
  import accessible_space
  from accessible_space.tests.resources import df_passes, df_tracking  # Example data
  import matplotlib.pyplot as plt


  pass_result = accessible_space.get_expected_pass_completion(df_passes, df_tracking, event_frame_col="frame_id", event_player_col="player_id", event_team_col="team_id", event_start_x_col="x", event_start_y_col="y", event_end_x_col="x_target", event_end_y_col="y_target", tracking_frame_col="frame_id", tracking_player_col="player_id", tracking_team_col="team_id", tracking_team_in_possession_col="team_in_possession", tracking_x_col="x", tracking_y_col="y", tracking_vx_col="vx", tracking_vy_col="vy", ball_tracking_player_id="ball")
  df_passes["xC"] = pass_result.xc  # Expected pass completion rate
  print(df_passes[["event_string", "xC"]])


  das_gained_result = accessible_space.get_das_gained(df_passes, df_tracking, event_frame_col="frame_id", event_success_col="pass_outcome", event_target_frame_col="target_frame_id", tracking_frame_col="frame_id", tracking_period_col="period_id", tracking_player_col="player_id", tracking_team_col="team_id", tracking_x_col="x", tracking_y_col="y", tracking_vx_col="vx", tracking_vy_col="vy", tracking_team_in_possession_col="team_in_possession", x_pitch_min=-52.5, x_pitch_max=52.5, y_pitch_min=-34, y_pitch_max=34)
  df_passes["DAS_Gained"] = das_gained_result.das_gained
  df_passes["AS_Gained"] = das_gained_result.as_gained
  print(df_passes[["event_string", "DAS_Gained", "AS_Gained"]])


  pitch_result = accessible_space.get_dangerous_accessible_space(df_tracking, frame_col="frame_id", period_col="period_id", player_col="player_id", team_col="team_id", x_col="x", y_col="y", vx_col="vx", vy_col="vy", team_in_possession_col="team_in_possession", x_pitch_min=-52.5, x_pitch_max=52.5, y_pitch_min=-34, y_pitch_max=34)
  df_tracking["AS"] = pitch_result.acc_space  # Accessible space
  df_tracking["DAS"] = pitch_result.das  # Dangerous accessible space
  print(df_tracking[["frame_id", "team_in_possession", "AS", "DAS"]].drop_duplicates())
  ```

  For even more advanced analytics, you can access the raw simulation results on team- and player-level.

  ```python


  pass_result = accessible_space.get_expected_pass_completion(df_passes, df_tracking)
  pass_frame = 0  # We consider the pass at frame 0
  df_passes["frame_index"] = pass_result.event_frame_index  # frame_index implements a mapping from original frame number to indexes of the numpy arrays in the raw simulation_result.
  df_pass = df_passes[df_passes["frame_id"] == pass_frame]  # Consider the pass at frame 0
  frame_index = int(df_pass["frame_index"].iloc[0])
  expected_interception_rate = pass_result.simulation_result.defense_cum_prob[frame_index, 0, -1]  # Frame x Angle x Distance
  print(f"Expected interception rate: {expected_interception_rate:.1%}")


  df_tracking["frame_index"] = pitch_result.frame_index

  def plot_constellation(df_tracking_frame):
      plt.figure()
      plt.xlim([-52.5, 52.5])
      plt.ylim([-34, 34])
      plt.scatter(df_tracking_frame["x"], df_tracking_frame["y"], c=df_tracking_frame["team_id"].map({"Home": "red", "Away": "blue"}).fillna("black"), marker="o")
      for _, row in df_tracking_frame.iterrows():
          plt.text(row["x"], row["y"], row["player_id"] if row["player_id"] != "ball" else "")
      plt.gca().set_aspect('equal', adjustable='box')

  df_tracking_frame = df_tracking[df_tracking["frame_id"] == 0]  # Plot frame 0
  frame_index = df_tracking_frame["frame_index"].iloc[0]

  plot_constellation(df_tracking_frame)
  accessible_space.plot_expected_completion_surface(pitch_result.simulation_result, frame_index=frame_index)
  plt.title(f"Accessible space: {df_tracking_frame['AS'].iloc[0]:.0f} m²")

  plot_constellation(df_tracking_frame)
  accessible_space.plot_expected_completion_surface(pitch_result.dangerous_result, frame_index=frame_index, color="red")
  plt.title(f"Dangerous accessible space: {df_tracking_frame['DAS'].iloc[0]:.2f} m²")
  plt.show()


  df_tracking["player_index"] = pitch_result.player_index  # Mapping from player to index in simulation_result
  areas = accessible_space.integrate_surfaces(pitch_result.simulation_result)  # Calculate surface integrals
  dangerous_areas = accessible_space.integrate_surfaces(pitch_result.dangerous_result)
  for _, row in df_tracking[(df_tracking["frame_id"] == 0) & (df_tracking["player_id"] != "ball")].iterrows():  # Consider frame 0
      is_attacker = row["team_id"] == row["team_in_possession"]
      acc_space = areas.player_poss[int(frame_index), int(row["player_index"])]
      das = dangerous_areas.player_poss[int(frame_index), int(row["player_index"])]

      plot_constellation(df_tracking_frame)
      accessible_space.plot_expected_completion_surface(pitch_result.simulation_result, "player_poss_density", frame_index=frame_index, player_index=int(row["player_index"]))
      accessible_space.plot_expected_completion_surface(pitch_result.dangerous_result, "player_poss_density", frame_index=frame_index, player_index=int(row["player_index"]), color="red")
      plt.title(f"{row['player_id']} ({'attacker' if is_attacker else 'defender'}) {acc_space:.0f}m² AS and {das:.2f} m² DAS.")
      plt.show()
      
      print(f"Player {row['player_id']} ({'attacker' if is_attacker else 'defender'}) controls {acc_space:.0f}m² AS and {das:.2f} m² DAS.")
  ```




  ```bash
  pip install pytest accessible_space[dev]
  python -m pytest path/to/accessible_space/
  ```




  - Offside players should have an interception rate of 0 - this functionality is not implemented yet.
  - This model doesn't simulate high passes, which is a significant limitation. If you have an idea how to add it, feel free to do so!
  - Probabilities and possibilities are not fully normalized yet, i.e. probabilities generally do not sum to 1, possibilities may exceed 1, etc. This is because of numerical errors. Normalizing the prob-/possibilities is a difficult problem because it has to be done w.r.t two different axes (along the ball trajectory and across players) while maintaining temporal dependencies. Due to the difficulty, it is currently only partially implemented for the possibility density and cumulative possibility.

rpm_license:
  MIT License  Copyright (c) 2024 Jonas Bischofberger  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: efa7c586d6655a34b9dfb1b8522d5b16442827b855d19bb289ff822f67733795
name: python-accessible-space-help
arch: noarch
version: 0.1.6
epoch: 0
release: 1
summary: Development documents and examples for accessible-space
url: https://pypi.org/project/accessible-space/
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-accessible-space-0.1.6-1.src.rpm
location_href: Packages/python-accessible-space-help-0.1.6-1.noarch.rpm
checksum_type: sha256
description:
  This package implements the Dangerous Accessible Space (DAS) model for football analytics. It includes a physical pass simulation that can be run for all locations on the pitch to obtain the area that a team can access by a pass.

  Compatible with Python >= 3.7.



  ```bash
  pip install accessible-space
  ```



  The package has a simple pandas interface that you can use to add...
  - xC (Expected completion): The expected probability that a pass is completed. Measures the risk of a pass.
  - DAS (Dangerous accessible space) and AS (Accessible space): The (dangerous) area on the pitch that a team controls. DAS represents the value of a situation based on the amount of dangerous space that is accessible to the attacking team.
  - DAS Gained: The increase in DAS through a pass. Measures the reward of a pass.

  You only need to pass your dataframes and the schema of your data.

  ```python
  import accessible_space
  from accessible_space.tests.resources import df_passes, df_tracking  # Example data
  import matplotlib.pyplot as plt


  pass_result = accessible_space.get_expected_pass_completion(df_passes, df_tracking, event_frame_col="frame_id", event_player_col="player_id", event_team_col="team_id", event_start_x_col="x", event_start_y_col="y", event_end_x_col="x_target", event_end_y_col="y_target", tracking_frame_col="frame_id", tracking_player_col="player_id", tracking_team_col="team_id", tracking_team_in_possession_col="team_in_possession", tracking_x_col="x", tracking_y_col="y", tracking_vx_col="vx", tracking_vy_col="vy", ball_tracking_player_id="ball")
  df_passes["xC"] = pass_result.xc  # Expected pass completion rate
  print(df_passes[["event_string", "xC"]])


  das_gained_result = accessible_space.get_das_gained(df_passes, df_tracking, event_frame_col="frame_id", event_success_col="pass_outcome", event_target_frame_col="target_frame_id", tracking_frame_col="frame_id", tracking_period_col="period_id", tracking_player_col="player_id", tracking_team_col="team_id", tracking_x_col="x", tracking_y_col="y", tracking_vx_col="vx", tracking_vy_col="vy", tracking_team_in_possession_col="team_in_possession", x_pitch_min=-52.5, x_pitch_max=52.5, y_pitch_min=-34, y_pitch_max=34)
  df_passes["DAS_Gained"] = das_gained_result.das_gained
  df_passes["AS_Gained"] = das_gained_result.as_gained
  print(df_passes[["event_string", "DAS_Gained", "AS_Gained"]])


  pitch_result = accessible_space.get_dangerous_accessible_space(df_tracking, frame_col="frame_id", period_col="period_id", player_col="player_id", team_col="team_id", x_col="x", y_col="y", vx_col="vx", vy_col="vy", team_in_possession_col="team_in_possession", x_pitch_min=-52.5, x_pitch_max=52.5, y_pitch_min=-34, y_pitch_max=34)
  df_tracking["AS"] = pitch_result.acc_space  # Accessible space
  df_tracking["DAS"] = pitch_result.das  # Dangerous accessible space
  print(df_tracking[["frame_id", "team_in_possession", "AS", "DAS"]].drop_duplicates())
  ```

  For even more advanced analytics, you can access the raw simulation results on team- and player-level.

  ```python


  pass_result = accessible_space.get_expected_pass_completion(df_passes, df_tracking)
  pass_frame = 0  # We consider the pass at frame 0
  df_passes["frame_index"] = pass_result.event_frame_index  # frame_index implements a mapping from original frame number to indexes of the numpy arrays in the raw simulation_result.
  df_pass = df_passes[df_passes["frame_id"] == pass_frame]  # Consider the pass at frame 0
  frame_index = int(df_pass["frame_index"].iloc[0])
  expected_interception_rate = pass_result.simulation_result.defense_cum_prob[frame_index, 0, -1]  # Frame x Angle x Distance
  print(f"Expected interception rate: {expected_interception_rate:.1%}")


  df_tracking["frame_index"] = pitch_result.frame_index

  def plot_constellation(df_tracking_frame):
      plt.figure()
      plt.xlim([-52.5, 52.5])
      plt.ylim([-34, 34])
      plt.scatter(df_tracking_frame["x"], df_tracking_frame["y"], c=df_tracking_frame["team_id"].map({"Home": "red", "Away": "blue"}).fillna("black"), marker="o")
      for _, row in df_tracking_frame.iterrows():
          plt.text(row["x"], row["y"], row["player_id"] if row["player_id"] != "ball" else "")
      plt.gca().set_aspect('equal', adjustable='box')

  df_tracking_frame = df_tracking[df_tracking["frame_id"] == 0]  # Plot frame 0
  frame_index = df_tracking_frame["frame_index"].iloc[0]

  plot_constellation(df_tracking_frame)
  accessible_space.plot_expected_completion_surface(pitch_result.simulation_result, frame_index=frame_index)
  plt.title(f"Accessible space: {df_tracking_frame['AS'].iloc[0]:.0f} m²")

  plot_constellation(df_tracking_frame)
  accessible_space.plot_expected_completion_surface(pitch_result.dangerous_result, frame_index=frame_index, color="red")
  plt.title(f"Dangerous accessible space: {df_tracking_frame['DAS'].iloc[0]:.2f} m²")
  plt.show()


  df_tracking["player_index"] = pitch_result.player_index  # Mapping from player to index in simulation_result
  areas = accessible_space.integrate_surfaces(pitch_result.simulation_result)  # Calculate surface integrals
  dangerous_areas = accessible_space.integrate_surfaces(pitch_result.dangerous_result)
  for _, row in df_tracking[(df_tracking["frame_id"] == 0) & (df_tracking["player_id"] != "ball")].iterrows():  # Consider frame 0
      is_attacker = row["team_id"] == row["team_in_possession"]
      acc_space = areas.player_poss[int(frame_index), int(row["player_index"])]
      das = dangerous_areas.player_poss[int(frame_index), int(row["player_index"])]

      plot_constellation(df_tracking_frame)
      accessible_space.plot_expected_completion_surface(pitch_result.simulation_result, "player_poss_density", frame_index=frame_index, player_index=int(row["player_index"]))
      accessible_space.plot_expected_completion_surface(pitch_result.dangerous_result, "player_poss_density", frame_index=frame_index, player_index=int(row["player_index"]), color="red")
      plt.title(f"{row['player_id']} ({'attacker' if is_attacker else 'defender'}) {acc_space:.0f}m² AS and {das:.2f} m² DAS.")
      plt.show()
      
      print(f"Player {row['player_id']} ({'attacker' if is_attacker else 'defender'}) controls {acc_space:.0f}m² AS and {das:.2f} m² DAS.")
  ```




  ```bash
  python -m pytest path/to/accessible_space/
  ```




  - Offside players should have an interception rate of 0 - this functionality is not implemented yet.
  - This model doesn't simulate high passes, which is a significant limitation. If you have an idea how to add it, feel free to do so!
  - Probabilities and possibilities are not fully normalized yet, i.e. probabilities generally do not sum to 1, possibilities may exceed 1, etc. This is because of numerical errors. Normalizing the prob-/possibilities is a difficult problem because it has to be done w.r.t two different axes (along the ball trajectory and across players) while maintaining temporal dependencies. Due to the difficulty, it is currently only partially implemented for the possibility density and cumulative possibility.

rpm_license:
  MIT License  Copyright (c) 2024 Jonas Bischofberger  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: 1635d633ef57af22187b592881d50f755c77aaab0a67501b7cbd572ed58f550a
name: python-acdh-cidoc-pyutils-help
arch: noarch
version: 1.0
epoch: 0
release: 1
summary: Development documents and examples for acdh-cidoc-pyutils
url: https://github.com/acdh-oeaw/acdh-cidoc-pyutils
rpm_license: MIT license
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acdh-cidoc-pyutils-1.0-1.src.rpm
location_href: Packages/python-acdh-cidoc-pyutils-help-1.0-1.noarch.rpm
checksum_type: sha256
description:
  [![flake8 Lint](https://github.com/acdh-oeaw/acdh-cidoc-pyutils/actions/workflows/lint.yml/badge.svg)](https://github.com/acdh-oeaw/acdh-cidoc-pyutils/actions/workflows/lint.yml)
  [![Test](https://github.com/acdh-oeaw/acdh-cidoc-pyutils/actions/workflows/test.yml/badge.svg)](https://github.com/acdh-oeaw/acdh-cidoc-pyutils/actions/workflows/test.yml)
  [![codecov](https://codecov.io/gh/acdh-oeaw/acdh-cidoc-pyutils/branch/main/graph/badge.svg?token=XRF7ANN1TM)](https://codecov.io/gh/acdh-oeaw/acdh-cidoc-pyutils)
  [![PyPI version](https://badge.fury.io/py/acdh-cidoc-pyutils.svg)](https://badge.fury.io/py/acdh-cidoc-pyutils)


  Helper functions for the generation of CIDOC CRMish RDF (from XML/TEI data)



  * install via `pip install acdh-cidoc-pyutils`



  * For 'real-world-examples' see e.g. [semantic-kraus project](https://github.com/semantic-kraus/lk-data/blob/main/scripts/make_rdf.py)
  * also take a look into [test_cidoc_pyutils.py](https://github.com/acdh-oeaw/acdh-cidoc-pyutils/blob/main/tests/test_cidoc_pyutils.py)


  ```python
  import lxml.etree as ET
  from rdflib import URIRef
  rom acdh_cidoc_pyutils import make_occupations, NSMAP
  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <person xml:id="DWpers0091" sortKey="Gulbransson_Olaf_Leonhard">
          <persName type="pref">Gulbransson, Olaf</persName>
          <occupation notBefore="1900-12" notAfter="2000" key="#hansi" xml:lang="it">Bürgermeister</occupation>
          <occupation from="1233-02-03" key="#sumsi">Tischlermeister/Fleischhauer</occupation>
          <occupation key="franzi">Sängerin</occupation>
          <occupation>Bäckerin</occupation>
      </person>
  </TEI>"""
  g, uris = make_occupations(subj, x, "https://foo.bar", id_xpath="@key")
  print(g.serialize())

  ```
  ```ttl
  @prefix ns1: <http://www.cidoc-crm.org/cidoc-crm/> .
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

  <https://foo/bar/DWpers0091> ns1:P14i_performed <https://foo/bar/DWpers0091/occupation/3>,
          <https://foo/bar/DWpers0091/occupation/franzi>,
          <https://foo/bar/DWpers0091/occupation/hansi>,
          <https://foo/bar/DWpers0091/occupation/sumsi> .

  <https://foo/bar/DWpers0091/occupation/3> a <http://iflastandards.info/ns/fr/frbr/frbroo#F51> ;
      rdfs:label "Bäckerin"@de .

  <https://foo/bar/DWpers0091/occupation/franzi> a <http://iflastandards.info/ns/fr/frbr/frbroo#F51> ;
      rdfs:label "Sängerin"@de .

  <https://foo/bar/DWpers0091/occupation/hansi> a <http://iflastandards.info/ns/fr/frbr/frbroo#F51> ;
      rdfs:label "Bürgermeister"@it ;
      ns1:P4_has_time-span <https://foo/bar/DWpers0091/occupation/hansi/time-span> .

  <https://foo/bar/DWpers0091/occupation/hansi/time-span> a ns1:E52_Time-Span ;
      rdfs:label "1900-12 - 2000"^^xsd:string ;
      ns1:P82a_begin_of_the_begin "1900-12"^^xsd:gYearMonth ;
      ns1:P82b_end_of_the_end "2000"^^xsd:gYear .

  <https://foo/bar/DWpers0091/occupation/sumsi> a <http://iflastandards.info/ns/fr/frbr/frbroo#F51> ;
      rdfs:label "Tischlermeister/Fleischhauer"@de ;
      ns1:P4_has_time-span <https://foo/bar/DWpers0091/occupation/sumsi/time-span> .

  <https://foo/bar/DWpers0091/occupation/sumsi/time-span> a ns1:E52_Time-Span ;
      rdfs:label "1233-02-03 - 1233-02-03"^^xsd:string ;
      ns1:P82a_begin_of_the_begin "1233-02-03"^^xsd:date ;
      ns1:P82b_end_of_the_end "1233-02-03"^^xsd:date .
  ```



  ```python
  import lxml.etree as ET
  from rdflib import URIRef
  from acdh_cidoc_pyutils import make_birth_death_entities, NSMAP

  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <person xml:id="DWpers0091" sortKey="Gulbransson_Olaf_Leonhard">
          <persName type="pref">Gulbransson, Olaf</persName>
          <birth when="1873-05-26">
              26. 5. 1873<placeName key="#DWplace00139">Christiania (Oslo)</placeName>
          </birth>
          <death>
              <date notBefore-iso="1905-07-04" when="1955" to="2000">04.07.1905</date>
              <settlement key="pmb50">
                  <placeName type="pref">Wien</placeName>
                  <location><geo>48.2066 16.37341</geo></location>
              </settlement>
          </death>
      </person>
  </TEI>"""

  doc = ET.fromstring(sample)
  x = doc.xpath(".//tei:person[1]", namespaces=NSMAP)[0]
  xml_id = x.attrib["{http://www.w3.org/XML/1998/namespace}id"].lower()
  item_id = f"https://foo/bar/{xml_id}"
  subj = URIRef(item_id)
  event_graph, birth_uri, birth_timestamp = make_birth_death_entities(
      subj, x, place_id_xpath="//tei:placeName[1]/@key
  )
  event_graph, birth_uri, birth_timestamp = make_birth_death_entities(
      subj, x, event_type="death", verbose=True, date_node_xpath="/tei:date[1]",
      place_id_xpath="//tei:settlement[1]/@key"
  )
  event_graph.serialize(format="turtle")

  ```
  ```ttl
  @prefix ns1: <http://www.cidoc-crm.org/cidoc-crm/> .
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .



  <https://foo/bar/dwpers0091/birth> a ns1:E67_Birth ;
      rdfs:label "Geburt von Gulbransson, Olaf Leonhard"@fr ;
      ns1:P4_has_time-span <https://foo/bar/dwpers0091/birth/time-span> ;
      ns1:P7_took_place_at <https://foo/bar/DWplace00139> ;
      ns1:P98_brought_into_life <https://foo/bar/dwpers0091> .

  <https://foo/bar/dwpers0091/birth/time-span> a ns1:E52_Time-Span ;
      rdfs:label "1873-05-26 - 1873-05-26"^^xsd:string ;
      ns1:P82a_begin_of_the_begin "1873-05-26"^^xsd:date ;
      ns1:P82b_end_of_the_end "1873-05-26"^^xsd:date .



  <https://foo/bar/dwpers0091/death> a ns1:E69_Death ;
      rdfs:label "Geburt von Gulbransson, Olaf Leonhard"@fr ;
      ns1:P100_was_death_of <https://foo/bar/dwpers0091> ;
      ns1:P7_took_place_at <https://foo/bar/pmb50>
      ns1:P4_has_time-span <https://foo/bar/dwpers0091/death/time-span> .

  <https://foo/bar/dwpers0091/death/time-span> a ns1:E52_Time-Span ;
      rdfs:label "1905-07-04 - 2000"^^xsd:string ;
      ns1:P82a_begin_of_the_begin "1905-07-04"^^xsd:date ;
      ns1:P82b_end_of_the_end "2000"^^xsd:gYear .
  ```



  ```python
  import lxml.etree as ET
  from rdflib import Graph, URIRef, RDF
  from acdh_cidoc_pyutils import coordinates_to_p168, NSMAP, CIDOC
  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <place xml:id="DWplace00092">
          <placeName type="orig_name">Reval (Tallinn)</placeName>
          <location><geo>123 456</geo></location>
      </place>
  </TEI>"""

  doc = ET.fromstring(sample)
  g = Graph()
  for x in doc.xpath(".//tei:place", namespaces=NSMAP):
      xml_id = x.attrib["{http://www.w3.org/XML/1998/namespace}id"].lower()
      item_id = f"https://foo/bar/{xml_id}"
      subj = URIRef(item_id)
      g.add((subj, RDF.type, CIDOC["E53_Place"]))
      g += coordinates_to_p168(subj, x)
  print(g.serialize())

  ```
  ```ttl
  ...
      ns1:P168_place_is_defined_by "Point(456 123)"^^<geo:wktLiteral> .
  ...
  ```
  * Function parameter `verbose` prints information in case the given xpath does not return expected results which is a text node with two numbers separated by a given separator (default value is `separator=" "`)
  * Function parameter `inverse` (default: `inverse=False`) changes the order of the coordinates.





  ```python
  from acdh_cidoc_pyutils import date_to_literal d
  dates = [
      "1900",
      "1900-01",
      "1901-01-01",
      "foo",
  ]
  for x in dates:
      date_literal = date_to_literal(x)
      print((date_literal.datatype))






  ```



  ```python
  from acdh_cidoc_pyutils import make_uri

  domain = "https://hansi4ever.com/"
  version = "1"
  prefix = "sumsi"
  uri = make_uri(domain=domain, version=version, prefix=prefix)
  print(uri)


  uri = make_uri(domain=domain)
  print(uri)

  ```



  ```python
  from acdh_cidoc_pyutils import create_e52, make_uri
  uri = make_uri()
  e52 = create_e52(uri, begin_of_begin="1800-12-12", end_of_end="1900-01")
  print(e52.serialize())

  ```
  ```ttl








  ```


  takes a tei:person|place|org node, extracts their `@xml:id` and all `tei:idno` elements, derives `idoc:E42_Identifier` triples and relates them to a passed in subject via `cidoc:P1_is_identified_by`

  ```python
  import lxml.etree as ET
  from rdflib import Graph, URIRef, RDF
  from acdh_cidoc_pyutils import make_e42_identifiers, NSMAP, CIDOC
  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <place xml:id="DWplace00092">
          <placeName type="orig_name">Reval (Tallinn)</placeName>
          <placeName xml:lang="de" type="simple_name">Reval</placeName>
          <placeName xml:lang="und" type="alt_label">Tallinn</placeName>
          <idno type="pmb">https://pmb.acdh.oeaw.ac.at/entity/42085/</idno>
          <idno type="URI" subtype="geonames">https://www.geonames.org/588409</idno>
          <idno subtype="foobarid">12345</idno>
      </place>
  </TEI>"""

  doc = ET.fromstring(sample)
  g = Graph()
  for x in doc.xpath(".//tei:place|tei:org|tei:person|tei:bibl", namespaces=NSMAP):
      xml_id = x.attrib["{http://www.w3.org/XML/1998/namespace}id"].lower()
      item_id = f"https://foo/bar/{xml_id}"
      subj = URIRef(item_id)
      g.add((subj, RDF.type, CIDOC["E53_Place"]))
      g += make_e42_identifiers(
          subj, x, type_domain="http://hansi/4/ever", default_lang="it",
      )
  print(g.serialize(format="turtle"))

  ```
  ```ttl
  @prefix ns1: <http://www.cidoc-crm.org/cidoc-crm/> .
  @prefix owl: <http://www.w3.org/2002/07/owl#> .
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

  <https://foo/bar/dwplace00092> a ns1:E53_Place ;
      ns1:P1_is_identified_by <https://foo/bar/dwplace00092/identifier/DWplace00092>,
          <https://foo/bar/dwplace00092/identifier/idno/0>,
          <https://foo/bar/dwplace00092/identifier/idno/1>,
          <https://foo/bar/dwplace00092/identifier/idno/2> ;
      owl:sameAs <https://pmb.acdh.oeaw.ac.at/entity/42085/>,
          <https://www.geonames.org/588409> .

  <http://hansi/4/ever/idno/URI/geonames> a ns1:E55_Type .

  <http://hansi/4/ever/idno/foobarid> a ns1:E55_Type .

  <http://hansi/4/ever/idno/pmb> a ns1:E55_Type .

  <http://hansi/4/ever/xml-id> a ns1:E55_Type .

  <https://foo/bar/dwplace00092/identifier/DWplace00092> a ns1:E42_Identifier ;
      rdfs:label "Identifier: DWplace00092"@it ;
      rdf:value "DWplace00092";
      ns1:P2_has_type <http://hansi/4/ever/xml-id> .

  <https://foo/bar/dwplace00092/identifier/idno/0> a ns1:E42_Identifier ;
      rdfs:label "Identifier: https://pmb.acdh.oeaw.ac.at/entity/42085/"@it ;
      rdf:value "https://pmb.acdh.oeaw.ac.at/entity/42085/";
      ns1:P2_has_type <http://hansi/4/ever/idno/pmb> .

  <https://foo/bar/dwplace00092/identifier/idno/1> a ns1:E42_Identifier ;
      rdfs:label "Identifier: https://www.geonames.org/588409"@it ;
      rdf:value "https://www.geonames.org/588409"
      ns1:P2_has_type <http://hansi/4/ever/idno/URI/geonames> .

  <https://foo/bar/dwplace00092/identifier/idno/2> a ns1:E42_Identifier ;
      rdfs:label "Identifier: 12345"@it ;
      rdf:value "12345";
      ns1:P2_has_type <http://hansi/4/ever/idno/foobarid> .
  ```



  takes a tei:person|place|org node, extracts `persName, placeName and orgName` texts, `@xml:lang` and custom type values and returns `cidoc:E33_41` and `cidoc:E55` nodes linked via `cidoc:P1_is_identified_by` and `cidoc:P2_has_type`

  ```python
  import lxml.etree as ET
  from rdflib import Graph, URIRef, RDF
  from acdh_cidoc_pyutils import make_appellations, NSMAP, CIDOC

  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <place xml:id="DWplace00092">
          <placeName type="orig_name">Reval (Tallinn)</placeName>
          <placeName xml:lang="de" type="simple_name">Reval</placeName>
          <placeName xml:lang="und" type="alt_label">Tallinn</placeName>
          <idno type="pmb">https://pmb.acdh.oeaw.ac.at/entity/42085/</idno>
      </place>
  </TEI>"""

  doc = ET.fromstring(sample)
  g = Graph()
  for x in doc.xpath(".//tei:place|tei:org|tei:person|tei:bibl", namespaces=NSMAP):
      xml_id = x.attrib["{http://www.w3.org/XML/1998/namespace}id"].lower()
      item_id = f"https://foo/bar/{xml_id}"
      subj = URIRef(item_id)
      g.add((subj, RDF.type, CIDOC["E53_Place"]))
      g += make_appellations(
          subj, x, type_domain="http://hansi/4/ever", default_lang="it"
      )

  g.serialize(format="ttl")

  ```
  ```ttl
  @prefix ns1: <http://www.cidoc-crm.org/cidoc-crm/> .
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

  <https://foo/bar/dwplace00092> a ns1:E53_Place ;
      ns1:P1_is_identified_by <https://foo/bar/dwplace00092/appellation/0>,
          <https://foo/bar/dwplace00092/appellation/1>,
          <https://foo/bar/dwplace00092/appellation/2> .

  <http://hansi/4/ever/alt-label> a ns1:E55_Type ;
      rdfs:label "alt_label" .

  <http://hansi/4/ever/orig-name> a ns1:E55_Type ;
      rdfs:label "orig_name" .

  <http://hansi/4/ever/simple-name> a ns1:E55_Type ;
      rdfs:label "simple_name" .

  <https://foo/bar/dwplace00092/appellation/0> a ns1:E33_E41_Linguistic_Appellation ;
      rdfs:label "Reval (Tallinn)"@it ;
      ns1:P2_has_type <http://hansi/4/ever/orig-name> .

  <https://foo/bar/dwplace00092/appellation/1> a ns1:E33_E41_Linguistic_Appellation ;
      rdfs:label "Reval"@de ;
      ns1:P2_has_type <http://hansi/4/ever/simple-name> .

  <https://foo/bar/dwplace00092/appellation/2> a ns1:E33_E41_Linguistic_Appellation ;
      rdfs:label "Tallinn"@und ;
      ns1:P2_has_type <http://hansi/4/ever/alt-label> .
  ```



  ```python
  domain = "https://foo/bar/"
  subj = URIRef(f"{domain}place__237979")
  sample = """
  <TEI xmlns="http://www.tei-c.org/ns/1.0">
      <place xml:id="place__237979">
          <placeName>Lerchenfelder G&#252;rtel 48</placeName>
          <desc type="entity_type">Wohngeb&#228;ude (K.WHS)</desc>
          <desc type="entity_type_id">36</desc>
          <location type="coords">
              <geo>48,209035 16,339257</geo>
          </location>
          <location>
              <placeName ref="place__50">Wien</placeName>
              <geo>48,208333 16,373056</geo>
          </location>
      </place>
  </TEI>"""
  doc = ET.fromstring(sample)
  node = doc.xpath(".//tei:place[1]", namespaces=NSMAP)[0]
  g = p89_falls_within(
      subj, node, domain, location_id_xpath="./tei:location/tei:placeName/@ref"
  )
  result = g.serialize(format="ttl")
  ```
  returns
  ```ttl
  @prefix ns1: <http://www.cidoc-crm.org/cidoc-crm/> .

  <https://foo/bar/place__237979> ns1:P89_falls_within <https://foo/bar/place__50> .
  ```



  ```python
  from acdh_cidoc_pyutils import normalize_string
  string = """\n\nhallo
  mein schatz ich liebe    dich
      du bist         die einzige für mich
          """
  print(normalize_string(string))


  ```



  expects typical TEI date attributes like `@when, @when-iso, @notBefore, @notAfter, @from, @to, ...` and returns a tuple containg start- and enddate values. If only `@when or @when-iso` or only `@notBefore or @notAfter` are provided, the returned values are the same, unless the default parameter `fill_missing` is set to `False`.

  ```python
  from lxml.etree import Element
  from acdh_cidoc_pyutils import extract_begin_end

  date_string = "1900-12-12"
  date_object = Element("{http://www.tei-c.org/ns/1.0}tei")
  date_object.attrib["when-iso"] = date_string
  print(extract_begin_end(date_object))




  date_string = "1900-12-12"
  date_object = Element("{http://www.tei-c.org/ns/1.0}tei")
  date_object.attrib["when-iso"] = date_string
  print(extract_begin_end(date_object, fill_missing=False))




  date_object = Element("{http://www.tei-c.org/ns/1.0}tei")
  date_object.attrib["notAfter"] = "1900-12-12"
  date_object.attrib["notBefore"] = "1800"
  print(extract_begin_end(date_object))



  ```



  * `pip install -r requirements_dev.txt`
  * `flake8` -> linting
  * `coveage run -m pytest` -> runs tests and creates coverage stats


pkgId: 6cc9fc59b0d224e8898d7dee4e576ad716841243fa2fd63a12a7750ca37c39a3
name: python-aceCommon-help
arch: noarch
version: 0.1.0
epoch: 0
release: 1
summary: Development documents and examples for aceCommon
url: https://github.com/lukhed/aceCommon
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-aceCommon-0.1.0-1.src.rpm
location_href: Packages/python-aceCommon-help-0.1.0-1.noarch.rpm
checksum_type: sha256
description:
  A collection of common utility functions for Python projects.



  ```bash
  pip install aceCommon
  from aceCommon import create_file_path_string

  example_path = create_file_path_string(list_of_dir=['subdir', 'file.txt'])

  print(path)
  ```


pkgId: ed44bcb2f60d3280247e09a0f75535558b6ed9794630d84aa3ade3553e55d38e
name: python-acheron-help
arch: noarch
version: 3.0.0
epoch: 0
release: 1
summary: Development documents and examples for acheron
url: https://bitbucket.org/suprocktech/acheron
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acheron-3.0.0-1.src.rpm
location_href: Packages/python-acheron-help-3.0.0-1.noarch.rpm
checksum_type: sha256
description:
  Acheron is a plotting application and data recorder for USB and TCP devices communicating via the Asphodel protocol.

  The Asphodel communication protocol was developed by Suprock Technologies (http://www.suprocktech.com)


  Acheron is licensed under the ISC license.

  The ISC license is a streamlined version of the BSD license, and permits usage in both open source and propretary projects.


  Commonly pronounced as "ACK-er-on" in English. The word comes from Greek mythology, where Acheron is one of the five rivers in the underworld.


pkgId: 696f116eb9e59b5106cb13defdb7e8a6ab5ae85871269bb8484317a998d72908
name: python-acoutreams-help
arch: noarch
version: 0.1.1
epoch: 0
release: 1
summary: Development documents and examples for acoutreams
url: https://github.com/NikUstimenko/acoutreams
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acoutreams-0.1.1-1.src.rpm
location_href: Packages/python-acoutreams-help-0.1.1-1.noarch.rpm
checksum_type: sha256
description:
  The package `acoutreams` adopts the framework of the `treams` package for acoustic wave scattering in finite and periodic arrangements of particles, based on the T-matrix method.





  To install the package with pip, use

  ```sh
  pip install acoutreams
  ```
  Preliminarily, you have to also install original `treams` as well as `numpy` and `scipy`
  ```sh
  pip install treams
  ```



  The documentation of `treams` can be found at https://tfp-photonics.github.io/treams.



  When using this code please cite:



  * [x] T-matrix calculations using a spherical or cylindrical wave basis set
  * [x] Scattering from clusters of particles
  * [x] Scattering from particles and clusters arranged in 3d-, 2d-, and 1d-lattices
  * [x] Calculation of sound propagation in stratified media
  * [x] Band calculation in crystal structures


pkgId: b8c158fd164054fa356a4f9429b6464c5a3153360d041146d06a6f3249c51ba1
name: python-acoutreams-help
arch: noarch
version: 0.1.14
epoch: 0
release: 1
summary: Development documents and examples for acoutreams
url: https://github.com/NikUstimenko/acoutreams
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acoutreams-0.1.14-1.src.rpm
location_href: Packages/python-acoutreams-help-0.1.14-1.noarch.rpm
checksum_type: sha256
description:
  The package `acoutreams` adopts the framework of the `treams` package for acoustic wave scattering in finite and periodic arrangements of particles, based on the T-matrix method.





  To install the package with pip, use

  ```sh
  pip install acoutreams
  ```
  Preliminarily, you have to also install original `treams` as well as `numpy` and `scipy`
  ```sh
  pip install treams
  ```



  The documentation can be found at https://nikustimenko.github.io/acoutreams.



  When using this code please cite:



  * [x] T-matrix calculations using a spherical or cylindrical wave basis set
  * [x] Scattering from clusters of particles
  * [x] Scattering from particles and clusters arranged in 3d-, 2d-, and 1d-lattices
  * [x] Calculation of sound propagation in stratified media
  * [x] Band calculation in crystal structures


pkgId: 08967fb30397ff59fc65c561acda14bc9e51c347b5f4411b91f8fa7a02d473f5
name: python-acribis-scores-help
arch: noarch
version: 0.1.2
epoch: 0
release: 1
summary: Development documents and examples for acribis-scores
url: https://github.com/IMI-HD/acribis_scores_python
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acribis-scores-0.1.2-1.src.rpm
location_href: Packages/python-acribis-scores-help-0.1.2-1.noarch.rpm
checksum_type: sha256
description:
  _(**C**ongestive heart failure/Left ventricular dysfunction, **H**ypertension, **A**ge ≥ 75 years, **D**iabetes mellitus,
  Prior **S**troke/Transient ischaemic attack/Thromboembolism, **V**ascular disease, **A**ge 65-74 years, **S**ex **c**ategory)_

  Original publication: https://doi.org/10.1378/chest.09-1584

  Predicts the 1-year risk of thromboembolic events in patients with atrial fibrillation (AF)



  _(**H**ypertension, **A**bnormal renal and liver function, **S**troke, **B**leeding,
  **L**abile international normalized ratios, **E**lderly, **D**rugs or alcohol)_

  Original publication: https://doi.org/10.1378/chest.10-0134

  Predicts the 1-year risk of major bleeding in AF patients



  _(**A**ge, **B**iomarker, **C**linical history)_

  **Stroke**

  Original publication: https://doi.org/10.1093/eurheartj/ehw054
  <br/>
  Recalibration: https://doi.org/10.1161/CIRCULATIONAHA.120.053100

  Predicts the 1-year risk of stroke in AF patients

  **Bleeding**

  Original publication: https://doi.org/10.1016/S0140-6736(16)00741-8
  <br/>
  Recalibration: https://doi.org/10.1161/CIRCULATIONAHA.120.053100

  Predicts the 1-year risk of bleeding in AF patients

  **Death**

  Original publication: https://doi.org/10.1093/eurheartj/ehx584

  Predicts the 1-year risk of death in AF patients



  _(**C**ohorts for **H**eart and **A**ging **R**esearch in **G**enomic **E**pidemiology)_

  Original publication: https://doi.org/10.1161/JAHA.112.000102

  Predicts the 5-year incidence of AF



  _(**S**econdary **M**anifestations of **ART**erial disease)_

  Original publication: https://doi.org/10.1136/heartjnl-2013-303640

  Recalibration: https://doi.org/10.1161/CIRCULATIONAHA.116.021314

  Assumptions on the effects of antithrombotic treatment: https://doi.org/10.1016/S0140-6736(09)60503-1

  Predicts the 10-year risk of recurrent ischaemic events in patients with pre-existing vascular disease



  _(**S**econdary **M**anifestations of **ART**erial disease-**RE**duction of **A**therothrombosis for **C**ontinued **H**ealth)_

  Original publication: https://doi.org/10.1161/JAHA.118.009217

  Predicts the 10-year risk and lifetime risk (i.e. risk until age 90 years) for (recurrent) myocardial infarction,
  stroke or vascular death and (recurrent) event free life-expectancy



  _(**M**eta-**A**nalysis **G**lobal **G**roup **I**n **C**hronic Heart Failure )_

  Original publication: https://doi.org/10.1093/eurheartj/ehs337

  > [!IMPORTANT]
  > The implementation differs from the formula presented in the article!
  >
  > **Statement on the website of the online calculator:**
  > <br>
  > From 18 September 2013, the integer score will increase by 2 if heart failure was diagnosed > 18 months ago.
  > This may affect a comparison of the current result to risk assessments before this date.

  Calculator returns integer risk score, can be used to look up 1- and 3-year risk of death for patients with heart failure (HF)



  Original publication (v1): https://doi.org/10.1371/journal.pone.0085466

  Recalibration (v2): https://doi.org/10.1002/ejhf.949

  Recalibration (v3): https://doi.org/10.1002/ejhf.2752

  Predicts risk of all-cause death, HF-related hospital readmission, the combination of both endpoints, and life expectancy

  Predicts the risk at 1 to 5 years



  Preliminary results presented at GMDS Jahrestagung 2024: https://doi.org/10.3205/24GMDS112





  ```Python
  pip install acribis-scores
  ```



  ```Shell

  git clone git@github.com:IMI-HD/acribis_scores_python.git
  cd acribis_scores_python


  py -m build


  py -m pip install dist/acribis_scores-<version>-py3-none-any.whl


  py src/demo/gui.py
  ```

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


pkgId: dfe02f9a456ad1c68a3e13455d6baa51dbbdec9dd7d3cc3a50c827786c6cb267
name: python-acryl-datahub-actions-help
arch: noarch
version: 0.1.5
epoch: 0
release: 1
summary: Development documents and examples for acryl-datahub-actions
url: https://datahubproject.io/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acryl-datahub-actions-0.1.5-1.src.rpm
location_href: Packages/python-acryl-datahub-actions-help-0.1.5-1.noarch.rpm
checksum_type: sha256
description:
  Welcome to DataHub Actions! The Actions framework makes responding to realtime changes in your Metadata Graph easy, enabling you to seamlessly integrate [DataHub](https://github.com/datahub-project/datahub) into a broader events-based architecture.

  For a detailed introduction, check out the [original announcement](https://www.youtube.com/watch?v=7iwNxHgqxtg&t=2189s) of the DataHub Actions Framework at the DataHub April 2022 Town Hall. For a more in-depth look at use cases and concepts, check out [DataHub Actions Concepts](../docs/concepts.md).



  To get started right away, check out the [DataHub Actions Quickstart](../docs/quickstart.md) Guide.




  The DataHub Actions CLI commands are an extension of the base `datahub` CLI commands. We recommend
  first installing the `datahub` CLI:

  ```shell
  python3 -m pip install --upgrade pip wheel setuptools
  python3 -m pip install --upgrade acryl-datahub
  datahub --version
  ```

  > Note that the Actions Framework requires a version of `acryl-datahub` >= v0.8.34




  Next, simply install the `acryl-datahub-actions` package from PyPi:

  ```shell
  python3 -m pip install --upgrade pip wheel setuptools
  python3 -m pip install --upgrade acryl-datahub-actions
  datahub actions version
  ```




  Actions are configured using a YAML file, much in the same way DataHub ingestion sources are. An action configuration file consists of the following

  1. Action Pipeline Name (Should be unique and static)
  2. Source Configurations
  3. Transform + Filter Configurations
  4. Action Configuration
  5. Pipeline Options (Optional)
  6. DataHub API configs (Optional - required for select actions)

  With each component being independently pluggable and configurable.

  ```yml

  name: <action-pipeline-name>


  source:
    type: <source-type>
    config:
      


  filter:
    event_type: <filtered-event-type>
    event:
      
      <filtered-event-fields>


  transform:
    - type: <transformer-type>
      config:
        


  action:
    type: <action-type>
    config:
      


  options:
    retry_count: 0 # The number of times to retry an Action with the same event. (If an exception is thrown). 0 by default.
    failure_mode: "CONTINUE" # What to do when an event fails to be processed. Either 'CONTINUE' to make progress or 'THROW' to stop the pipeline. Either way, the failed event will be logged to a failed_events.log file.
    failed_events_dir: "/tmp/datahub/actions"  # The directory in which to write a failed_events.log file that tracks events which fail to be processed. Defaults to "/tmp/logs/datahub/actions".


  datahub:
    server: "http://localhost:8080" # Location of DataHub API
    
  ```



  An simple configuration file for a "Hello World" action, which simply prints all events it receives, is

  ```yml

  name: "hello_world"

  source:
    type: "kafka"
    config:
      connection:
        bootstrap: ${KAFKA_BOOTSTRAP_SERVER:-localhost:9092}
        schema_registry_url: ${SCHEMA_REGISTRY_URL:-http://localhost:8081}

  action:
    type: "hello_world"
  ```

  We can modify this configuration further to filter for specific events, by adding a "filter" block.

  ```yml

  name: "hello_world"


  source:
    type: "kafka"
    config:
      connection:
        bootstrap: ${KAFKA_BOOTSTRAP_SERVER:-localhost:9092}
        schema_registry_url: ${SCHEMA_REGISTRY_URL:-http://localhost:8081}


  filter:
    event_type: "EntityChangeEvent_v1"
    event:
      category: "TAG"
      operation: "ADD"
      modifier: "urn:li:tag:pii"


  action:
    type: "hello_world"
  ```




  To run a new Action, just use the `actions` CLI command

  ```
  datahub actions -c <config.yml>
  ```

  Once the Action is running, you will see

  ```
  Action Pipeline with name '<action-pipeline-name>' is now running.
  ```



  You can run multiple actions pipeline within the same command. Simply provide multiple
  config files by restating the "-c" command line argument.

  For example,

  ```
  datahub actions -c <config-1.yaml> -c <config-2.yaml>
  ```



  Simply append the `--debug` flag to the CLI to run your action in debug mode.

  ```
  datahub actions -c <config.yaml> --debug
  ```



  Just issue a Control-C as usual. You should see the Actions Pipeline shut down gracefully, with a small
  summary of processing results.

  ```
  Actions Pipeline with name '<action-pipeline-name' has been stopped.
  ```




  Two event types are currently supported. Read more about them below.

  - [Entity Change Event V1](../docs/events/entity-change-event.md)
  - [Metadata Change Log V1](../docs/events/metadata-change-log-event.md)




  Currently, the only event source that is officially supported is `kafka`, which polls for events
  via a Kafka Consumer.

  - [Kafka Event Source](../docs/sources/kafka-event-source.md)




  By default, DataHub supports a set of standard actions plugins. These can be found inside the folder
  `src/datahub-actions/plugins`.

  Some pre-included Actions include

  - [Hello World](../docs/actions/hello_world.md)
  - [Executor](../docs/actions/executor.md)






  Notice that we support all actions command using a separate `datahub-actions` CLI entry point. Feel free
  to use this during development.

  ```

  ./gradlew datahub-actions:build


  cd datahub-actions && source venv/bin/activate


  datahub-actions actions -c ../examples/hello_world.yaml


  datahub-actions actions -c ../examples/executor.yaml


  datahub-actions actions -c ../examples/executor.yaml -c ../examples/hello_world.yaml
  ```



  To develop a new Transformer, check out the [Developing a Transformer](../docs/guides/developing-a-transformer.md) guide.



  To develop a new Action, check out the [Developing an Action](../docs/guides/developing-an-action.md) guide.




  Contributing guidelines follow those of the [main DataHub project](https://github.com/datahub-project/datahub/blob/master/docs/CONTRIBUTING.md). We are accepting contributions for Actions, Transformers, and general framework improvements (tests, error handling, etc).




  Check out the [original announcement](https://www.youtube.com/watch?v=7iwNxHgqxtg&t=2189s) of the DataHub Actions Framework at the DataHub April 2022 Town Hall.




  [Apache 2.0](./LICENSE)


pkgId: 30bd15f81a3a96085e32aed2a706650d0b3f280ac28fdd02aacc2612f9f8586e
name: python-acryl-datahub-airflow-plugin-help
arch: noarch
version: 0.14.1.12
epoch: 0
release: 1
summary: Development documents and examples for acryl-datahub-airflow-plugin
url: https://datahubproject.io/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acryl-datahub-airflow-plugin-0.14.1.12-1.src.rpm
location_href: Packages/python-acryl-datahub-airflow-plugin-help-0.14.1.12-1.noarch.rpm
checksum_type: sha256
description:
  See [the DataHub Airflow docs](https://datahubproject.io/docs/lineage/airflow) for details.



  See the [developing docs](../../metadata-ingestion/developing.md).


pkgId: 706114fa1e84aff32982e7bf465293b29491a8cfe2420b2d8d14131d0c1bce26
name: python-acryl-datahub-help
arch: noarch
version: 0.14.1.12
epoch: 0
release: 1
summary: Development documents and examples for acryl-datahub
url: https://datahubproject.io/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acryl-datahub-0.14.1.12-1.src.rpm
location_href: Packages/python-acryl-datahub-help-0.14.1.12-1.noarch.rpm
checksum_type: sha256
description:
  The `acryl-datahub` package contains a CLI and SDK for interacting with DataHub,
  as well as an integration framework for pulling/pushing metadata from external systems.

  See the [DataHub docs](https://datahubproject.io/docs/metadata-ingestion).


pkgId: 51863b2028f53fa516b69ac7a8b0f5f7099e27d9d07ec0a9cd0f61ae56e41238
name: python-acryl-executor-help
arch: noarch
version: 0.1.5
epoch: 0
release: 1
summary: Development documents and examples for acryl-executor
url: https://datahubproject.io/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acryl-executor-0.1.5-1.src.rpm
location_href: Packages/python-acryl-executor-help-0.1.5-1.noarch.rpm
checksum_type: sha256
description:
  Remote execution agent used for running DataHub tasks, such as ingestion powered through the UI.


  ```bash
  python3 -m venv --upgrade-deps venv
  source venv/bin/activate
  pip3 install .
  ```



  By default, this library comes with a set of default task implementations:



  - **SubprocessProcessIngestionTask** - Executes a metadata ingestion run by spinning off a subprocess. Supports ingesting from a particular version, and with a specific plugin (based on the platform type requested)

  - **InMemoryIngestionTask** - Executes a metadata ingestion run using the datahub library in the same process. Not great for production where we can see strange dependency conflicts when certain packages are executed together. Use this for testing, as it has no ability to check out a specific DataHub Metadata Ingestion plugin.



  There is one implementation of a cloud logging client that writes logs to S3. This is used by the Acryl Executor to write logs to S3.
  To enable it you should set the following environment variables:
  `ENV DATAHUB_CLOUD_LOG_BUCKET` - The S3 bucket to write logs to
  `ENV DATAHUB_CLOUD_LOG_PATH` - The S3 path to write logs to

  The logs are compressed with tar and gzipped before being uploaded to S3 to the following path:
  `s3://CLOUD_LOG_BUCKET/CLOUD_LOG_PATH/<pipeline_id>/year=/month=/day=/<run_id>/`


pkgId: a81455f1f5a7ff413cec254456135c1022e8b5a0a485d1b78729c07d7368f527
name: python-actinia-api-help
arch: noarch
version: 3.6.0
epoch: 0
release: 1
summary: Development documents and examples for actinia-api
url: https://github.com/mundialis/actinia-api
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-actinia-api-3.6.0-1.src.rpm
location_href: Packages/python-actinia-api-help-3.6.0-1.noarch.rpm
checksum_type: sha256
description:
  API docs for actinia-core and plugins!

  OpenAPI is a project used to describe and document RESTful APIs.
  actinia is using swagger2, version upgrade is on the agena.

  In this repository all API docs should be collected. This way,
  the release of the API is not interconnected with the source
  code repositories anymore but independent versioning is used.

  Currently, the migration is still in progress and the API docs
  can be found here or still in the corresponding source code
  repository.


pkgId: 5b9c5ac3eaf849d1909b879591f1422cb1134876b81026ff89506911731fc767
name: python-actinia-module-plugin-help
arch: noarch
version: 2.7.0
epoch: 0
release: 1
summary: Development documents and examples for actinia-module-plugin
url: https://github.com/mundialis/actinia-module-plugin
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-actinia-module-plugin-2.7.0-1.src.rpm
location_href: Packages/python-actinia-module-plugin-help-2.7.0-1.noarch.rpm
checksum_type: sha256
description:
  You can run actinia-module-plugin as actinia-core plugin.


  For installation or DEV setup, see docker/README.md.


  see actinia-module.md





  __insprired by [this](https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/)__

  to create a shippable wheel, run
  ```bash
  pip3 install --upgrade pip pep517
  python3 -m pep517.build .
  ```



  [(MAJOR.MINOR.PATCH)](https://semver.org/)


  in any module, import `from actinia_module_plugin.resources.logging import log` and call logger with `log.info("my info i want to log")`



  You can run the tests in the actinia-modules-plugin-test docker. For that you can comment the execution of the test in the docker/actinia-modules-plugin-test/Dockerfile `RUN ./tests_with_redis.sh` and run the following commands:
  ```bash
  docker build -f docker/actinia-module-plugin-test/Dockerfile -t actinia-module-plugin-test .


  docker run -it actinia-module-plugin-test -i

  cd /src/actinia-module-plugin/


  ./tests_with_redis.sh
  ```


pkgId: 6b91b7132995a65a25941906a55194affac913ecc387e1f7145f217a1a06bca5
name: python-action-collective-help
arch: noarch
version: 0.0.2
epoch: 0
release: 1
summary: Development documents and examples for action-collective
url: https://github.com/CakeCrusher/ActionCollective
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-action-collective-0.0.2-1.src.rpm
location_href: Packages/python-action-collective-help-0.0.2-1.noarch.rpm
checksum_type: sha256
description:
  A framework for dynamic action generation and reuse with LLMs.



  ```bash
  pip install action-collective
  ```



  ```python
  from action_collective import ActionClient

  client = ActionClient(
      openai_api_key=os.getenv("OPENAI_API_KEY"),
      backend_url=os.getenv("BACKEND_URL", "http://70.179.0.242:11000"),
      verbose=True,
  )
  prompt = """Please perform the matrix multiplication of A x B and return the result, here are the variables:
  A = [[1, 2, 3, 4, 5],
          [6, 7, 7, 9, 10],
          [11, 12, 13, 14, 15],
          [16, 17, 7, 19, 20],
          [21, 22, 23, 24, 25]]
  B = [[1, 2, 3, 4, 5],
          [6, 7, 8, 9, 10],
          [11, 12, 7, 14, 15],
          [16, 17, 18, 19, 20],
          [21, 22, 23, 24, 25]]"""

  chat_history = [{"role": "user", "content": prompt}]

  result = await client.execute(chat_history=chat_history)
  print("\n\nresult:\n", json.dumps(result, indent=4), "\n\n")
  matrix = [
      [215, 230, 227, 260, 275],
      [479, 518, 515, 596, 635],
      [765, 830, 817, 960, 1025],
      [919, 998, 1035, 1156, 1235],
      [1315, 1430, 1407, 1660, 1775],
  ]

  assert result is not None
  for row in matrix:
      for number in row:
          assert str(number) in result[-1]["content"]
  print("\n\nPASSED\n\n")
  ```



  - Dynamic action generation
  - Action reuse through vector similarity
  - Automatic validation and testing
  - Easy integration with OpenAI models



  For full documentation, visit our [GitHub repository](https://github.com/yourusername/ActionCollective).


pkgId: b38b8271ec1f30b1ce5be14400ac50351372cd6ad1931ddede337917f4b6358d
name: python-actipy-help
arch: noarch
version: 3.4.2.post0
epoch: 0
release: 1
summary: Development documents and examples for actipy
url: https://github.com/OxWearables/actipy
rpm_license: See LICENSE.md
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-actipy-3.4.2.post0-1.src.rpm
location_href: Packages/python-actipy-help-3.4.2.post0-1.noarch.rpm
checksum_type: sha256
description:
  A Python package to process accelerometer data.

  Axivity3 and Axivity6 (`.cwa`), Actigraph (`.gt3x`), and GENEActiv (`.bin`) files are supported,
  as well as custom CSV files.

  Axivity3 is the activity tracker watch used in the large-scale
  [UK-Biobank accelerometer study](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0169649).





  - Python 3.8 or greater
      ```console
      $ python --version  # or python3 --version
      ```

  - Java 8 (1.8.0) or greater
      ```console
      $ java -version
      ```



  ```bash
  $ pip install actipy
  ```

  <!-- With Conda:
  ```bash
  $ conda install -c oxwear actipy
  ``` -->



  ```python
  import actipy

  data, info = actipy.read_device("sample.cwa.gz",  # or "sample.gt3x.gz" or "sample.bin.gz"
                                   lowpass_hz=20,
                                   calibrate_gravity=True,
                                   detect_nonwear=True,
                                   resample_hz=50)
  ```

  Output:
  ```console
  data [pandas.DataFrame]
                                   x         y         z  temperature      light
   time
   2014-05-07 13:29:50.430 -0.513990  0.070390  1.671922    20.000000  78.420235
   2014-05-07 13:29:50.440 -0.233940 -0.586568  0.082067    20.000000  78.420235
   2014-05-07 13:29:50.450 -0.080319 -0.950817 -0.810613    20.000000  78.420235
   2014-05-07 13:29:50.460 -0.067236 -0.975886 -0.865132    20.000000  78.420235
   2014-05-07 13:29:50.470 -0.109636 -0.857004 -0.508666    20.000000  78.420235
   ...                           ...       ...       ...          ...        ...

  info [dict]
   Filename                 : data/sample.cwa.gz
   Filesize(MB)             : 69.4
   Device                   : Axivity
   DeviceID                 : 13110
   ReadErrors               : 0
   SampleRate               : 100.0
   ReadOK                   : 1
   StartTime                : 2014-05-07 13:29:50
   EndTime                  : 2014-05-13 09:50:33
   NumTicks                 : 51391800
   WearTime(days)           : 5.847725231481482
   NumInterrupts            : 1
   ResampleRate             : 100.0
   NumTicksAfterResample    : 25262174
   LowpassOK                : 1
   LowpassCutoff(Hz)        : 20.0
   CalibErrorBefore(mg)     : 82.95806873592024
   CalibErrorAfter(mg)      : 4.434966371604519
   CalibOK                  : 1
   NonwearTime(days)        : 0.0
   NumNonwearEpisodes       : 0
   ...

  ```
  Refer to the [Data Dictionary](data-dictionary.md) for a comprehensive list of outputs.


  You can also use the routines in `actipy.processing` to process custom CSV files, or for more fine-grained control:

  ```python
  import actipy.processing as P

  data, info_lowpass = P.lowpass(data, 100, 20)
  data, info_calib = P.calibrate_gravity(data)
  data, info_nonwear = P.flag_nonwear(data)
  data, info_resample = P.resample(data, sample_rate)
  ```

  See the [documentation](https://actipy.readthedocs.io/en/latest/) for more.


  We also provide a command-line tool to process a device file (currently, only AX3 and AX6 are supported) and output to CSV:
  ```bash
  $ read_cwa sample.cwa.gz -o outputs --lowpass-hz 20 --resample-hz 50 --calibrate-gravity --detect-nonwear
  ```

  Outputs:
    - "outputs/sample/sample.csv.gz"
    - "outputs/sample/sample-Info.json"



  If you would like to contribute to this repository, please check out [CONTRIBUTING.md](https://github.com/OxWearables/actipy/blob/main/CONTRIBUTING.md).
  We welcome contributions in the form of bug reports, feature requests, and pull requests.


  See [LICENSE.md](LICENSE.md).


pkgId: 93cd12c4631694b916c366685ff80c03f49642816ab1343424159f94ad3b1188
name: python-acuvity-help
arch: noarch
version: 0.2.4
epoch: 0
release: 1
summary: Development documents and examples for acuvity
url: https://acuvity.ai/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-acuvity-0.2.4-1.src.rpm
location_href: Packages/python-acuvity-help-0.2.4-1.noarch.rpm
checksum_type: sha256
description:
  Developer-friendly & type-safe Python SDK specifically catered to leverage the Acuvity APIs - in particularly the Apex API.

  <div align="left">
      <a href="https://www.apache.org/licenses/LICENSE-2.0.html">
          <img src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" style="width: 100px; height: 28px;" />
      </a>
  </div>

  <!-- Start Summary [summary] -->


  Apex API: Acuvity Apex provides access to scan and detection APIs
  <!-- End Summary [summary] -->

  <!-- Start Table of Contents [toc] -->

  <!-- $toc-max-depth=2 -->
  * [acuvity](#acuvity)
    * [SDK Installation](#sdk-installation)
    * [IDE Support](#ide-support)
    * [SDK Example Usage](#sdk-example-usage)
    * [Available Resources and Operations](#available-resources-and-operations)
    * [Retries](#retries)
    * [Error Handling](#error-handling)
    * [Server Selection](#server-selection)
    * [Custom HTTP Client](#custom-http-client)
    * [Authentication](#authentication)
    * [Debugging](#debugging)
  * [Development](#development)
    * [Maturity](#maturity)
    * [Contributions](#contributions)

  <!-- End Table of Contents [toc] -->

  <!-- Start SDK Installation [installation] -->


  The SDK can be installed with either *pip* or *poetry* package managers.



  *PIP* is the default package installer for Python, enabling easy installation and management of packages from PyPI via the command line.

  ```bash
  pip install acuvity
  ```



  *Poetry* is a modern tool that simplifies dependency management and package publishing by using a single `pyproject.toml` file to handle project metadata and dependencies.

  ```bash
  poetry add acuvity
  ```
  <!-- End SDK Installation [installation] -->

  <!-- Start IDE Support [idesupport] -->




  Generally, the SDK will work well with most IDEs out of the box. However, when using PyCharm, you can enjoy much better integration with Pydantic by installing an additional plugin.

  - [PyCharm Pydantic Plugin](https://docs.pydantic.dev/latest/integrations/pycharm/)
  <!-- End IDE Support [idesupport] -->

  <!-- No SDK Example Usage [usage] -->




  For the most simple example of using the Scan API, ensure that you have your app token set in the `ACUVITY_TOKEN` environment variable.
  You can then run the following:

  ```python
  from acuvity import Acuvity

  c = Acuvity()
  res = c.apex.scan("My prompt I want to scan")
  print(res)
  ```

  Here is a more elaborate scan request using the Scan API and making use of the builtin context manager.

  ```python

  import acuvity
  from acuvity import Acuvity
  import os

  with Acuvity(
      security=acuvity.Security(
          
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.scan(
          "Using a weather forecasting service, provide me with a weather forecast for the next ten days for Sunnyvale, CA."
      )

      if res is not None:
          
          pass
  ```

  </br>

  The same SDK client can also be used to make asychronous requests by importing asyncio.
  ```python

  import acuvity
  from acuvity import Acuvity
  import asyncio
  import os

  async def main():
      async with Acuvity(
          security=acuvity.Security(
              
              token=os.getenv("ACUVITY_TOKEN", ""),
          ),
      ) as acuvity:

          res = await acuvity.apex.scan_async(
              "Using a weather forecasting service, provide me with a weather forecast for the next ten days for Sunnyvale, CA."
          )

          if res is not None:
              
              pass

  asyncio.run(main())
  ```



  Now you can list all available analyzers that can be used in the Scan API.

  ```python

  import acuvity
  from acuvity import Acuvity
  import os

  with Acuvity(
      security=acuvity.Security(
          
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.list_analyzers()

      if res is not None:
          
          pass
  ```

  </br>

  The same SDK client can also be used to make asychronous requests by importing asyncio.
  ```python

  import acuvity
  from acuvity import Acuvity
  import asyncio
  import os

  async def main():
      async with Acuvity(
          security=acuvity.Security(
              
              token=os.getenv("ACUVITY_TOKEN", ""),
          ),
      ) as acuvity:

          res = await acuvity.apex.list_analyzers_async()

          if res is not None:
              
              pass

  asyncio.run(main())
  ```

  **NOTE:** If you simply want to get a list of analyzer names or groups that can be used in the scan API, use `list_analyzer_names()` or `list_analyzer_groups()` instead.
  <!-- No SDK Example Usage [usage] -->

  <!-- Start Available Resources and Operations [operations] -->


  <details open>
  <summary>Available methods</summary>




  * [list_analyzers](docs/sdks/apex/README.md#list_analyzers) - List of all available analyzers.
  * [scan_request](docs/sdks/apex/README.md#scan_request) - Processes the scan request.

  </details>
  <!-- End Available Resources and Operations [operations] -->

  <!-- Start Retries [retries] -->


  Some of the endpoints in this SDK support retries. If you use the SDK without any configuration, it will fall back to the default retry strategy provided by the API. However, the default retry strategy can be overridden on a per-operation basis, or across the entire SDK.

  To change the default retry strategy for a single API call, simply provide a `RetryConfig` object to the call:
  ```python
  import acuvity
  from acuvity import Acuvity
  from acuvity.utils import BackoffStrategy, RetryConfig
  import os

  with Acuvity(
      security=acuvity.Security(
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.list_analyzers(,
          RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False))

      if res is not None:
          
          pass

  ```

  If you'd like to override the default retry strategy for all operations that support retries, you can use the `retry_config` optional parameter when initializing the SDK:
  ```python
  import acuvity
  from acuvity import Acuvity
  from acuvity.utils import BackoffStrategy, RetryConfig
  import os

  with Acuvity(
      retry_config=RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False),
      security=acuvity.Security(
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.list_analyzers()

      if res is not None:
          
          pass

  ```
  <!-- End Retries [retries] -->

  <!-- Start Error Handling [errors] -->


  Handling errors in this SDK should largely match your expectations. All operations return a response object or raise an exception.

  By default, an API error will raise a models.APIError exception, which has the following properties:

  | Property        | Type             | Description           |
  |-----------------|------------------|-----------------------|
  | `.status_code`  | *int*            | The HTTP status code  |
  | `.message`      | *str*            | The error message     |
  | `.raw_response` | *httpx.Response* | The raw HTTP response |
  | `.body`         | *str*            | The response content  |

  When custom error responses are specified for an operation, the SDK may also raise their associated exceptions. You can refer to respective *Errors* tables in SDK docs for more details on possible exception types for each operation. For example, the `list_analyzers_async` method may raise the following exceptions:

  | Error Type            | Status Code   | Content Type     |
  | --------------------- | ------------- | ---------------- |
  | models.Elementalerror | 400, 401, 500 | application/json |
  | models.APIError       | 4XX, 5XX      | \*/\*            |



  ```python
  import acuvity
  from acuvity import Acuvity, models
  import os

  with Acuvity(
      security=acuvity.Security(
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:
      res = None
      try:

          res = acuvity.apex.list_analyzers()

          if res is not None:
              
              pass

      except models.Elementalerror as e:
          
          raise(e)
      except models.APIError as e:
          
          raise(e)
  ```
  <!-- End Error Handling [errors] -->

  <!-- No Server Selection [server] -->




  The default server `https://{apex_domain}:{apex_port}` contains variables and is set to `https://apex.acuvity.ai:443` by default. Note that the default values **DO NOT** point to a valid and existing Apex URL as they are specific and unique to every organization. Therefore both variables must be set. The following parameters are available when initializing the SDK client instance:
   * `apex_domain: str`
   * `apex_port: str`

  However, if no `server_url` or `apex_domain` is set, the Apex URL is being automatically determined based on the provided token (either inside of the `Security` object or set in the `ACUVITY_TOKEN` environment variable).
  Note that this is going to make additional internal (synchronous) API calls to the Acuvity backend to determine the Apex URL.
  This is a one-time operation that runs during the initialization of the `Acuvity` class.



  The default server can also be overridden globally by passing a URL to the `server_url: str` optional parameter when initializing the SDK client instance. For example:
  ```python
  import acuvity
  from acuvity import Acuvity
  import os

  with Acuvity(
      server_url="https://apex.acuvity.ai:443",
      security=acuvity.Security(
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.list_analyzers()

      if res is not None:
          
          pass

  ```
  <!-- No Server Selection [server] -->

  <!-- Start Custom HTTP Client [http-client] -->


  The Python SDK makes API calls using the [httpx](https://www.python-httpx.org/) HTTP library.  In order to provide a convenient way to configure timeouts, cookies, proxies, custom headers, and other low-level configuration, you can initialize the SDK client with your own HTTP client instance.
  Depending on whether you are using the sync or async version of the SDK, you can pass an instance of `HttpClient` or `AsyncHttpClient` respectively, which are Protocol's ensuring that the client has the necessary methods to make API calls.
  This allows you to wrap the client with your own custom logic, such as adding custom headers, logging, or error handling, or you can just pass an instance of `httpx.Client` or `httpx.AsyncClient` directly.

  For example, you could specify a header for every request that this sdk makes as follows:
  ```python
  from acuvity import Acuvity
  import httpx

  http_client = httpx.Client(headers={"x-custom-header": "someValue"})
  s = Acuvity(client=http_client)
  ```

  or you could wrap the client with your own custom logic:
  ```python
  from acuvity import Acuvity
  from acuvity.httpclient import AsyncHttpClient
  import httpx

  class CustomClient(AsyncHttpClient):
      client: AsyncHttpClient

      def __init__(self, client: AsyncHttpClient):
          self.client = client

      async def send(
          self,
          request: httpx.Request,
          *,
          stream: bool = False,
          auth: Union[
              httpx._types.AuthTypes, httpx._client.UseClientDefault, None
          ] = httpx.USE_CLIENT_DEFAULT,
          follow_redirects: Union[
              bool, httpx._client.UseClientDefault
          ] = httpx.USE_CLIENT_DEFAULT,
      ) -> httpx.Response:
          request.headers["Client-Level-Header"] = "added by client"

          return await self.client.send(
              request, stream=stream, auth=auth, follow_redirects=follow_redirects
          )

      def build_request(
          self,
          method: str,
          url: httpx._types.URLTypes,
          *,
          content: Optional[httpx._types.RequestContent] = None,
          data: Optional[httpx._types.RequestData] = None,
          files: Optional[httpx._types.RequestFiles] = None,
          json: Optional[Any] = None,
          params: Optional[httpx._types.QueryParamTypes] = None,
          headers: Optional[httpx._types.HeaderTypes] = None,
          cookies: Optional[httpx._types.CookieTypes] = None,
          timeout: Union[
              httpx._types.TimeoutTypes, httpx._client.UseClientDefault
          ] = httpx.USE_CLIENT_DEFAULT,
          extensions: Optional[httpx._types.RequestExtensions] = None,
      ) -> httpx.Request:
          return self.client.build_request(
              method,
              url,
              content=content,
              data=data,
              files=files,
              json=json,
              params=params,
              headers=headers,
              cookies=cookies,
              timeout=timeout,
              extensions=extensions,
          )

  s = Acuvity(async_client=CustomClient(httpx.AsyncClient()))
  ```
  <!-- End Custom HTTP Client [http-client] -->

  <!-- Start Authentication [security] -->




  This SDK supports the following security schemes globally:

  | Name     | Type   | Scheme      | Environment Variable |
  | -------- | ------ | ----------- | -------------------- |
  | `token`  | http   | HTTP Bearer | `ACUVITY_TOKEN`      |
  | `cookie` | apiKey | API key     | `ACUVITY_COOKIE`     |

  You can set the security parameters through the `security` optional parameter when initializing the SDK client instance. The selected scheme will be used by default to authenticate with the API for all operations that support it. For example:
  ```python
  import acuvity
  from acuvity import Acuvity
  import os

  with Acuvity(
      security=acuvity.Security(
          token=os.getenv("ACUVITY_TOKEN", ""),
      ),
  ) as acuvity:

      res = acuvity.apex.list_analyzers()

      if res is not None:
          
          pass

  ```
  <!-- End Authentication [security] -->

  <!-- Start Debugging [debug] -->


  You can setup your SDK to emit debug logs for SDK requests and responses.

  You can pass your own logger class directly into your SDK.
  ```python
  from acuvity import Acuvity
  import logging

  logging.basicConfig(level=logging.DEBUG)
  s = Acuvity(debug_logger=logging.getLogger("acuvity"))
  ```

  You can also enable a default debug logger by setting an environment variable `ACUVITY_DEBUG` to true.
  <!-- End Debugging [debug] -->

  <!-- Placeholder for Future Speakeasy SDK Sections -->





  This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning usage
  to a specific package version. This way, you can install the same version each time without breaking changes unless you are intentionally
  looking for the latest version.



  While we value open-source contributions to this SDK, this library is generated programmatically. Any manual changes added to internal files will be overwritten on the next generation.
  We look forward to hearing your feedback. Feel free to open a PR or an issue with a proof of concept and we'll do our best to include it in a future release.


pkgId: f33e8a5d3ff29ff9be33e40b3b28736b7500d7c05a3b59b0f43b7e1f0dd5b138
name: python-ada-py-help
arch: noarch
version: 0.3.6
epoch: 0
release: 1
summary: Development documents and examples for ada-py
url: https://github.com/Krande/adapy
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
rpm_sourcerpm: python-ada-py-0.3.6-1.src.rpm
location_href: Packages/python-ada-py-help-0.3.6-1.noarch.rpm
checksum_type: sha256
description:
  [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ada-py/badges/version.svg)](https://anaconda.org/conda-forge/ada-py)
  [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ada-py/badges/latest_release_date.svg)](https://anaconda.org/krande/ada-py)
  [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ada-py/badges/platforms.svg)](https://anaconda.org/conda-forge/ada-py)
  [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ada-py/badges/downloads.svg)](https://anaconda.org/conda-forge/ada-py)
  [![PyPi Badge](https://img.shields.io/pypi/v/ada-py)](https://pypi.org/project/ada-py/)

  A python library for working with structural analysis and design. This library should be considered as experimental.

  The recommended way of installing ada-py is by creating a new isolated environment for the installation like so:

  ```
  mamba create -n adaenv ada-py
  ```

  Here are some of the goals with `ada-py`:

  * Support reading, writing and modifying FE models and post-processing FE results
  * Support open source and commercial FE packages (based on what I use/would like to use regularly)
  * Support scriptable FE meshing
  * Support reading/writing CAD/BIM formats (STEP/IFC) & mesh formats (GLTF)
  * Use a CSG (Constructive Solid Geometry) core primitives library for boolean operations based on the IFC/STEP standards
  * Provide the building blocks for advanced parametric and procedural 3d model design and simulation workflows
  * The library should always strive for user ergonomics.



  Try ada-py online with code-aster and calculix pre-installed

  [![Binder-main](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Krande/adapy/main)


  * Feel free to start/join any informal topic related to adapy [here](https://github.com/Krande/adapy/discussions).
  * Issues related to adapy can be raised [here](https://github.com/Krande/adapy/issues)



  Some examples of using the ada-py package




  The following code

  ```python
  from ada import Assembly, Part, Beam

  a = Assembly("MyAssembly") / (Part("MyPart") / Beam("MyBeam", (0, 0, 0), (1, 0, 0), "IPE300"))
  a.to_ifc("C:/temp/myifc.ifc")
  ```

  creates an Ifc file containing an IfcBeam with the following hierarchy

      MyAssembly (IfSite)
          MyPart (IfcBuildingStorey)
              MyBeam (IfcBeam)

  ![Beam Visualized in BlenderBIM](docs/_static/figures/my_beam.png)

  The resulting IfcBeam (and corresponding hierarchy) shown in the figure above is taken from the awesome
  [blender](https://blender.org) plugin [blenderbim](https://blenderbim.org/).



  Here is an example showing the code for converting a sesam FEM file to abaqus and code aster

  _Note! Reading FEM load and step information is not supported, but might be added in the future._

  ```python
  import ada

  a = ada.from_fem('path_to_your_sesam_file.FEM')
  a.to_fem('name_of_my_analysis_file_deck_directory_abaqus', 'abaqus')
  a.to_fem('name_of_my_analysis_file_deck_directory_code_aster', 'code_aster')
  ```

  Current read support is: abaqus, code aster and sesam
  Current write support is: abaqus, code aster and sesam, calculix and usfos



  This example uses a function `beam_ex1` from [here](src/ada/param_models/fem_models.py) that returns an
  Assembly object with a single `Beam` with a few holes in it (to demonstrate a small portion of the steel detailing
  capabilities in ada and IFC) converted to a shell element mesh using a FE mesh recipe `create_beam_mesh` found
  [here](ada/fem/io/mesh/recipes.py).

  ```python
  from ada.param_models.fem_models import beam_ex1

  a = beam_ex1()

  a.to_fem("MyCantilever_abaqus", "abaqus", overwrite=True, execute=True, run_ext=True)
  a.to_fem("MyCantilever_calculix", "calculix", overwrite=True, execute=True)
  a.to_fem("MyCantilever_code_aster", "code_aster", overwrite=True, execute=True)
  ```

  after the code is executed you can look at the results using supported post-processing software or directly
  in python using Jupyter notebook/lab (currently only supported for Code Aster) for the FEA results.

  <img src="docs/_static/figures/fem_beam_paraview.png" alt="Calculix Results" height="220"/>
  <img src="docs/_static/figures/fem_beam_abaqus.png" alt="Abaqus Results" height="220"/>
  <img src="docs/_static/figures/code_aster_jupyter_displ.png" alt="Code Aster (jupyter) results" height="220"/>


  **Note!**

  The above example assumes you have installed Abaqus, Calculix and Code Aster locally on your computer.

  To set correct paths to your installations of FE software you wish to use there are a few ways of doing so.

  1. Add directory path of FE executable/batch to your system path.
  2. Add directory paths to system environment variables. This can be done by using the control panel or
     running the following from a cmd prompt with administrator rights:

  ```cmd
  :: Windows
  setx ADA_abaqus_exe <absolute path to abaqus.bat>
  setx ADA_calculix_exe <absolute path to ccx.exe>
  setx ADA_code_aster_exe <absolute path to as_run.bat>

  :: Linux?

  :: Mac?
  ```

  Note! It is very important that any paths containing whitespaces be converted to "shortened paths". To shorten a path
  on windows you can use the utility [pathcopycopy](https://pathcopycopy.github.io/).

  For installation files of open source FEM software such as Calculix and Code Aster, here are some links:

  * https://github.com/calculix/cae/releases (calculix CAE for windows/linux)
  * https://code-aster-windows.com/download/ (Code Aster for Windows Salome Meca v9.3.0)
  * https://www.code-aster.org/spip.php?rubrique21 (Code Aster for Linux)
  * https://salome-platform.org/downloads/current-version (Salome v9.6.0 for windows/linux)
  * https://prepomax.fs.um.si/downloads/ (PreProMax -> Calculix preprocessor)




  This project would never have been possible without the existing open source python and c++ libraries.
  Although listed in the package dependencies (which is a long list), here are some of the packages that are at the very
  core of adapy;

  * IfcOpenShell
  * OpenCascade
  * PythonOCC-Core
  * Gmsh
  * Trimesh

  A huge thanks to all involved in the development of the packages mentioned here and in the list of packages adapy
  depends on.

  If you feel that a certain package listed in the adapy dependencies should be listed here please let me know and I will
  update the list :)




  	Kristoffer H. Andersen


