# packages

pkgId: 681d864b6eda0382eef1371e0b7638dd4c6193658e308865b6a73d18f3be4b6d
name: python-adaptive-cards-py
arch: src
version: 0.1.1
epoch: 0
release: 1
summary: Python wrapper library for building beautiful adaptive cards
url: https://github.com/dennis6p/adaptive-cards-py
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptive-cards-py-0.1.1-1.src.rpm
checksum_type: sha256
description:
  - [About](#about)
  - [Features](#features)
  - [Dependencies](#dependencies)
  - [Installation](#installation)
  - [Library structure](#library-structure)
  - [Usage](#usage)
    - [A simple card](#a-simple-card)
    - [Adding multiple elements at once](#adding-multiple-elements-at-once)
    - [A more complex card](#a-more-complex-card)
    - [Validate schema](#validate-schema)
    - [Send card to MS Teams](#send-card-to-ms-teams)
  - [Examples](#examples)
  - [Contribution](#contribution)

  [![PyPI version](https://badge.fury.io/py/adaptive-cards-py.svg)](https://pypi.org/project/adaptive-cards-py/)

  A thin Python wrapper for creating [**Adaptive Cards**](https://adaptivecards.io/) easily on code level. The deep integration of Python's `typing` package prevents you from creating invalid schemes and guides you while creating visual apealing cards.

  If you are interested in the general concepts of adaptive cards and want to dig a bit deeper, have a look into the [**official documentation**](https://learn.microsoft.com/en-us/adaptive-cards/) or start a jump start and get used to the [**schema**](https://adaptivecards.io/explorer/).

  💡 **Please note**
  <br>This library is still in progress and is lacking some features. However, missing fractions are planned to be added soon.



  This library is intended to provide a clear and simple interface for creating adaptive cards with only a few lines of code in a more robust way. The heavy usage of Python's typing library should
  prevent one from creating invalid schemes and structures. Instead, creating cards and sending cards should be intuitive and work like a breeze.

  For a comprehensive introduction into the main ideas and patterns of adaptive cards, have a look on the [**official documentation**](https://docs.microsoft.com/en-us/adaptive-cards). I also recommend using the [**schema explorer**](https://adaptivecards.io/explorer) page alongside the implementation, since the library's type system relies on these schemes.

  💡 **Please note**
  <br>It's highly recommended to turn on the **type check** capabilities for Python in your editor. This will serve you with direct feedback about the structures you create. If you are trying to assign values of incompatible types, your editor will mark it as such and yell at you right in the moment you are about to do so.



  + Type annotated components based on Python's **dataclasses**
  + Schema validation for version compatibility
  + Simple `JSON` export
  + Compliant with the official structures and ideas
  + Send cards to MS Teams via `TeamsClient`



  * Python 3.10+
  * `dataclasses-json`
  * `StrEnum`
  * `requests`



  ```bash
  pip install adaptive-cards-py
  ```



  **Adaptive cards** can consist of different kind of components. The four main categories beside the actual cards are **Elements**, **Containers**, **Actions** and **Inputs**. You can find all available components for each category within the corresponding file. The `AdaptiveCard` is defined in `cards.py`.

  In addition to that, some fields of certain components are of custom types. These types are living inside the `card_types.py` file. For instance, if you are about to assign a color to a `TextBlock`, the field `color` will only accept a value of type `Colors`, which is implemented in the aforementioned Python file.

  To perform validation on a fully initialized card, one can make use of the `SchemaValidator` class. Similar to the whole library, this class provides a simple interface with only on method. The validation currently checks whether all used fields are compliant with the overall card version





  A simple `TextBlock` lives in the `elements` module and can be used after it's import.

  ```Python
  from adaptive_cards.elements import TextBlock

  text_block: TextBlock = TextBlock(text="It's your first card")
  ```
  For this component, `text` is the only required property. However, if more customization is needed, further available fields can be used.

  ```Python
  from adaptive_cards.elements import TextBlock
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your second card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )
  ```

  An actual card with only this component can be created like this.

  ```Python
  from adaptive_cards.card import AdaptiveCard

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_item(text_block) \
                                   .create()
  ```

  Find your final layout below.

  ![simple card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card.jpg?raw=true)

  💡 **Please note**
  <br>After building the object is done, the `create(...)` method must be called in order to create the final object. In this case, the object will be of type `AdaptiveCard`.

  To directly export your result, make use of the
  `to_json()` method provided by every card.

  ```Python
  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())

  ```



  Assuming you have a bunch of elements you want your card to enrich with. There is also a method for doing so. Let's re-use the example from before, but add another `Image` element here as well.

  ```Python
  from adaptive_cards.elements import TextBlock, Image
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your third card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )

  image: Image = Image(url="https://adaptivecards.io/content/bf-logo.png")

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()









  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())
  ```

  This will result in a card like shown below.

  ![simple card 2](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card_2.jpg?raw=true)



  You can have a look on the following example for getting an idea of what's actually possible
  with adaptive cards.

  ![wrap up card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/wrap_up_card/wrap_up_card.jpg?raw=true)

  <details>
  <summary>Code</summary>

  ```python
  import adaptive_cards.card_types as types
  from adaptive_cards.actions import ActionToggleVisibility, TargetElement
  from adaptive_cards.validation import SchemaValidator, Result
  from adaptive_cards.card import AdaptiveCard
  from adaptive_cards.elements import TextBlock, Image
  from adaptive_cards.containers import Container, ContainerTypes, ColumnSet, Column

  containers: list[ContainerTypes] = []

  icon_source: str = "https://icons8.com/icon/vNXFqyQtOSbb/launch"
  icon_url: str = "https://img.icons8.com/3d-fluency/94/launched-rocket.png"

  header_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(
              items=[
                  TextBlock(text="Your Daily Wrap-Up", size=types.FontSize.EXTRA_LARGE)
              ],
              width="stretch",
          ),
          Column(items=[Image(url=icon_url, width="40px")], rtl=True, width="auto"),
      ]
  )
  containers.append(
      Container(
          items=[header_column_set], style=types.ContainerStyle.EMPHASIS, bleed=True
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Some numbers for you**",
                  size=types.FontSize.MEDIUM,
              ),
              ColumnSet(
                  columns=[
                      Column(
                          items=[
                              TextBlock(text="_Total_"),
                              TextBlock(text="_Done by you_"),
                              TextBlock(text="_Done by other teams_"),
                              TextBlock(text="_Still open_"),
                              TextBlock(text="_Closed_"),
                          ]
                      ),
                      Column(
                          items=[
                              TextBlock(text="5"),
                              TextBlock(text="4"),
                              TextBlock(text="3"),
                              TextBlock(text="6"),
                              TextBlock(text="1"),
                          ],
                          spacing=types.Spacing.MEDIUM,
                          rtl=True,
                      ),
                  ],
                  separator=True,
              ),
          ],
          spacing=types.Spacing.MEDIUM,
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Detailed Results**",
                  size=types.FontSize.MEDIUM,
              ),
          ],
          separator=True,
          spacing=types.Spacing.EXTRA_LARGE,
      )
  )

  sample_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(items=[TextBlock(text="12312")]),
          Column(items=[TextBlock(text="done", color=types.Colors.GOOD)]),
          Column(items=[TextBlock(text="abc")]),
          Column(
              items=[
                  Image(
                      url="https://adaptivecards.io/content/down.png",
                      width="20px",
                      horizontal_alignment=types.HorizontalAlignment.RIGHT,
                  )
              ],
              select_action=ActionToggleVisibility(
                  title="More",
                  target_elements=[
                      TargetElement(
                          element_id="toggle-me",
                      )
                  ],
              ),
          ),
      ]
  )

  containers.append(
      Container(
          items=[
              Container(
                  items=[
                      ColumnSet(
                          columns=[
                              Column(items=[TextBlock(text="**Number**")]),
                              Column(items=[TextBlock(text="**Status**")]),
                              Column(items=[TextBlock(text="**Topic**")]),
                              Column(items=[TextBlock(text="")]),
                          ],
                          id="headline",
                      ),
                  ],
                  style=types.ContainerStyle.EMPHASIS,
                  bleed=True,
              ),
              Container(items=[sample_column_set]),
              Container(
                  items=[
                      TextBlock(
                          text="_Here you gonna find more information about the whole topic_",
                          id="toggle-me",
                          is_visible=False,
                          is_subtle=True,
                          wrap=True,
                      )
                  ]
              ),
          ],
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text=f"Icon used from: {icon_source}",
                  size=types.FontSize.SMALL,
                  horizontal_alignment=types.HorizontalAlignment.CENTER,
                  is_subtle=True,
              )
          ]
      )
  )

  card = AdaptiveCard.new().version("1.5").add_items(containers).create()

  validator: SchemaValidator = SchemaValidator()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")

  ```

  </details>

  <details>
  <summary>Schema</summary>

  ```json
  {
      "type": "AdaptiveCard",
      "version": "1.5",
      "schema": "http://adaptivecards.io/schemas/adaptive-card.json",
      "body": [
          {
              "items": [
                  {
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "Your Daily Wrap-Up",
                                      "type": "TextBlock",
                                      "size": "extraLarge"
                                  }
                              ],
                              "width": "stretch"
                          },
                          {
                              "items": [
                                  {
                                      "url": "https://img.icons8.com/3d-fluency/94/launched-rocket.png",
                                      "type": "Image",
                                      "width": "40px"
                                  }
                              ],
                              "rtl": true,
                              "width": "auto"
                          }
                      ]
                  }
              ],
              "type": "Container",
              "style": "emphasis",
              "bleed": true
          },
          {
              "spacing": "medium",
              "items": [
                  {
                      "text": "**Some numbers for you**",
                      "type": "TextBlock",
                      "size": "medium"
                  },
                  {
                      "separator": true,
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "_Total_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by you_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by other teams_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Still open_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Closed_",
                                      "type": "TextBlock"
                                  }
                              ]
                          },
                          {
                              "spacing": "medium",
                              "items": [
                                  {
                                      "text": "5",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "4",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "3",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "6",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "1",
                                      "type": "TextBlock"
                                  }
                              ],
                              "rtl": true
                          }
                      ]
                  }
              ],
              "type": "Container"
          },
          {
              "separator": true,
              "spacing": "extraLarge",
              "items": [
                  {
                      "text": "**Detailed Results**",
                      "type": "TextBlock",
                      "size": "medium"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "items": [
                          {
                              "id": "headline",
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "**Number**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Status**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Topic**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  }
                              ]
                          }
                      ],
                      "type": "Container",
                      "style": "emphasis",
                      "bleed": true
                  },
                  {
                      "items": [
                          {
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "12312",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "done",
                                              "type": "TextBlock",
                                              "color": "good"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "abc",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "url": "https://adaptivecards.io/content/down.png",
                                              "type": "Image",
                                              "horizontalAlignment": "right",
                                              "width": "20px"
                                          }
                                      ],
                                      "selectAction": {
                                          "title": "More",
                                          "targetElements": [
                                              {
                                                  "elementId": "toggle-me"
                                              }
                                          ],
                                          "type": "Action.ToggleVisibility"
                                      }
                                  }
                              ]
                          }
                      ],
                      "type": "Container"
                  },
                  {
                      "items": [
                          {
                              "id": "toggle-me",
                              "isVisible": false,
                              "text": "_Here you gonna find more information about the whole topic_",
                              "type": "TextBlock",
                              "isSubtle": true,
                              "wrap": true
                          }
                      ],
                      "type": "Container"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "text": "Icon used from: https://icons8.com/icon/vNXFqyQtOSbb/launch",
                      "type": "TextBlock",
                      "horizontalAlignment": "center",
                      "isSubtle": true,
                      "size": "small"
                  }
              ],
              "type": "Container"
          }
      ]
  }
  ```

  </details>

  But we are still scratching the surface. You can do even better!



  New components and fields are getting introduced every now and then. This means, if you are using an early version for a card and add fields, which are not compliant with it, you will have an invalid schema. To prevent you from exporting fields not yet supported by the card and target framework, a schema validation can be performed. It's as simple as that:

  ```Python
  from adaptive_cards.validator import SchemaValidator, Result

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()

  validator: SchemaValidator = SchemaValidator()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")

  ```



  Of course, you want to create those cards for a reason. So once you did that, you might want to send it to one of the compatible services like MS Teams. See the following example, how this can be done, assuming that all previously mentioned steps are done prior to that:

  ```python

  ...

  from adaptive_cards.clients import TeamsClient
  from requests import Response

  ...


  webhook_url: str = "YOUR-URL"
  client: TeamsClient = TeamsClient(webhook_url)
  response: Response = client.send(card)

  new_webhook_url: str = "YOUR-URL-OF-SECOND-CHANNEL"
  client.set_webhook_url(new_webhook_url)
  response: Response = client.send(card)

  ...

  ```

  So far, there is only a MS Teams client available. If further services should be supported, give me some feedback by opening an Issue for instance.

  Find further information about sending cards or creating Webhooks to/in MS Teams [__here__](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498).



  If you are interested in more comprehensive examples or the actual source code, have a look into the `examples` folder.



  Feel free to create issues, fork the repository or even come up with a pull request. I am happy about any kind of contribution and would love
  to hear your feedback!

rpm_license:
  MIT License  Copyright (c) 2023 Dennis Eder  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: 94b835f83f5a068614a57851f6640b2ad68a97ba7bad41be6f6d3d0941313d40
name: python-adaptive-cards-py
arch: src
version: 0.2.0
epoch: 0
release: 1
summary: Python wrapper library for building beautiful adaptive cards
url: https://github.com/dennis6p/adaptive-cards-py
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptive-cards-py-0.2.0-1.src.rpm
checksum_type: sha256
description:
  - [About](#about)
  - [Features](#features)
  - [Dependencies](#dependencies)
  - [Installation](#installation)
  - [Library structure](#library-structure)
  - [Usage](#usage)
    - [A simple card](#a-simple-card)
    - [Adding multiple elements at once](#adding-multiple-elements-at-once)
    - [A more complex card](#a-more-complex-card)
    - [Validate schema](#validate-schema)
    - [Send card to MS Teams](#send-card-to-ms-teams)
  - [Examples](#examples)
  - [Feature Roadmap](#feature-roadmap)
  - [Contribution](#contribution)

  [![PyPI version](https://badge.fury.io/py/adaptive-cards-py.svg)](https://pypi.org/project/adaptive-cards-py/)

  A thin Python wrapper for creating [**Adaptive Cards**](https://adaptivecards.io/) easily on code level. The deep integration of Python's `typing` package prevents you from creating invalid schemes and guides you while creating visual apealing cards.

  If you are interested in the general concepts of adaptive cards and want to dig a bit deeper, have a look into the [**official documentation**](https://learn.microsoft.com/en-us/adaptive-cards/) or start a jump start and get used to the [**schema**](https://adaptivecards.io/explorer/).

  💡 **Please note**
  <br>This library is work in progress and is lacking some features which might come in handy. Missing parts are planned to be added from time to time.



  This library is intended to provide a clear and simple interface for creating adaptive cards with only a few lines of code in a more robust way. The heavy usage of Python's typing library should
  prevent one from creating invalid schemes and structures. Instead, creating cards and sending cards should be intuitive and work like a breeze.

  For a comprehensive introduction into the main ideas and patterns of adaptive cards, have a look on the [**official documentation**](https://docs.microsoft.com/en-us/adaptive-cards). I also recommend using the [**schema explorer**](https://adaptivecards.io/explorer) page alongside the implementation, since the library's type system relies on these schemes.

  Further resources can be found here:

  * [__Format cards in Teams__](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cdesktop1%2Cdesktop2%2Cconnector-html)
  * [__Official repository__](https://github.com/microsoft/AdaptiveCards)

  💡 **Please note**
  <br> There are size limitations related to the traget framework a card is supposed to be used with. As of now, the maximum card size can be __28KB__ when used with Webhooks in Teams ([__Format cards in Teams__](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cdesktop1%2Cdesktop2%2Cconnector-html)). For bot frameworks the upper limit is set to __40KB__ ([__Format your bot messages__](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/format-your-bot-messages)). An corresponding check is planned to be added soon to the [`SchemaValidator`](#validate-schema).



  💡 **Please note**
  <br>It's highly recommended to turn on the **type check** capabilities for Python in your editor. This will serve you with direct feedback about the structures you create. If you are trying to assign values of incompatible types, your editor will mark it as such and yell at you right in the moment you are about to do so.

  + Type annotated components based on Python's **dataclasses**
  + Schema validation for version compatibility
  + Simple `JSON` export
  + Compliant with the official structures and ideas
  + Send cards to MS Teams via `TeamsClient`



  * Python 3.10+
  * `dataclasses-json`
  * `StrEnum`
  * `requests`



  ```bash
  pip install adaptive-cards-py
  ```



  **Adaptive cards** can consist of different kind of components. The four main categories beside the actual cards are **Elements**, **Containers**, **Actions** and **Inputs**. You can find all available components for each category within the corresponding file. The `AdaptiveCard` is defined in `cards.py`.

  In addition to that, some fields of certain components are of custom types. These types are living inside the `card_types.py` file. For instance, if you are about to assign a color to a `TextBlock`, the field `color` will only accept a value of type `Colors`, which is implemented in the aforementioned Python file.

  To perform validation on a fully initialized card, one can make use of the `SchemaValidator` class. Similar to the whole library, this class provides a simple interface with only on method. The validation currently checks whether all used fields are compliant with the overall card version





  A simple `TextBlock` lives in the `elements` module and can be used after it's import.

  ```Python
  from adaptive_cards.elements import TextBlock

  text_block: TextBlock = TextBlock(text="It's your first card")
  ```
  For this component, `text` is the only required property. However, if more customization is needed, further available fields can be used.

  ```Python
  from adaptive_cards.elements import TextBlock
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your second card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )
  ```

  An actual card with only this component can be created like this.

  ```Python
  from adaptive_cards.card import AdaptiveCard

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_item(text_block) \
                                   .create()
  ```

  Find your final layout below.

  ![simple card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card.jpg?raw=true)

  💡 **Please note**
  <br>After building the object is done, the `create(...)` method must be called in order to create the final object. In this case, the object will be of type `AdaptiveCard`.

  To directly export your result, make use of the
  `to_json()` method provided by every card.

  ```Python
  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())

  ```



  Assuming you have a bunch of elements you want your card to enrich with. There is also a method for doing so. Let's re-use the example from before, but add another `Image` element here as well.

  ```Python
  from adaptive_cards.elements import TextBlock, Image
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your third card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )

  image: Image = Image(url="https://adaptivecards.io/content/bf-logo.png")

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()









  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())
  ```

  This will result in a card like shown below.

  ![simple card 2](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card_2.jpg?raw=true)



  You can have a look on the following example for getting an idea of what's actually possible
  with adaptive cards.

  ![wrap up card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/wrap_up_card/wrap_up_card.jpg?raw=true)

  <details>
  <summary>Code</summary>

  ```python
  import adaptive_cards.card_types as types
  from adaptive_cards.actions import ActionToggleVisibility, TargetElement
  from adaptive_cards.validation import SchemaValidator, Result
  from adaptive_cards.card import AdaptiveCard
  from adaptive_cards.elements import TextBlock, Image
  from adaptive_cards.containers import Container, ContainerTypes, ColumnSet, Column

  containers: list[ContainerTypes] = []

  icon_source: str = "https://icons8.com/icon/vNXFqyQtOSbb/launch"
  icon_url: str = "https://img.icons8.com/3d-fluency/94/launched-rocket.png"

  header_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(
              items=[
                  TextBlock(text="Your Daily Wrap-Up", size=types.FontSize.EXTRA_LARGE)
              ],
              width="stretch",
          ),
          Column(items=[Image(url=icon_url, width="40px")], rtl=True, width="auto"),
      ]
  )
  containers.append(
      Container(
          items=[header_column_set], style=types.ContainerStyle.EMPHASIS, bleed=True
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Some numbers for you**",
                  size=types.FontSize.MEDIUM,
              ),
              ColumnSet(
                  columns=[
                      Column(
                          items=[
                              TextBlock(text="_Total_"),
                              TextBlock(text="_Done by you_"),
                              TextBlock(text="_Done by other teams_"),
                              TextBlock(text="_Still open_"),
                              TextBlock(text="_Closed_"),
                          ]
                      ),
                      Column(
                          items=[
                              TextBlock(text="5"),
                              TextBlock(text="4"),
                              TextBlock(text="3"),
                              TextBlock(text="6"),
                              TextBlock(text="1"),
                          ],
                          spacing=types.Spacing.MEDIUM,
                          rtl=True,
                      ),
                  ],
                  separator=True,
              ),
          ],
          spacing=types.Spacing.MEDIUM,
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Detailed Results**",
                  size=types.FontSize.MEDIUM,
              ),
          ],
          separator=True,
          spacing=types.Spacing.EXTRA_LARGE,
      )
  )

  sample_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(items=[TextBlock(text="12312")]),
          Column(items=[TextBlock(text="done", color=types.Colors.GOOD)]),
          Column(items=[TextBlock(text="abc")]),
          Column(
              items=[
                  Image(
                      url="https://adaptivecards.io/content/down.png",
                      width="20px",
                      horizontal_alignment=types.HorizontalAlignment.RIGHT,
                  )
              ],
              select_action=ActionToggleVisibility(
                  title="More",
                  target_elements=[
                      TargetElement(
                          element_id="toggle-me",
                      )
                  ],
              ),
          ),
      ]
  )

  containers.append(
      Container(
          items=[
              Container(
                  items=[
                      ColumnSet(
                          columns=[
                              Column(items=[TextBlock(text="**Number**")]),
                              Column(items=[TextBlock(text="**Status**")]),
                              Column(items=[TextBlock(text="**Topic**")]),
                              Column(items=[TextBlock(text="")]),
                          ],
                          id="headline",
                      ),
                  ],
                  style=types.ContainerStyle.EMPHASIS,
                  bleed=True,
              ),
              Container(items=[sample_column_set]),
              Container(
                  items=[
                      TextBlock(
                          text="_Here you gonna find more information about the whole topic_",
                          id="toggle-me",
                          is_visible=False,
                          is_subtle=True,
                          wrap=True,
                      )
                  ]
              ),
          ],
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text=f"Icon used from: {icon_source}",
                  size=types.FontSize.SMALL,
                  horizontal_alignment=types.HorizontalAlignment.CENTER,
                  is_subtle=True,
              )
          ]
      )
  )

  card = AdaptiveCard.new().version("1.5").add_items(containers).create()

  validator: SchemaValidator = SchemaValidator()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")

  ```

  </details>

  <details>
  <summary>Schema</summary>

  ```json
  {
      "type": "AdaptiveCard",
      "version": "1.5",
      "schema": "http://adaptivecards.io/schemas/adaptive-card.json",
      "body": [
          {
              "items": [
                  {
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "Your Daily Wrap-Up",
                                      "type": "TextBlock",
                                      "size": "extraLarge"
                                  }
                              ],
                              "width": "stretch"
                          },
                          {
                              "items": [
                                  {
                                      "url": "https://img.icons8.com/3d-fluency/94/launched-rocket.png",
                                      "type": "Image",
                                      "width": "40px"
                                  }
                              ],
                              "rtl": true,
                              "width": "auto"
                          }
                      ]
                  }
              ],
              "type": "Container",
              "style": "emphasis",
              "bleed": true
          },
          {
              "spacing": "medium",
              "items": [
                  {
                      "text": "**Some numbers for you**",
                      "type": "TextBlock",
                      "size": "medium"
                  },
                  {
                      "separator": true,
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "_Total_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by you_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by other teams_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Still open_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Closed_",
                                      "type": "TextBlock"
                                  }
                              ]
                          },
                          {
                              "spacing": "medium",
                              "items": [
                                  {
                                      "text": "5",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "4",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "3",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "6",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "1",
                                      "type": "TextBlock"
                                  }
                              ],
                              "rtl": true
                          }
                      ]
                  }
              ],
              "type": "Container"
          },
          {
              "separator": true,
              "spacing": "extraLarge",
              "items": [
                  {
                      "text": "**Detailed Results**",
                      "type": "TextBlock",
                      "size": "medium"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "items": [
                          {
                              "id": "headline",
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "**Number**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Status**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Topic**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  }
                              ]
                          }
                      ],
                      "type": "Container",
                      "style": "emphasis",
                      "bleed": true
                  },
                  {
                      "items": [
                          {
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "12312",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "done",
                                              "type": "TextBlock",
                                              "color": "good"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "abc",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "url": "https://adaptivecards.io/content/down.png",
                                              "type": "Image",
                                              "horizontalAlignment": "right",
                                              "width": "20px"
                                          }
                                      ],
                                      "selectAction": {
                                          "title": "More",
                                          "targetElements": [
                                              {
                                                  "elementId": "toggle-me"
                                              }
                                          ],
                                          "type": "Action.ToggleVisibility"
                                      }
                                  }
                              ]
                          }
                      ],
                      "type": "Container"
                  },
                  {
                      "items": [
                          {
                              "id": "toggle-me",
                              "isVisible": false,
                              "text": "_Here you gonna find more information about the whole topic_",
                              "type": "TextBlock",
                              "isSubtle": true,
                              "wrap": true
                          }
                      ],
                      "type": "Container"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "text": "Icon used from: https://icons8.com/icon/vNXFqyQtOSbb/launch",
                      "type": "TextBlock",
                      "horizontalAlignment": "center",
                      "isSubtle": true,
                      "size": "small"
                  }
              ],
              "type": "Container"
          }
      ]
  }
  ```

  </details>

  But we are still scratching the surface. You can do even better!



  New components and fields are getting introduced every now and then. This means, if you are using an early version for a card and add fields, which are not compliant with it, you will have an invalid schema. To prevent you from exporting fields not yet supported by the card and target framework, a card validation can be performed for the expected [__target framework__](https://learn.microsoft.com/en-us/adaptive-cards/resources/partners#live). For MS Teams as the target framework, it would like like this:

  ```python
  from adaptive_cards.validator import (
      CardValidatorFactory,
      CardValidator,
      Result,
      Finding
  )

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()


  validator: CardValidator = CardValidatorFactory.create_validator_ms_teams()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")




  card_size: float = validator.card_size(card)
  print(card_size)



  details: list[Finding] = validator.details()




  ```



  Of course, you want to create those cards for a reason. So once you did that, you might want to send it to one of the compatible services like MS Teams. See the following example, how this can be done, assuming that all previously mentioned steps are done prior to that:

  ```python

  ...

  from adaptive_cards.clients import TeamsClient
  from requests import Response

  ...


  webhook_url: str = "YOUR-URL"
  client: TeamsClient = TeamsClient(webhook_url)
  response: Response = client.send(card)

  new_webhook_url: str = "YOUR-URL-OF-SECOND-CHANNEL"
  client.set_webhook_url(new_webhook_url)
  response: Response = client.send(card)

  ...

  ```

  So far, there is only a MS Teams client available. If further services should be supported, give me some feedback by opening an Issue for instance.

  Find further information about sending cards or creating Webhooks to/in MS Teams [__here__](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498).



  If you are interested in more comprehensive examples or the actual source code, have a look into the `examples` folder.



  * [x] Add size check to schema validation
  * [x] Add proper schema validation
  * [ ] Add further target framework validators
  * [ ] Provide more examples
  * [ ] Allow reading of json-like schemas



  Feel free to create issues, fork the repository or even come up with a pull request. I am happy about any kind of contribution and would love
  to hear your feedback!

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


pkgId: a976bfba98c2f523b6893fe43e95938caf7cc1c5f2da7484f712cbaefc747226
name: python-adaptive-cards-py
arch: src
version: 0.2.1
epoch: 0
release: 1
summary: Python wrapper library for building beautiful adaptive cards
url: https://github.com/dennis6p/adaptive-cards-py
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptive-cards-py-0.2.1-1.src.rpm
checksum_type: sha256
description:
  - [About](#about)
  - [Features](#features)
  - [Dependencies](#dependencies)
  - [Installation](#installation)
  - [Library structure](#library-structure)
  - [Usage](#usage)
    - [A simple card](#a-simple-card)
    - [Adding multiple elements at once](#adding-multiple-elements-at-once)
    - [A more complex card](#a-more-complex-card)
    - [Validate schema](#validate-schema)
    - [Send card to MS Teams](#send-card-to-ms-teams)
  - [Examples](#examples)
  - [Feature Roadmap](#feature-roadmap)
  - [Contribution](#contribution)

  [![PyPI version](https://badge.fury.io/py/adaptive-cards-py.svg)](https://pypi.org/project/adaptive-cards-py/)

  A thin Python wrapper for creating [**Adaptive Cards**](https://adaptivecards.io/) easily on code level. The deep integration of Python's `typing` package prevents you from creating invalid schemes and guides you while creating visual apealing cards.

  If you are interested in the general concepts of adaptive cards and want to dig a bit deeper, have a look into the [**official documentation**](https://learn.microsoft.com/en-us/adaptive-cards/) or start a jump start and get used to the [**schema**](https://adaptivecards.io/explorer/).

  💡 **Please note**
  <br>This library is work in progress and is lacking some features which might come in handy. Missing parts are planned to be added from time to time.



  This library is intended to provide a clear and simple interface for creating adaptive cards with only a few lines of code in a more robust way. The heavy usage of Python's typing library should
  prevent one from creating invalid schemes and structures. Instead, creating cards and sending cards should be intuitive and work like a breeze.

  For a comprehensive introduction into the main ideas and patterns of adaptive cards, have a look on the [**official documentation**](https://docs.microsoft.com/en-us/adaptive-cards). I also recommend using the [**schema explorer**](https://adaptivecards.io/explorer) page alongside the implementation, since the library's type system relies on these schemes.

  Further resources can be found here:

  * [__Format cards in Teams__](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cdesktop1%2Cdesktop2%2Cconnector-html)
  * [__Official repository__](https://github.com/microsoft/AdaptiveCards)

  💡 **Please note**
  <br> There are size limitations related to the traget framework a card is supposed to be used with. As of now, the maximum card size can be __28KB__ when used with Webhooks in Teams ([__Format cards in Teams__](https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cdesktop1%2Cdesktop2%2Cconnector-html)). For bot frameworks the upper limit is set to __40KB__ ([__Format your bot messages__](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/format-your-bot-messages)). An corresponding check is planned to be added soon to the [`SchemaValidator`](#validate-schema).



  💡 **Please note**
  <br>It's highly recommended to turn on the **type check** capabilities for Python in your editor. This will serve you with direct feedback about the structures you create. If you are trying to assign values of incompatible types, your editor will mark it as such and yell at you right in the moment you are about to do so.

  + Type annotated components based on Python's **dataclasses**
  + Schema validation for version compatibility
  + Simple `JSON` export
  + Compliant with the official structures and ideas
  + Send cards to MS Teams via `TeamsClient`



  * Python 3.10+
  * `dataclasses-json`
  * `StrEnum`
  * `requests`



  ```bash
  pip install adaptive-cards-py
  ```



  **Adaptive cards** can consist of different kind of components. The four main categories beside the actual cards are **Elements**, **Containers**, **Actions** and **Inputs**. You can find all available components for each category within the corresponding file. The `AdaptiveCard` is defined in `cards.py`.

  In addition to that, some fields of certain components are of custom types. These types are living inside the `card_types.py` file. For instance, if you are about to assign a color to a `TextBlock`, the field `color` will only accept a value of type `Colors`, which is implemented in the aforementioned Python file.

  To perform validation on a fully initialized card, one can make use of the `SchemaValidator` class. Similar to the whole library, this class provides a simple interface with only on method. The validation currently checks whether all used fields are compliant with the overall card version





  A simple `TextBlock` lives in the `elements` module and can be used after it's import.

  ```Python
  from adaptive_cards.elements import TextBlock

  text_block: TextBlock = TextBlock(text="It's your first card")
  ```
  For this component, `text` is the only required property. However, if more customization is needed, further available fields can be used.

  ```Python
  from adaptive_cards.elements import TextBlock
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your second card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )
  ```

  An actual card with only this component can be created like this.

  ```Python
  from adaptive_cards.card import AdaptiveCard

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_item(text_block) \
                                   .create()
  ```

  Find your final layout below.

  ![simple card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card.jpg?raw=true)

  💡 **Please note**
  <br>After building the object is done, the `create(...)` method must be called in order to create the final object. In this case, the object will be of type `AdaptiveCard`.

  To directly export your result, make use of the
  `to_json()` method provided by every card.

  ```Python
  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())

  ```



  Assuming you have a bunch of elements you want your card to enrich with. There is also a method for doing so. Let's re-use the example from before, but add another `Image` element here as well.

  ```Python
  from adaptive_cards.elements import TextBlock, Image
  import adaptive_cards.card_types as types

  text_block: TextBlock = TextBlock(
      text="It's your third card",
      color=types.Colors.ACCENT,
      size=types.FontSize.EXTRA_LARGE,
      horizontal_alignment=types.HorizontalAlignment.CENTER,
  )

  image: Image = Image(url="https://adaptivecards.io/content/bf-logo.png")

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()









  with open("path/to/out/file.json", "w+") as f:
      f.write(card.to_json())
  ```

  This will result in a card like shown below.

  ![simple card 2](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/simple_card/simple_card_2.jpg?raw=true)



  You can have a look on the following example for getting an idea of what's actually possible
  with adaptive cards.

  ![wrap up card](https://github.com/dennis6p/adaptive-cards-py/blob/main/examples/wrap_up_card/wrap_up_card.jpg?raw=true)

  <details>
  <summary>Code</summary>

  ```python
  import adaptive_cards.card_types as types
  from adaptive_cards.actions import ActionToggleVisibility, TargetElement
  from adaptive_cards.validation import SchemaValidator, Result
  from adaptive_cards.card import AdaptiveCard
  from adaptive_cards.elements import TextBlock, Image
  from adaptive_cards.containers import Container, ContainerTypes, ColumnSet, Column

  containers: list[ContainerTypes] = []

  icon_source: str = "https://icons8.com/icon/vNXFqyQtOSbb/launch"
  icon_url: str = "https://img.icons8.com/3d-fluency/94/launched-rocket.png"

  header_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(
              items=[
                  TextBlock(text="Your Daily Wrap-Up", size=types.FontSize.EXTRA_LARGE)
              ],
              width="stretch",
          ),
          Column(items=[Image(url=icon_url, width="40px")], rtl=True, width="auto"),
      ]
  )
  containers.append(
      Container(
          items=[header_column_set], style=types.ContainerStyle.EMPHASIS, bleed=True
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Some numbers for you**",
                  size=types.FontSize.MEDIUM,
              ),
              ColumnSet(
                  columns=[
                      Column(
                          items=[
                              TextBlock(text="_Total_"),
                              TextBlock(text="_Done by you_"),
                              TextBlock(text="_Done by other teams_"),
                              TextBlock(text="_Still open_"),
                              TextBlock(text="_Closed_"),
                          ]
                      ),
                      Column(
                          items=[
                              TextBlock(text="5"),
                              TextBlock(text="4"),
                              TextBlock(text="3"),
                              TextBlock(text="6"),
                              TextBlock(text="1"),
                          ],
                          spacing=types.Spacing.MEDIUM,
                          rtl=True,
                      ),
                  ],
                  separator=True,
              ),
          ],
          spacing=types.Spacing.MEDIUM,
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text="**Detailed Results**",
                  size=types.FontSize.MEDIUM,
              ),
          ],
          separator=True,
          spacing=types.Spacing.EXTRA_LARGE,
      )
  )

  sample_column_set: ColumnSet = ColumnSet(
      columns=[
          Column(items=[TextBlock(text="12312")]),
          Column(items=[TextBlock(text="done", color=types.Colors.GOOD)]),
          Column(items=[TextBlock(text="abc")]),
          Column(
              items=[
                  Image(
                      url="https://adaptivecards.io/content/down.png",
                      width="20px",
                      horizontal_alignment=types.HorizontalAlignment.RIGHT,
                  )
              ],
              select_action=ActionToggleVisibility(
                  title="More",
                  target_elements=[
                      TargetElement(
                          element_id="toggle-me",
                      )
                  ],
              ),
          ),
      ]
  )

  containers.append(
      Container(
          items=[
              Container(
                  items=[
                      ColumnSet(
                          columns=[
                              Column(items=[TextBlock(text="**Number**")]),
                              Column(items=[TextBlock(text="**Status**")]),
                              Column(items=[TextBlock(text="**Topic**")]),
                              Column(items=[TextBlock(text="")]),
                          ],
                          id="headline",
                      ),
                  ],
                  style=types.ContainerStyle.EMPHASIS,
                  bleed=True,
              ),
              Container(items=[sample_column_set]),
              Container(
                  items=[
                      TextBlock(
                          text="_Here you gonna find more information about the whole topic_",
                          id="toggle-me",
                          is_visible=False,
                          is_subtle=True,
                          wrap=True,
                      )
                  ]
              ),
          ],
      )
  )

  containers.append(
      Container(
          items=[
              TextBlock(
                  text=f"Icon used from: {icon_source}",
                  size=types.FontSize.SMALL,
                  horizontal_alignment=types.HorizontalAlignment.CENTER,
                  is_subtle=True,
              )
          ]
      )
  )

  card = AdaptiveCard.new().version("1.5").add_items(containers).create()

  validator: SchemaValidator = SchemaValidator()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")

  ```

  </details>

  <details>
  <summary>Schema</summary>

  ```json
  {
      "type": "AdaptiveCard",
      "version": "1.5",
      "schema": "http://adaptivecards.io/schemas/adaptive-card.json",
      "body": [
          {
              "items": [
                  {
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "Your Daily Wrap-Up",
                                      "type": "TextBlock",
                                      "size": "extraLarge"
                                  }
                              ],
                              "width": "stretch"
                          },
                          {
                              "items": [
                                  {
                                      "url": "https://img.icons8.com/3d-fluency/94/launched-rocket.png",
                                      "type": "Image",
                                      "width": "40px"
                                  }
                              ],
                              "rtl": true,
                              "width": "auto"
                          }
                      ]
                  }
              ],
              "type": "Container",
              "style": "emphasis",
              "bleed": true
          },
          {
              "spacing": "medium",
              "items": [
                  {
                      "text": "**Some numbers for you**",
                      "type": "TextBlock",
                      "size": "medium"
                  },
                  {
                      "separator": true,
                      "type": "ColumnSet",
                      "columns": [
                          {
                              "items": [
                                  {
                                      "text": "_Total_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by you_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Done by other teams_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Still open_",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "_Closed_",
                                      "type": "TextBlock"
                                  }
                              ]
                          },
                          {
                              "spacing": "medium",
                              "items": [
                                  {
                                      "text": "5",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "4",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "3",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "6",
                                      "type": "TextBlock"
                                  },
                                  {
                                      "text": "1",
                                      "type": "TextBlock"
                                  }
                              ],
                              "rtl": true
                          }
                      ]
                  }
              ],
              "type": "Container"
          },
          {
              "separator": true,
              "spacing": "extraLarge",
              "items": [
                  {
                      "text": "**Detailed Results**",
                      "type": "TextBlock",
                      "size": "medium"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "items": [
                          {
                              "id": "headline",
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "**Number**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Status**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "**Topic**",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  }
                              ]
                          }
                      ],
                      "type": "Container",
                      "style": "emphasis",
                      "bleed": true
                  },
                  {
                      "items": [
                          {
                              "type": "ColumnSet",
                              "columns": [
                                  {
                                      "items": [
                                          {
                                              "text": "12312",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "done",
                                              "type": "TextBlock",
                                              "color": "good"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "text": "abc",
                                              "type": "TextBlock"
                                          }
                                      ]
                                  },
                                  {
                                      "items": [
                                          {
                                              "url": "https://adaptivecards.io/content/down.png",
                                              "type": "Image",
                                              "horizontalAlignment": "right",
                                              "width": "20px"
                                          }
                                      ],
                                      "selectAction": {
                                          "title": "More",
                                          "targetElements": [
                                              {
                                                  "elementId": "toggle-me"
                                              }
                                          ],
                                          "type": "Action.ToggleVisibility"
                                      }
                                  }
                              ]
                          }
                      ],
                      "type": "Container"
                  },
                  {
                      "items": [
                          {
                              "id": "toggle-me",
                              "isVisible": false,
                              "text": "_Here you gonna find more information about the whole topic_",
                              "type": "TextBlock",
                              "isSubtle": true,
                              "wrap": true
                          }
                      ],
                      "type": "Container"
                  }
              ],
              "type": "Container"
          },
          {
              "items": [
                  {
                      "text": "Icon used from: https://icons8.com/icon/vNXFqyQtOSbb/launch",
                      "type": "TextBlock",
                      "horizontalAlignment": "center",
                      "isSubtle": true,
                      "size": "small"
                  }
              ],
              "type": "Container"
          }
      ]
  }
  ```

  </details>

  But we are still scratching the surface. You can do even better!



  New components and fields are getting introduced every now and then. This means, if you are using an early version for a card and add fields, which are not compliant with it, you will have an invalid schema. To prevent you from exporting fields not yet supported by the card and target framework, a card validation can be performed for the expected [__target framework__](https://learn.microsoft.com/en-us/adaptive-cards/resources/partners#live). For MS Teams as the target framework, it would like like this:

  ```python
  from adaptive_cards.validator import (
      CardValidatorFactory,
      CardValidator,
      Result,
      Finding
  )

  ...

  version: str = "1.4"
  card: AdaptiveCard = AdaptiveCard.new() \
                                   .version(version) \
                                   .add_items([text_block, image]) \
                                   .create()


  validator: CardValidator = CardValidatorFactory.create_validator_microsoft_teams()
  result: Result = validator.validate(card)

  print(f"Validation was successful: {result == Result.SUCCESS}")




  card_size: float = validator.card_size(card)
  print(card_size)



  details: list[Finding] = validator.details()




  ```



  Of course, you want to create those cards for a reason. So once you did that, you might want to send it to one of the compatible services like MS Teams. See the following example, how this can be done, assuming that all previously mentioned steps are done prior to that:

  ```python

  ...

  from adaptive_cards.clients import TeamsClient
  from requests import Response

  ...


  webhook_url: str = "YOUR-URL"
  client: TeamsClient = TeamsClient(webhook_url)
  response: Response = client.send(card)

  new_webhook_url: str = "YOUR-URL-OF-SECOND-CHANNEL"
  client.set_webhook_url(new_webhook_url)
  response: Response = client.send(card)

  ...

  ```

  So far, there is only a MS Teams client available. If further services should be supported, give me some feedback by opening an Issue for instance.

  Find further information about sending cards or creating Webhooks to/in MS Teams [__here__](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498).



  If you are interested in more comprehensive examples or the actual source code, have a look into the `examples` folder.



  * [x] Add size check to schema validation
  * [x] Add proper schema validation
  * [ ] Add further target framework validators
  * [ ] Provide more examples
  * [ ] Allow reading of json-like schemas



  Feel free to create issues, fork the repository or even come up with a pull request. I am happy about any kind of contribution and would love
  to hear your feedback!

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


pkgId: 829191c0d9c6b1b256460a4d2f2a761fe920a621c6124bcc9c1c399e8f406385
name: python-adaptive-power-neurons
arch: src
version: 0.1.2
epoch: 0
release: 1
summary: A machine learning model with adaptive power neurons for polynomial feature processing.
url: https://github.com/Dedeep007/adaptive-power-neurons
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptive-power-neurons-0.1.2-1.src.rpm
checksum_type: sha256
description:
  **Adaptive Power Neurons** is a machine learning model that utilizes adaptive power perceptrons, which are neural units that adjust both their power (degree of polynomial features) and input index dynamically. These perceptrons are used to build layers in a neural network that can handle complex relationships between features and outputs.

  The model incorporates polynomial feature expansion, index bias adjustments, and learning rate optimizations to create a highly flexible model for regression and classification tasks.



  - **Adaptive Power Perceptrons**: Each neuron in the network can dynamically adjust its power and input index.
  - **Polynomial Feature Expansion**: The model generates polynomial features up to a specified power.
  - **Index Bias**: Includes an adjustable index bias that shifts the input features.
  - **Layer Support**: The model supports the creation of multi-layer neural networks using adaptive power neurons.
  - **Optimizer**: Fine-tune hyperparameters like learning rate, polynomial power, and indexing rate during training.



  The core of the model is built around the concept of a perceptron that uses polynomial features of input data. Here's a breakdown of the algorithm used:



  Given an input vector \( x \), we generate polynomial features up to a specified degree \( p \). The polynomial feature vector \( \phi(x) \) is defined as:

  \[
  \phi(x) = \left[ x^1, x^2, \dots, x^p \right]
  \]

  Where \( p \) is the maximum power specified for each perceptron (layer).



  For each perceptron in the network, the weighted sum of the polynomial features is computed:

  \[
  z = w_1 \cdot \phi(x_1) + w_2 \cdot \phi(x_2) + \dots + w_n \cdot \phi(x_n) + b
  \]

  Where \( w_1, w_2, \dots, w_n \) are the weights of the model, \( b \) is the bias term, and \( \phi(x) \) is the polynomial feature vector. The output of the perceptron is then passed through an activation function (in this case, a step function for binary classification):

  \[
  \hat{y} =
  \begin{cases}
  1 & \text{if } z \geq 0 \\
  0 & \text{if } z < 0
  \end{cases}
  \]

  Where \( \hat{y} \) is the predicted output.



  The Mean Squared Error (MSE) loss function is used to evaluate the model's performance. It is calculated as:

  \[
  \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2
  \]

  Where \( N \) is the number of samples, \( y_i \) is the true output for sample \( i \), and \( \hat{y}_i \) is the predicted output.



  In addition to adjusting the weights and biases, the model includes an adjustable index bias \( \delta \) for each input:

  \[
  x_{\text{adjusted}} = x + \delta
  \]

  The model dynamically adjusts the index by a rate determined by the **indexing rate** during training, allowing it to fine-tune the input features for better prediction performance.



  The weights of the model are updated using gradient descent. The gradient of the loss function with respect to the weights is calculated, and the weights are updated as follows:

  \[
  w_i = w_i - \eta \cdot \frac{\partial \text{MSE}}{\partial w_i}
  \]

  Where \( \eta \) is the learning rate. Similarly, the bias term \( b \) is updated as:

  \[
  b = b - \eta \cdot \frac{\partial \text{MSE}}{\partial b}
  \]

  And the index bias \( \delta \) is updated as:

  \[
  \delta = \delta - \eta \cdot \frac{\partial \text{MSE}}{\partial \delta}
  \]



  The neural network is built by stacking multiple layers of **Adaptive Power Neurons**. Each layer consists of multiple perceptrons, and the output of one layer serves as the input for the next layer. During training, the parameters (weights, biases, and index bias) of each layer are updated separately using the same gradient descent approach.



  To install **Adaptive Power Neurons**, follow these steps:



  Clone the repository and run the following command in the terminal:

  ```bash
  pip install adaptive-power-neurons


  from adaptive_power_neurons import AdaptivePowerNeuron, AdaptivePowerModel, Optimizer
  import numpy as np


  X = np.array([[1], [2], [3], [4], [5]])
  y = np.array([0, 0, 1, 1, 1])


  neuron = AdaptivePowerNeuron(input_dim=1, max_power=3, learning_rate=0.001, indexing_rate=0.01)


  model = AdaptivePowerModel(layers=[neuron, neuron], loss_function="mse")


  optimizer = Optimizer(model, learning_rate=0.001)


  model.fit(X, y, epochs=20, optimizer=optimizer)


  test_input = np.array([3])
  prediction = model.predict(test_input)
  print(f"Prediction for input {test_input}: {prediction}")


pkgId: 9748a25d8d1c27ac4e2578982842275419ad7dbdec7c41c00f95e87ce6157843
name: python-adaptivecards
arch: src
version: 0.4.1
epoch: 0
release: 1
summary: Author adaptive cards in pure python
url: https://github.com/huuhoa/adaptivecards
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptivecards-0.4.1-1.src.rpm
checksum_type: sha256
description:
  *Author adaptive cards in pure python*




  [Adaptive Cards](https://adaptivecards.io/) are a great way to extend your bot interactions. However, writing the JSON required to specify the card layout by hand can be cumbersome and error prone. And while using a [designer](https://adaptivecards.io/designer/) is a good way to manually create cards this does not cover cards that are generated by code. AdaptiveCards allows you to author cards in native python without ever touching the underlying json.

  A code sample says more then a thousand words so the following code snippet ...

  ```python
  from adaptivecards.adaptivecard import AdaptiveCard
  from adaptivecards.elements import TextBlock
  from adaptivecards.containers import Column, ColumnSet, Container

  card = AdaptiveCard()
  card.body = [
      Container(items=[
          TextBlock(text='Hello from adaptivecards', font_type='Default', size='Medium'),
          ColumnSet(columns=[
              Column(
                  width='stretch',
                  items=[
                      TextBlock(text='author', weight="Bolder", wrap=True),
                      TextBlock(text='version', weight="Bolder", wrap=True),
                  ]
              ),
              Column(
                  width='stretch',
                  items=[
                      TextBlock(text='Huu Hoa NGUYEN', wrap=True),
                      TextBlock(text='0.1.0', wrap=True),
                  ]
              )
          ])
      ]),
      TextBlock(text='more information can be found at [https://pypi.org/project/adaptivecards/](https://pypi.org/project/adaptivecards/)',
                wrap=True)
  ]
  json_str = str(card)
  print(json_str)
  ```

  ... produces this json ...

  ```json
  {
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "body": [
      {
        "items": [
          {
            "fontType": "Default",
            "size": "Medium",
            "text": "Hello from adaptivecards",
            "type": "TextBlock"
          },
          {
            "columns": [
              {
                "items": [
                  {
                    "text": "author",
                    "type": "TextBlock",
                    "weight": "Bolder",
                    "wrap": true
                  },
                  {
                    "text": "version",
                    "type": "TextBlock",
                    "weight": "Bolder",
                    "wrap": true
                  }
                ],
                "type": "Column",
                "width": "stretch"
              },
              {
                "items": [
                  {
                    "text": "Huu Hoa NGUYEN",
                    "type": "TextBlock",
                    "wrap": true
                  },
                  {
                    "text": "0.1.0",
                    "type": "TextBlock",
                    "wrap": true
                  }
                ],
                "type": "Column",
                "width": "stretch"
              }
            ],
            "type": "ColumnSet"
          }
        ],
        "type": "Container"
      },
      {
        "text": "more information can be found at [https://pypi.org/project/adaptivecards/](https://pypi.org/project/adaptivecards/)",
        "type": "TextBlock",
        "wrap": true
      }
    ],
    "type": "AdaptiveCard",
    "version": "1.2"
  }
  ```

  when render in Teams will look like
  ![screenshot example 1](docs/assets/readme_example1.png)



  - Supports all components, options and features of adaptive cards version 1.4
  - Create adaptive cards from pure python



  You can install AdaptiveCards using pip by issuing

  ```bash
  $ pip install adaptivecards
  ```

  For more information on how to use this package please check the project documentation at https://github.com/huuhoa/adaptivecards.



  - Huu Hoa NGUYEN <huuhoa@gmail.com>



  The following resources were influential in the creation of this project:

  - The package's README was copied partially from [PyAdaptiveCards](https://github.com/CiscoSE/pyadaptivecards)



  This project is licensed to you under the terms of the [MIT License](./LICENSE).


pkgId: 6ec6d961c9d23e080eac7dc2abc3deb2f0148ca6aa7b4bbc4c6ea5ba1c249a3a
name: python-adaptivelcbin
arch: src
version: 0.1.13
epoch: 0
release: 1
summary: adaptivelcbin
url: https://gitlab.astro.unige.ch/ferrigno/adaptivelcbin
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptivelcbin-0.1.13-1.src.rpm
checksum_type: sha256
description:
  __CAUTION__: this is a simple functional project, although it should work as generally expected, do make sanity checks
  and make sure you understand what the adaptive binning is

  It makes adaptive binning and hardness ratio of two light curves (XMM-Newton input tested)


  ```bash
  $ pip install adaptivelcbin
  ```

  ```bash
  $ hratio --help
  ```


  ```bash
  $ hratio PNsrc_lc_01s_005-030.fits PNsrc_lc_01s_030-100.fits hratio4.qdp 15.0 --flag_rebin=4
  ```

  ```python
  import hratio
  hratio.hratio_func('data/PNsrc_lc_01s_005-030.fits', 'data/PNsrc_lc_01s_030-100.fits', 'test1.qdp', 15.0)
  ```


pkgId: 6d0b8b0e045ba895ccc3ee8a8f8ed6f9f473ad64cdb5a790a784666531d2c161
name: python-adaptix
arch: src
version: 3.0.0b8
epoch: 0
release: 1
summary: An extremely flexible and configurable data model conversion library
url: https://github.com/reagento/adaptix
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptix-3.0.0b8-1.src.rpm
checksum_type: sha256
description:
  <div align="center">
    <picture>
      <source media="(prefers-color-scheme: dark)" srcset="https://github.com/reagento/adaptix/blob/v3.0.0b6/docs/logo/adaptix-with-title-dark.png?raw=true">
      <source media="(prefers-color-scheme: light)" srcset="https://github.com/reagento/adaptix/blob/v3.0.0b6/docs/logo/adaptix-with-title-light.png?raw=true">
      <img alt="adaptix logo" src="https://raw.githubusercontent.com/reagento/adaptix/v3.0.0b2/docs/logo/adaptix-with-title-light.png?raw=true">
    </picture>

    <hr>

    [![PyPI version](https://img.shields.io/pypi/v/adaptix.svg?color=blue)](https://pypi.org/project/adaptix/)
    [![downloads](https://img.shields.io/pypi/dm/adaptix.svg)](https://pypistats.org/packages/adaptix)
    [![versions](https://img.shields.io/pypi/pyversions/adaptix.svg)](https://github.com/reagento/adaptix)
    [![license](https://img.shields.io/github/license/reagento/dataclass_factory.svg)](https://github.com/reagento/adaptix/blob/master/LICENSE)
  </div>

  An extremely flexible and configurable data model conversion library.

  > [!IMPORTANT]
  > Adaptix is ready for production!
  > The beta version only means there may be some backward incompatible changes, so you need to pin a specific version.

  📚 [Documentation](https://adaptix.readthedocs.io/)



  Install
  ```bash
  pip install adaptix==3.0.0b8
  ```

  Use for model loading and dumping.

  ```python
  from dataclasses import dataclass

  from adaptix import Retort


  @dataclass
  class Book:
      title: str
      price: int


  data = {
      "title": "Fahrenheit 451",
      "price": 100,
  }


  retort = Retort()

  book = retort.load(data, Book)
  assert book == Book(title="Fahrenheit 451", price=100)
  assert retort.dump(book) == data
  ```

  Use for converting one model to another.

  ```python
  from dataclasses import dataclass

  from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

  from adaptix.conversion import get_converter


  class Base(DeclarativeBase):
      pass


  class Book(Base):
      __tablename__ = 'books'

      id: Mapped[int] = mapped_column(primary_key=True)
      title: Mapped[str]
      price: Mapped[int]


  @dataclass
  class BookDTO:
      id: int
      title: str
      price: int


  convert_book_to_dto = get_converter(Book, BookDTO)

  assert (
      convert_book_to_dto(Book(id=183, title="Fahrenheit 451", price=100))
      ==
      BookDTO(id=183, title="Fahrenheit 451", price=100)
  )
  ```



  * Validation and transformation of received data for your API.
  * Conversion between data models and DTOs.
  * Config loading/dumping via codec that produces/takes dict.
  * Storing JSON in a database and representing it as a model inside the application code.
  * Creating API clients that convert a model to JSON sending to the server.
  * Persisting entities at cache storage.
  * Implementing fast and primitive ORM.



  * Sane defaults for JSON processing, no configuration is needed for simple cases.
  * Separated model definition and rules of conversion
    that allow preserving [SRP](https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html)
    and have different representations for one model.
  * Speed. It is one of the fastest data parsing and serialization libraries.
  * There is no forced model representation, adaptix can adjust to your needs.
  * Support [dozens](https://adaptix.readthedocs.io/en/latest/loading-and-dumping/specific-types-behavior.html) of types,
    including different model kinds:
    ``@dataclass``, ``TypedDict``, ``NamedTuple``,
    [``attrs``](https://www.attrs.org/en/stable/), [``sqlalchemy``](https://docs.sqlalchemy.org/en/20/) and [``pydantic``](https://docs.pydantic.dev/latest/).
  * Working with self-referenced data types (such as linked lists or trees).
  * Saving [path](https://adaptix.readthedocs.io/en/latest/loading-and-dumping/tutorial.html#error-handling)
    where an exception is raised (including unexpected errors).
  * Machine-readable [errors](https://adaptix.readthedocs.io/en/latest/loading-and-dumping/tutorial.html#error-handling)
    that could be dumped.
  * Support for user-defined generic models.
  * Automatic name style conversion (e.g. `snake_case` to `camelCase`).
  * [Predicate system](https://adaptix.readthedocs.io/en/latest/loading-and-dumping/tutorial.html#predicate-system)
    that allows to concisely and precisely override some behavior.
  * Disabling additional checks to speed up data loading from trusted sources.
  * No auto casting by default. The loader does not try to guess value from plenty of input formats.


pkgId: 8aba0656b8013f912f48392f0ecb4d1dc81c06554fca42484bfece8ba71859a6
name: python-adaptmesh
arch: src
version: 0.3.3
epoch: 0
release: 1
summary: Adaptive mesh generation and refinement
url: https://github.com/kinnala/adaptmesh
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptmesh-0.3.3-1.src.rpm
checksum_type: sha256
description:
  [![PyPI](https://img.shields.io/pypi/v/adaptmesh)](https://pypi.org/project/adaptmesh/)
  [![PyPI - License](https://img.shields.io/pypi/l/adaptmesh)](https://opensource.org/licenses/MIT)
  ![ci](https://github.com/kinnala/adaptmesh/workflows/ci/badge.svg)
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4172331.svg)](https://doi.org/10.5281/zenodo.4172331)

  Create triangular meshes by the adaptive process.

  The user feeds in a polygon and a low quality mesh is created.  Then the low
  quality mesh gets improved by adaptive finite elements and mesh smoothing.  The
  approach is detailed [in the following paper](https://rakenteidenmekaniikka.journal.fi/article/view/99648):
  ```
  @article{adaptmesh,
      title={A simple technique for unstructured mesh generation via adaptive finite elements},
      author={Gustafsson, Tom},
      volume={54},
      doi={10.23998/rm.99648},
      number={2},
      journal={Rakenteiden Mekaniikka},
      year={2021},
      pages={69--79}
  }
  ```

  `adaptmesh` ships with customized versions of the following packages:

  - `tri v0.3.1.dev0` (ported to Python 3; Copyright (c) 2015 Martijn Meijers; MIT; [source](https://pypi.org/project/tri/))
  - `optimesh v0.6.3` (trimmed down version with minor changes to the edge
    flipping; Copyright (c) 2018-2020 Nico Schlömer; the last version with MIT; [source](https://github.com/nschloe/optimesh/releases/tag/v0.6.3))
  - `meshplex v0.12.3` (trimmed down version with minor changes, i.e. removal of
    unnecessary imports; Copyright (c) 2017-2020 Nico Schlömer; the last version with MIT; [source](https://github.com/nschloe/meshplex/releases/tag/v0.12.3))



  ```
  pip install adaptmesh
  ```



  - `numpy`
  - `scipy`
  - `matplotlib`
  - `scikit-fem`



  The mesh generator is called through the function `adaptmesh.triangulate`.



  ```python
  from adaptmesh import triangulate

  m = triangulate([(0., 0.),
                   (1., 0.),
                   (1., 1.),
                   (0., 1.),])



  ```

  ![Example mesh 1](https://github.com/kinnala/adaptmesh/raw/master/svgs/ex1.svg)



  ```python
  from adaptmesh import triangulate

  m = triangulate([(0.0, 0.0),
                   (1.1, 0.0),
                   (1.2, 0.5),
                   (0.7, 0.6),
                   (2.0, 1.0),
                   (1.0, 2.0),
                   (0.5, 1.5),], quality=0.95)  # default: 0.9
  ```

  ![Example mesh 2](https://github.com/kinnala/adaptmesh/raw/master/svgs/ex2.svg)



  ```python
  m = triangulate([(0., 0.),
                   (1., 0.),
                   (1., 1.),
                   (0., 1.),],
                  holes=[[(.25, .25),
                          (.75, .25),
                          (.75, .75),
                          (.25, .75)]])
  ```

  ![Example mesh 3](https://github.com/kinnala/adaptmesh/raw/master/svgs/ex3.svg)



  ```python
  m1 = triangulate([(0., 0.),
                    (1., 0.),
                    (.7, 1.),
                    (0., 1.),],
                   split=[(1, 8),
                          (2, 6)],
                   quality=0.91)

  m2 = triangulate([(0., 2.),
                    (2., 2.),
                    (2., 0.),
                    (1., 0.),
                    (.7, 1.),
                    (0., 1.)],
                   split=[(3, 8),
                          (4, 6)],
                   quality=0.91)

  m = m1 + m2
  ```
  Multiple meshes can be joined to emulate subdomains.  However, the nodes
  must match.  Above, segments are splitted to facilitate the matching, e.g.,
  `[(1, 8), (2, 6)]` means that the second and the third segments are split
  using eight and six equispaced extra nodes, respectively.

  ![Example mesh 4](https://github.com/kinnala/adaptmesh/raw/master/svgs/ex4.svg)



  The main source code of `adaptmesh` is distributed under the MIT License.

  The licenses of the included packages can be found also in `LICENSE.md` and the
  respective subdirectories, i.e. `./adaptmesh/*/LICENSE`. See `LICENSE.md` for
  more information.







  - Fixed: Properly respect segments in the initial triangulation.



  - Fixed: Rendering of README in pypi.



  - Fixed: Support for `scikit-fem>=4`.



  - Fixed: Support for `scikit-fem>=3`. Dependency update broke the mesh refinement.



  - Added: keyword argument `split` of `triangulate` allows further splitting
    the provided segments.  This is useful because the segment endpoints are
    always preserved in the final mesh.
  - Added: keyword argument `holes` of `triangulate` allows specifying additional
    polygonal areas inside the domain that will be free of triangles in the final
    mesh.


pkgId: 3dee22dee671896a554d1645d10353cf153d6ebc3d5a97421efe6c11be0d4f25
name: python-adaptyper
arch: src
version: 0.3.0
epoch: 0
release: 1
summary: Старается конвертировать один тип данных в другой.
url: https://pypi.org/project/adaptyper/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptyper-0.3.0-1.src.rpm
checksum_type: sha256
description:
  Старается конвертировать один тип данных в другой.

  Обработка пользовательских данных из не строго типизированных значений.

  ```py
  from adaptyper import convert, ValueType


  convert('FaLsE').to(ValueType.BOOL)  # False
  convert('some_str_value').to('bool')  # True
  convert(0).to('bool')  # False
  convert(1.0).to('bool')  # True

  convert(True).to(ValueType.STR)  # "TRUE"
  convert(-1).to('str')  # "-1"

  convert(True).to(ValueType.FLOAT)  # 1.0
  convert('FaLsE').to('float')  # 0.0
  convert('.5').to('float')  # 0.5
  convert(-1).to('float')  # -1.0

  convert(True).to(ValueType.INT)  # 1
  convert('1.5').to('int')  # 1
  convert('1.5').to('int', True)  # 2

  convert('2011-11-04').to(ValueType.DATETIME)  # datetime(2011, 11, 4, 0, 0))
  convert('4.11.2011').to('datetime', '%d.%m.%Y')  # datetime(2011, 11, 4, 0, 0)


  convert('').to_bool()  # False
  convert('0').to_bool()  # False
  convert('FaLsE').to_bool()  # False
  convert('any_str_value').to_bool()  # True


  convert(True).to_str()  # "TRUE"
  convert('any_str_value').to_str()  # "some_str_value"
  convert(1).to_str()  # "1"
  convert(-1).to_str()  # "-1"
  convert(123.456).to_str()  # "123.456"
  convert(-123.456).to_str()  # "-123.456"


  convert(None).to_float()  # None
  convert('').to_float()  # None
  convert('123,456').to_float()  # 123.456
  convert(' 123\xa0456\xa0').to_float()  # 123456.0
  convert('tRuE').to_float()  # 1.0
  convert(True).to_float()  # 1.0
  convert(1).to_float()  # 1.0
  convert('.3').to_float()  # 0.3




  convert('.6').to_int()  # 0
  convert('.6').to_int(bankers_rounding=True)  # 1
  convert('1.5').to_int(False)  # 1
  convert('1.5').to_int(True)  # 2


  convert(None).to_datetime()  # None
  convert('').to_datetime()  # None
  convert('2011-11-04').to_datetime()  # datetime(2011, 11, 4, 0, 0)
  convert('4.11.2011').to_datetime('%d.%m.%Y')  # datetime(2011, 11, 4, 0, 0)
  ```


pkgId: 26351783de23caf243263202fc9fe1f9a6c3d6963aea6923f62e733250ed388e
name: python-adaptyper
arch: src
version: 0.4.0
epoch: 0
release: 1
summary: Старается конвертировать один тип данных в другой.
url: https://pypi.org/project/adaptyper/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaptyper-0.4.0-1.src.rpm
checksum_type: sha256
description:
  Старается конвертировать один тип данных в другой.

  Обработка пользовательских данных из не строго типизированных значений.

  ```py
  from adaptyper import convert, ValueType


  convert('FaLsE').to(ValueType.BOOL)  # False
  convert('some_str_value').to('bool')  # True
  convert(0).to('bool')  # False
  convert(1.0).to('bool')  # True

  convert(True).to(ValueType.STR)  # "TRUE"
  convert(-1).to('str')  # "-1"

  convert(True).to(ValueType.FLOAT)  # 1.0
  convert('FaLsE').to('float')  # 0.0
  convert('.5').to('float')  # 0.5
  convert(-1).to('float')  # -1.0

  convert(True).to(ValueType.INT)  # 1
  convert('1.5').to('int')  # 1
  convert('1.5').to('int', True)  # 2

  convert('2011-11-04').to(ValueType.DATETIME)  # datetime(2011, 11, 4, 0, 0)
  convert('4.11.2011').to('datetime', '%d.%m.%Y')  # datetime(2011, 11, 4, 0, 0)

  convert('2011-11-04').to(ValueType.DATE)  # date(2011, 11, 4)
  convert('4.11.2011').to('date', '%d.%m.%Y')  # date(2011, 11, 4)

  convert('.00').to(ValueType.DECIMAL) # Decimal('0.00')
  convert('.5').to('decimal')  # Decimal('0.5')
  convert(-1).to('decimal')  # Decimal('-1')
  convert("- 123 \xa0 456").to('decimal')  # Decimal('-123456')


  convert('').to_bool()  # False
  convert('0').to_bool()  # False
  convert('FaLsE').to_bool()  # False
  convert('any_str_value').to_bool()  # True


  convert(True).to_str()  # "TRUE"
  convert('any_str_value').to_str()  # "some_str_value"
  convert(1).to_str()  # "1"
  convert(-1).to_str()  # "-1"
  convert(123.456).to_str()  # "123.456"
  convert(-123.456).to_str()  # "-123.456"


  convert(None).to_float()  # None
  convert('').to_float()  # None
  convert('123,456').to_float()  # 123.456
  convert(' 123\xa0456\xa0').to_float()  # 123456.0
  convert('tRuE').to_float()  # 1.0
  convert(True).to_float()  # 1.0
  convert(1).to_float()  # 1.0
  convert('.3').to_float()  # 0.3




  convert('.6').to_int()  # 0
  convert('.6').to_int(bankers_rounding=True)  # 1
  convert('1.5').to_int(False)  # 1
  convert('1.5').to_int(True)  # 2


  convert(None).to_datetime()  # None
  convert('').to_datetime()  # None
  convert('2011-11-04').to_datetime()  # datetime(2011, 11, 4, 0, 0)
  convert('4.11.2011').to_datetime('%d.%m.%Y')  # datetime(2011, 11, 4, 0, 0)



  convert(None).to_date()  # None
  convert('').to_date()  # None
  convert('2011-11-04').to_date()  # date(2011, 11, 4)
  convert('4.11.2011').to_date('%d.%m.%Y')  # date(2011, 11, 4)


  convert('.00').to(ValueType.DECIMAL) # Decimal('0.00')
  convert('.5').to('decimal')  # Decimal('0.5')
  convert(-1).to('decimal')  # Decimal('-1')
  convert(123456).to('decimal')  # Decimal('123456')
  convert("- 123 456").to('decimal')  # Decimal('-123456)
  convert("123\xa0456").to('decimal')  # Decimal('123456')
  ```


pkgId: e06f4081209f9012bc68050b9098b2e3f79d79ec6723ff7848cf080dd4cf8fac
name: python-adarnauth-esi
arch: src
version: 1.4.14
epoch: 0
release: 1
summary: Django app for accessing the EVE Swagger Interface.
url: https://github.com/adarnof/adarnauth-esi
rpm_license: GNU General Public License v3 (GPLv3)
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adarnauth-esi-1.4.14-1.src.rpm
checksum_type: sha256
description:
  Django app for accessing the EVE Swagger Interface.



  1. Add `esi` to your `INSTALLED_APPS` setting:

     `INSTALLED_APPS += 'esi'`

  2. Include the esi urlconf in your project's urls:

      `url(r'^sso/', include('esi.urls', namespace='esi')),`

  3. Register an application with the [EVE Developers site](https://developers.eveonline.com/applications)

      If your application requires scopes, select `Authenticated API Access` and register all possible scopes your app can request. Otherwise `Authentication Only` will suffice.
      Set the `Callback URL` to `https://example.com/sso/callback`

  4. Add SSO client settings to your project settings:

      `ESI_SSO_CLIENT_ID = "my client id"`

      `ESI_SSO_CLIENT_SECRET = "my client secret"`

      `ESI_SSO_CALLBACK_URL = "https://example.com/sso/callback"`


  5. Run `python manage.py migrate` to create models.



  When views require a token, wrap with the `token_required` decorator and accept a `token` arg:

      from esi.decorators import token_required

      @token_required()
      def my_view(request, token):
          ...

  This will prompt the user to either select a token from their current ones, or if none exist create a new one via SSO.

  To specify scopes, add either a list of names or a space-delimited string:

      @token_required(scopes=['esi-location.read_ship_type.v1', 'esi-location.read_location.v1'])
      @token_required(scopes='esi-location.read_ship_type.v1 esi-location.read_location.v1')

  To require a new token, such as for logging in, add the `new` argument:

      @token_required(new=True)

  To request all of a user's tokens which have the required scopes, wrap instead with the `tokens_required` decorator and accept a `tokens` arg:

      @tokens_required(scopes='esi-location.read_ship_type.v1')
      def my_view(request, tokens):
          ...

  This skips prompting for token selection and instead passes that responsibility to the view. Tokens are provided as a queryset.



  adarnauth-esi provides a convenience wrapper around the [bravado SwaggerClient](https://github.com/Yelp/bravado).



  To get a SwaggerClient configured for ESI, call the factory:

      from esi.clients import esi_client_factory
      client = esi_client_factory()



  To get an authenticated SwaggerClient, add the token argument:

      client = esi_client_factory(token=my_token)

  Or, get the client from the specific token model instead:

      client = my_token.get_esi_client()

  Authenticated clients will auto-renew tokens when needed, or raise a `TokenExpiredError` if they aren't renewable.



  As explained on the [EVE Developers Blog](https://developers.eveonline.com/blog/article/breaking-changes-and-you), it's best practice to call a specific version of the resource and allow the ESI router to map it to the correct route, being `legacy`, `latest` or `dev`.

  Client initialization begins with a base swagger spec. By default this is the version defined in settings (`ESI_API_VERSION`), but can be overridden with an extra argument to the factory:

      client = esi_client_factory(version='v4')
      client = token.get_esi_client(version='v4')

  Only resources with the specified version number will be available. For instance, if you specify `v4` but `Universe` does not have a `v4` version, it will not be available to that specific client. Only `legacy`, `latest` and `dev` are guaranteed to have all resources available.

  Individual resources are versioned and can be accessed by passing additional arguments to the factory:

      client = esi_client_factory(Universe='v1', Character='v3')
      client = token.get_esi_client(Universe='v1', Character='v3')

  A list of available resources is available on the [EVE Swagger Interface browser](https://esi.tech.ccp.is). If the resource is not available with the specified version, an `AttributeError` will be raised.

  This version of the resource replaces the resource originally initialized. If the requested base version does not have the specified resource, it will be added.

  Note that only one old revision of each resource is kept available through the legacy route. Keep an eye on the [deployment timeline](https://github.com/ccpgames/esi-issues/projects/2/) for resource updates.



  Specifying resource versions introduces one major problem for shared code: not all resources nor all their operations are available on any given version. This can be addressed by shipping a copy of the [versioned latest spec](https://esi.tech.ccp.is/_latest/swagger.json) with your app. **This is the preferred method for deployment.**

  To build a client using this local spec, pass an additional kwarg `spec_file` which contains the path to your local swagger.json:

      c = esi_client_factory(spec_file='/path/to/swagger.json')

  For example, a swagger.json in the current file's directory would look like:

      c = esi_client_factory(spec_file=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'swagger.json'))

  If a `spec_file` is specified all other versioning is unavailable: ensure you ship a spec with resource versions your app can handle.



  ESI datasource can also be specified during client creation:

      client = esi_client_factory(datasource='tranquility')

  Available datasources are `tranquility` and `singularity`.



  Two tasks are available:
   - `cleanup_callbackredirect` removes all `CallbackRedirect` models older than a specified age (in seconds). Default is 300.
   - `cleanup_token` checks all `Token` models, and if expired, attempts to refresh. If expired and cannot refresh, or fails to refresh, the model is deleted.

  To schedule these automatically with celerybeat, add them to your settings.py `CELERYBEAT_SCHEDULE` dict like so:

      from celery.schedules import crontab

      CELERYBEAT_SCHEDULE = {
          ...
          'esi_cleanup_callbackredirect': {
              'task': 'esi.tasks.cleanup_callbackredirect',
              'schedule': crontab(hour='*/4'),
          },
          'esi_cleanup_token': {
              'task': 'esi.tasks.cleanup_token',
              'schedule': crontab(day_of_month='*/1'),
          },
      }

  Recommended intervals are four hours for callback redirect cleanup and daily for token cleanup (token cleanup can get quite slow with a large database, so adjust as needed). If your app does not require background token validation, it may be advantageous to not schedule the token cleanup task, instead relying on the validation check when using `@token_required` decorators or adding `.require_valid()` to the end of a query.


   By defalt, adarnauth-esi process all operations on the tranquility cluster. To operate on singularity instead, two settings need to be changed:
    - `ESI_OAUTH_URL` should be set to `https://sisilogin.testeveonline.com/oauth`
    - `ESI_API_DATASOURCE` should be set to `singularity`

    Note that tokens cannot be transferred between servers. Any tokens in the database before switching to singularity will be deleted next refresh.


pkgId: cfe811e0d50bd91088f44e12f3049d0cc66b991f4d1d183104673f6e7ab08a26
name: python-adaseq
arch: src
version: 0.6.6
epoch: 0
release: 1
summary: AdaSeq: An All-in-One Library for Developing State-of-the-Art Sequence Understanding Models
url: https://github.com/modelscope/adaseq
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adaseq-0.6.6-1.src.rpm
checksum_type: sha256
description:
  <div align="center">

  [![license](https://img.shields.io/github/license/modelscope/adaseq.svg)](./LICENSE)
  [![modelscope](https://img.shields.io/badge/modelscope->=1.4.0-624aff.svg)](https://modelscope.cn/)
  ![version](https://img.shields.io/github/tag/modelscope/adaseq.svg)
  [![issues](https://img.shields.io/github/issues/modelscope/adaseq.svg)](https://github.com/modelscope/AdaSeq/issues)
  [![stars](https://img.shields.io/github/stars/modelscope/adaseq.svg)](https://github.com/modelscope/AdaSeq/stargazers)
  [![downloads](https://static.pepy.tech/personalized-badge/adaseq?period=total&left_color=grey&right_color=yellowgreen&left_text=downloads)](https://pypi.org/project/adaseq)
  [![contribution](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](./CONTRIBUTING.md)

  </div>

  <div align="center">

  English | [简体中文](./README_zh.md)

  </div>


  ***AdaSeq*** (**A**libaba **D**amo **A**cademy **Seq**uence Understanding Toolkit) is an easy-to-use all-in-one library, built on [ModelScope](https://modelscope.cn/home), that allows researchers and developers to train custom models for sequence understanding tasks, including part-of-speech tagging (POS Tagging), chunking, named entity recognition (NER), entity typing, relation extraction (RE), etc.

  ![](./docs/imgs/task_examples_en.png)

  <details open>
  <summary>🌟 <b>Features:</b></summary>

  - **Plentiful Models**:

    AdaSeq provide plenty of cutting-edge models, training methods and useful toolkits for sequence understanding tasks.

  - **State-of-the-Art**:

    Our aim to develop the best implementation, which can beat many off-the-shelf frameworks on performance.

  - **Easy-to-Use**:

    One line of command is all you need to obtain the best model.

  - **Extensible**:

    It's easy to register a module, or build a customized sequence understanding model by assembling the predefined modules.

  </details>

  ⚠️**Notice:** This project is under quick development. This means some interfaces could be changed in the future.


  - 2022-07: [SemEval 2023] Our U-RaNER paper won [Best Paper Award](https://semeval.github.io/SemEval2023/awards)!
  - 2022-03: [SemEval 2023] Our U-RaNER won ***1st place in 9 tracks*** at [SemEval 2023 Task2](https://multiconer.github.io/results): Multilingual Complex Named Entity Recognition! [Model introduction and source code can be found here](./examples/U-RaNER).
  - 2022-12: [[EMNLP 2022] Retrieval-augmented Multimodal Entity Understanding Model (MoRe)](./examples/MoRe)
  - 2022-11: [[EMNLP 2022] Ultra-Fine Entity Typing Model (NPCRF)](./examples/NPCRF)
  - 2022-11: [[EMNLP 2022] Unsupervised Boundary-Aware Language Model (BABERT)](./examples/babert)


  You can try out our models via online demos built on ModelScope:
  [[English NER]](https://modelscope.cn/models/damo/nlp_raner_named-entity-recognition_english-large-news/summary)
  [[Chinese NER]](https://modelscope.cn/models/damo/nlp_raner_named-entity-recognition_chinese-base-news/summary)
  [[CWS]](https://modelscope.cn/models/damo/nlp_structbert_word-segmentation_chinese-base/summary)

  More tasks, more languages, more domains: All modelcards we released can be found in this page [Modelcards](./docs/modelcards.md).


  <details open>
  <summary><b>Supported models:</b></summary>

  - [Transformer-based CRF](./examples/bert_crf)
  - [Partial CRF](./examples/partial_bert_crf)
  - [Retrieval Augmented NER](./examples/RaNER)
  - [Biaffine NER](./examples/biaffine_ner)
  - [Global-Pointer](./examples/global_pointer)
  - [Multi-label Entity Typing](./examples/entity_typing)
  - ...
  </details>


  We collected many datasets for sequence understanding tasks. All can be found in this page [Datasets](./docs/datasets.md).


  AdaSeq project is based on `Python >= 3.7`, `PyTorch >= 1.8` and `ModelScope >= 1.4`. We assure that AdaSeq can run smoothly when `ModelScope == 1.9.5`.

  - installation via pip：
  ```
  pip install adaseq
  ```

  - installation from source：
  ```
  git clone https://github.com/modelscope/adaseq.git
  cd adaseq
  pip install -r requirements.txt -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
  ```


  To verify whether AdaSeq is installed properly, we provide a demo config for training a model (the demo config will be automatically downloaded).
  ```
  adaseq train -c demo.yaml
  ```
  You will see the training logs on your terminal. Once the training is done, the results on test set will be printed: `test: {"precision": xxx, "recall": xxx, "f1": xxx}`. A folder `experiments/toy_msra/` will be generated to save all experimental results and model checkpoints.


  - [Quick Start](./docs/tutorials/quick_start.md)
  - Basics
    - [Learning about Configs](./docs/tutorials/learning_about_configs.md)
    - [Customizing Dataset](./docs/tutorials/customizing_dataset.md)
    - [TODO] Common Architectures
    - [TODO] Useful Hooks
    - [Hyperparameter Optimization](./docs/tutorials/hyperparameter_optimization.md)
    - [Training with Multiple GPUs](./docs/tutorials/training_with_multiple_gpus.md)
  - Best Practice
    - [Training a Model with Custom Dataset](./docs/tutorials/training_a_model.md)
    - [Reproducing Results in Published Papers](./docs/tutorials/reproducing_papers.md)
    - [TODO] Uploading Saved Model to ModelScope
    - [TODO] Customizing your Model
    - [TODO] Serving with AdaLA


  All contributions are welcome to improve AdaSeq. Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md) for the contributing guideline.


  This project is licensed under the Apache License (Version 2.0).


pkgId: 485e955cd41bd00abb39f1b63c9e018e53b8af5c4aa913ebd569f84260fa0d28
name: python-adata
arch: src
version: 2.7.1
epoch: 0
release: 1
summary: A Data,A Stock,ETF,Bond,Quant,Stock Market,K Line
url: https://github.com/1nchaos/adata
rpm_license: Apache License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adata-2.7.1-1.src.rpm
checksum_type: sha256
description:
  >

  [![Star History Chart](https://api.star-history.com/svg?repos=1nchaos/adata&type=Date)](https://star-history.com/#1nchaos/adata&Date)

  <p align="center">
    <a href="https://adata.30006124.xyz/wx.html" target="_blank">
      <img width="180" src="./docs/wx.jpg" alt="logo">
    </a>
    <a href="https://mp.weixin.qq.com/s/ZQMXgxIYKtfjiPQK-p-aXg" target="_blank">
      <img width="400" src="./docs/xyhcl-gzh.png" alt="logo">
    </a>
  </p>
  - 添加wx好友，备注：Adata量化进交流群；
  - 扫码关注向阳花策略，不定期分享量化的知识，一起实盘量化切磋；
  - 创始交流群和公众号都是近期建立，意在提供一个交流的平台，欢迎讨论交流；
  - 一起保卫3000点直到突破6124点。


pkgId: d7a2ab565fe7617412442328cfee43dcba0a75df26b547acc93bb100ca674480
name: python-adb
arch: src
version: 1.3.0
epoch: 0
release: 1
summary: A pure python implementation of the Android ADB and Fastboot protocols
url: https://github.com/google/python-adb
rpm_license: Apache Software License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adb-1.3.0-1.src.rpm
checksum_type: sha256
description:
  This repository contains a pure-python implementation of the Android
  ADB and Fastboot protocols, using libusb1 for USB communications.

  This is a complete replacement and rearchitecture of the Android
  project's ADB and fastboot code available at
  https://github.com/android/platform_system_core/tree/master/adb

  This code is mainly targeted to users that need to communicate with
  Android devices in an automated fashion, such as in automated
  testing. It does not have a daemon between the client and the device,
  and therefore does not support multiple simultaneous commands to the
  same device. It does support any number of devices and never
  communicates with a device that it wasn't intended to, unlike the
  Android project's ADB.


pkgId: d3c8de4719d70858a05998f23ac8eabf13ccec532c4d4edd87b07e0808aacc19
name: python-adb-enhanced
arch: src
version: 2.5.24
epoch: 0
release: 1
summary: Swiss-army knife for Android testing and development
url: https://github.com/ashishb/adb-enhanced
rpm_license: Apache
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adb-enhanced-2.5.24-1.src.rpm
checksum_type: sha256
description:
     Logo
  ADB-Enhanced is a Swiss army knife for Android testing and development.
  A command-line interface to trigger various scenarios like screen
  rotation, battery saver mode, data saver mode, doze mode, and permission
  grant/revocation. It’s a wrapper around ``adb`` and not a replacement.
  |Lint Python| |Lint Markdown| |Lint YAML|
  |InstallAdbeTest|
  |AdbeInstallTests| |AdbeUnitTests|
  |Install adb-enhanced via pip| |Install adb-enhanced via homebrew|
  |AdbeUnitTests-Api16| |AdbeUnitTests-Api21| |AdbeUnitTests-Api22|
  |AdbeUnitTests-Api23| |AdbeUnitTests-Api24| |AdbeUnitTests-Api25|
  |AdbeUnitTests-Api26| |AdbeUnitTests-Api27| |AdbeUnitTests-Api28|
  |AdbeUnitTests-Api29| |AdbeUnitTests-Api31| |AdbeUnitTests-Api30|
  |AdbeUnitTests-Api31| |AdbeUnitTests-Api32| |AdbeUnitTests-Api33|
  |AdbeUnitTests-Api34|
  |asciicast|


pkgId: c729d6027046a4878f71e92f311a0037f7b40358664f93abb9d193e33759ace6
name: python-adb-pywrapper
arch: src
version: 1.0.2
epoch: 0
release: 1
url: https://github.com/NetherlandsForensicInstitute/adb-pywrapper
rpm_license: EUPL-1.2
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adb-pywrapper-1.0.2-1.src.rpm
checksum_type: sha256
summary:
  adb_pywrapper facilitates seamless interaction with Android devices using the Android Debug Bridge (ADB) directly within Python scripts.

description:
  To install the `adb-pywrapper` package from the internal Nexus PyPI server, you can use `pip`:
  ```bash
  pip install adb-pywrapper
  ```
  Before using `adb-pywrapper`, ensure that ADB is installed on your machine and added to PATH. You can download and install the Android SDK, which includes ADB, from the official Android developer website.
  If running the below in a terminal gives you an output, you are ready to go!
  ```bash
  adb --version
  ```

  Import the necessary modules:
  ```python
  from adb_pywrapper.adb_device import AdbDevice
  from adb_pywrapper.adb_result import AdbResult
  from adb_pywrapper.pull_result import PullResult
  ```

  You can list all connected devices using the `list_devices` method (this can be done before creating an instance):
  Looks for connected adb devices and returns the device names in a list.
  `:return:` list of adb device names. Example: `['device-5554','AU9AD74','netagfer987']`
  ```python
  devices = AdbDevice.list_devices()
  ```

  After which you can also get the status of said device without having initialized AdbDevice since this way you can see if the device might be `offline` or `unauthorized`
  Get the status corresponding to the device_name. This uses the 'adb devices' command.
  `:param device_name:` the device adb name/identifier.
  `:return:` a string with the status of the given device. Example: 'offline', 'device' or 'unauthorized'
  ```python
  status = AdbDevice.get_device_status('your_device_identifier')
  ```

  To interact with a specific Android device, create an instance of the `AdbDevice` class. You can specify the device identifier as an argument (obtained from either Adb using `adb devices`).
  ```python
  adb_device = AdbDevice(device='your_device_identifier')
  ```

  All the commands below can be called once a device instance has been initiated. This is exemplified by the `adb_device` variable.

  You can gain root privilages using the `root` method:
  Restarts adb with root privileges.
  `:return:` AdbResult containing the completed process of `adb root`
  ```python
  adb_device.root()
  ```
  - Expected result: AdbResult instance with either `success=True and stdout='{device_status}'` or `success=False and stderr='ADB error'`

  You can excecute shell commands on the device using the `shell` method:
  Executes a command on the shell of the device like: `adb shell {command}`
  `:param command:` the command to run on the shell of the connected device.
  `:return:` AdbResult containing the completed process of `adb shell {command}`
  ```python
  shell_result = adb_device.shell(command="dumpsys activity")
  ```

  You can pull files from the device using the `pull` method:
  Copies a file off the device to a given local directory
  `:param file_to_pull:` complete path to the file to copy from the device
  `:param destination:` the directory in which the package file(s) are to be located. Will be created if needed.
  `:return:` A PullResult object with the completed_adb_process of the `adb pull` action, the destination path and a success flag
  ```python
  pull_result = adb_device.pull(file_to_pull='/path/on/device/file', destination='/local/path')

  if pull_result.success:
      print(f"File pulled to: {pull_result.path}")
  else:
      print(f"File pull failed. See {pull_result.completed_adb_process}.")
  ```

  You can install APK files on the device using the `install` method:
  Installs a given apk on the connected device.
  `:param apk_path:` the location of the apk file on the local machine
  `:param r: -r option:` replace already installed application. This is needed on physical devices or if you get an error that the application already exists and should be uninstalled first.
  `:return:` the completed process of 'adb install [-r] {apk_path}'
  ```python
  install_result = adb_device.install(apk_path='/local/path/to/apk')
  if install_result.success:
      print("APK installed successfully.")
  else:
      print("APK installation failed.")
  ```

  You can open intents on the device using the `open_intent` method. This is useful for opening URLs:
  Opens a given url on the device by starting an intent. If a default app is associated with this URL, this will
  result in the app being opened.
  `:param url:` The URL to open
  `:return:` the completed process of adb shell and start -a android.intent.action.VIEW -d '{url}'
  ```python
  intent_result = adb_device.open_intent(url='http://example.com')
  if intent_result.success:
      print("Intent opened successfully.")
  else:
      print("Failed to open intent.")
  ```

  You can get properties from the device using the `get_prop` method:
  Retrieves the value of a given property through the `adb getprop method`
  `:param property:` the property from which the value is needed
  `:return:` the value of the property, or None if the property doesn't exist
  ```python
  intent_result = adb_device.open_intent(url='http://example.com')
  if intent_result.success:
      print("Intent opened successfully.")
  else:
      print("Failed to open intent.")
  ```

  We cannot cover everything in detail here, but here is a more general overview of all the functionality

  * AdbDevice(device=None, check_device_exists=True)
  * get_device_status(device_name)

  * get_device_status(device_name)
  * get_state()

  * shell(command, timeout=None)
  * root()
  * wait_for_device()
  * emu_avd(command)

  * installed_packages()
  * path_package(package_name)
  * package_versions(package_name)

  ls(path)
  * pull(file_to_pull, destination)
  * pull_multi(files_to_pull, destination)

  * pull_package(package_name, destination)
  * install(apk_path, r=False)
  * install_multiple(apk_paths, r=False)

  * open_intent(url)

  * snapshots_list()
  * snapshot_exists(snapshot_name)
  * snapshot_load(snapshot_name)
  * snapshot_save(snapshot_name)
  * snapshot_delete(delete=None)

  Be sure to handle errors gracefully in your code, as various operations may fail, adb-pywrapper tries to provide information where possible on success or failure in the `AdbResult` and `PullResult` objects.

  Contributions to the adb-pywrapper package are welcome. If you encounter any issues, have suggestions, or want to contribute, feel free to open an issue or PR. Find our contribution guidelines [here](CONTRIBUTING.md).


pkgId: 083c7a89478822b726bfd124851932132dec40abc88dc49415fb22a7190af247
name: python-adb-shell
arch: src
version: 0.4.4
epoch: 0
release: 1
summary: A Python implementation of ADB with shell and FileSync functionality.
url: https://github.com/JeffLIrion/adb_shell
rpm_license: Apache Software License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adb-shell-0.4.4-1.src.rpm
checksum_type: sha256
description:
  Documentation for this package can be found at https://adb-shell.readthedocs.io/.
  Prebuilt wheel can be downloaded from `nightly.link <https://nightly.link/JeffLIrion/adb_shell/workflows/python-package/master/wheel.zip>`_.
  This Python package implements ADB shell and FileSync functionality.  It originated from `python-adb <https://github.com/google/python-adb>`_.


pkgId: ca42e2834f976ebeec0249e634396abb42dd055e2cb1bea687567267220f46b4
name: python-adb-utils
arch: src
version: 1.0.17
epoch: 0
release: 1
summary: This is a secondary package of adb
url: https://github.com/hakaboom/adb-utils
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adb-utils-1.0.17-1.src.rpm
checksum_type: sha256
description:
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/adb-utils)

  对adb常用接口的二次开发


  - python>=3.8
  - 项目里用到了[base_image](https://github.com/hakaboom/base_image) 因此需要额外安装opencv-python



  pip3 install adb-utils


  - [ ] minicap集成
  - [ ] minitouch集成
  - [ ] 设备性能数据可视化
  - [ ] 基于PYQT的设备管理工具


  不打算写,看源码备注就行了


pkgId: e4555c22fda69f2faf2ba7f5d0544963afa2e72dc51b752197105060cd85ddc7
name: python-adbench
arch: src
version: 0.1.11
epoch: 0
release: 1
summary: Python package of ADBench
url: https://github.com/Minqi824/ADBench
rpm_license: BSD License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adbench-0.1.11-1.src.rpm
checksum_type: sha256
description:
  Python package of ADBench: Anomaly detection benchmark. Fast implementation of the large experiments in ADBench and your customized AD algorithm.


pkgId: 2d1ffef48cdd72e7f797ac73748d5ee445e4e6fe00f47cf0bba3f168694936a1
name: python-adbkit
arch: src
version: 0.25
epoch: 0
release: 1
summary: Big automation package for ADB
url: https://github.com/hansalemaos/adbkit
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adbkit-0.25-1.src.rpm
checksum_type: sha256
description:
  **Don't get confused about the instance "self". I did it because it is faster copying methods from the class :)**



  [![YT](https://github.com/hansalemaos/adbkit/raw/main/adbv/instagram.jpg)](https://www.youtube.com/watch?v=sUAxys08d48)
  [https://www.youtube.com/watch?v=sUAxys08d48]()

  [![YT](https://github.com/hansalemaos/adbkit/raw/main/adbv/tiktok.jpg)](https://www.youtube.com/watch?v=pWoDaTeobCw)
  [https://www.youtube.com/watch?v=pWoDaTeobCw]()

  [![YT](https://github.com/hansalemaos/adbkit/raw/main/adbv/youtube.jpg)](https://www.youtube.com/watch?v=sRYspWNviQI)
  [https://www.youtube.com/watch?v=sRYspWNviQI]()


  **03/08/2023: Added 2 methods to find parents/children**

  ```python






  self.aa_update_screenshot()
  self.aa_get_all_displayed_items_from_uiautomator_parents_children(screenshotfolder='c:\\shotfolder')


  self.aa_get_all_displayed_items_from_uiautomator_parents_children(df,screenshotfolder='c:\\shotfolder')

  Adds 2 columns:
     bb_index_parent  bb_index_child
  0               24             252
  1               38              70
  2               38             213
  3               43              38
  4               43              54
  5               43              70
  6               43              86
  7               43             102
  8               43             118
  9               43             134
  ....







  self.aa_update_screenshot()
  self.aa_get_all_displayed_items_from_activities_parents_children(screenshotfolder='c:\\shotfolder')


  self.aa_get_all_displayed_items_from_activities_parents_children(df,screenshotfolder='c:\\shotfolder')


  Adds 2 columns:
     aa_index_parent  aa_index_child
  0               24             252
  1               38              70
  2               38             213
  3               43              38
  4               43              54
  5               43              70
  6               43              86
  7               43             102
  8               43             118
  9               43             134
  ....

  ```


  **28/05/2023: Added fast screenshots with scrcpy - no root required and some other methods**

  ```python
  from adbkit import ADBTools
  from kthread_sleep import sleep

  adb_path = r'C:\ProgramData\chocolatey\bin\adb.exe'
  deviceserial = "localhost:5555"
  ADBTools.aa_kill_all_running_adb_instances()

  self = ADBTools(adb_path=adb_path, deviceserial=deviceserial)
  self.aa_start_server() # creates a new process which is not a child process
  sleep(3)
  self.aa_connect_to_device()
  self.aa_activate_scrcpy_screenshots_tcp(adb_host_address="127.0.0.1", adb_host_port=5037, lock_video_orientation=0)






  self.aa_show_screenshot( sleeptime=1, killkeys="ctrl+alt+h")



  self.aa_kill_show_screenshot()


  self.aa_kill_scrcpy_connection()

  ```

  **10/03/2023: Tesseract with multiprocessing / Bluestacks Hyper-V connect**

  ```python

  from adbkit import ADBTools
  ald=ADBTools.connect_to_all_bluestacks_hyperv_devices(    adb_path="C:\\Users\\Gamer\\AppData\\Local\\Android\\Sdk\\platform-tools\\adb.exe",
  timeout=10,
  bluestacks_config=r"C:\ProgramData\BlueStacks_nxt\bluestacks.conf",)


  adb_path = "C:\\Users\\Gamer\\AppData\\Local\\Android\\Sdk\\platform-tools\\adb.exe"
  deviceserial = "localhost:52249"
  self = ADBTools(adb_path=adb_path, deviceserial=deviceserial)
  self.aa_connect_to_device()
  self.aa_activate_tesseract(
      tesseractpath=r"C:\Program Files\Tesseract-OCR\tesseract.exe"
  )
  self.aa_update_screenshot()
  df=self.aa_get_all_displayed_items_from_uiautomator(
  	screenshotfolder="f:\\compare_android2",  # screenshots will be saved here
  	max_variation_percent_x=10,  # used for one of the click functions, to not click exactly in the center - more information below
  	max_variation_percent_y=10,  # used for one of the click functions, to not click exactly in the center
  	loung_touch_delay=(
  		1000,
  		1500,
  	),  # with this settings longtouch will take somewhere between 1 and 1,5 seconds
  	swipe_variation_startx=10,  # swipe coordinate variations in percent
  	swipe_variation_endx=10,
  	swipe_variation_starty=10,
  	swipe_variation_endy=10,
  	sdcard="/storage/emulated/0/",  # sdcard will be used if you use the sendevent methods, don't pass a symlink - more information below
  	tmp_folder_on_sd_card="AUTOMAT",  # this folder will be created in the sdcard folder for using sendevent actions
  	bluestacks_divider=32767,  # coordinates must be recalculated for BlueStacks https://stackoverflow.com/a/73733261/15096247 when using sendevent
  )
  self.aa_ocr_df_with_tesseract_multiprocessing(df,language='eng', cpus=5)


        bb_area  bb_bounds  bb_center_x  bb_center_x_cropped  bb_center_y  bb_center_y_cropped  bb_checkable  bb_checked   bb_class  bb_clickable bb_content_desc  bb_cropped_x_end  bb_cropped_x_start  bb_cropped_y_end  bb_cropped_y_start  bb_enabled  bb_focusable  bb_focused  bb_height  bb_height_cropped  bb_index bb_keys_hierarchy  bb_long_clickable  bb_old_index bb_package  bb_password bb_pure_id bb_resource_id bb_screenshot  bb_scrollable  bb_selected bb_shapely    bb_text  bb_valid_square  bb_width  bb_width_cropped  bb_x_end  bb_x_start  bb_y_end  bb_y_start ee_bb_longtouch ee_bb_longtouch_bs ee_bb_longtouch_offset ee_bb_longtouch_offset_bs ee_bb_touch ee_bb_touch_bs ee_bb_touch_offset ee_bb_touch_offset_bs ff_bb_downswipe ff_bb_save_screenshot ff_bb_show_screenshot ff_bb_tap_center_offset ff_bb_tap_center_offset_long ff_bb_tap_center_variation ff_bb_tap_center_variation_long ff_bb_tap_exact_center ff_bb_tap_exact_center_long ff_bb_upswipe bb_scanned_text
  0   1440000.0  (0, 0,...        800          800                  450          450                False         False   androi...      False                          1600                 0                 900                 0                True       False         False         900        900                 0    (node,)             False                  0     com.bl...      False         <NA>                 [[[144...         False          False    POLYGO...                  True            1600       1600             1600          0        900          0          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Size: ...
  1   1440000.0  (0, 0,...        800          800                  450          450                False         False   androi...      False                          1600                 0                 900                 0                True       False         False         900        900                 0  (node,...             False                  1     com.bl...      False         <NA>                 [[[144...         False          False    POLYGO...                  True            1600       1600             1600          0        900          0          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Size: ...
  2   1440000.0  (0, 0,...        800          800                  450          450                False         False   androi...      False                          1600                 0                 900                 0                True       False         False         900        900                 0  (node,...             False                  2     com.bl...      False    id/con...  androi...      [[[144...         False          False    POLYGO...                  True            1600       1600             1600          0        900          0          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Size: ...
  3   1440000.0  (0, 0,...        800          800                  450          450                False         False   androi...      False                          1600                 0                 900                 0                True       False         False         900        900                 0  (node,...             False                  3     com.bl...      False         <NA>                 [[[144...         False          False    POLYGO...                  True            1600       1600             1600          0        900          0          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Size: ...
  4   1382400.0  (0, 36...        800          800                  468          468                False         False   androi...      False                          1600                 0                 900                36                True       False         False         864        864                 0  (node,...             False                  4     com.bl...      False    id/dra...  com.bl...      [[[32,...         False          False    POLYGO...                  True            1600       1600             1600          0        900         36          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     m6: Â«...
  5   1382400.0  (0, 36...        800          800                  468          468                False         False   androi...      False                          1600                 0                 900                36                True       False         False         864        864                 0  (node,...             False                  5     com.bl...      False    id/ite...  com.bl...      [[[32,...         False          False    POLYGO...                  True            1600       1600             1600          0        900         36          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     m6: Â«...
  6   1382400.0  (0, 36...        800          800                  468          468                False         False   androi...      False                          1600                 0                 900                36                True       False         False         864        864                 0  (node,...             False                  6     com.bl...      False         <NA>                 [[[32,...         False          False    POLYGO...                  True            1600       1600             1600          0        900         36          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     m6: Â«...
  7   1382400.0  (0, 36...        800          800                  468          468                False         False   androi...      False                          1600                 0                 900                36                True       False         False         864        864                 1  (node,...             False                  7     com.bl...      False         <NA>                 [[[32,...         False          False    POLYGO...                  True            1600       1600             1600          0        900         36          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     m6: Â«...
  8    771120.0  (44, 8...        800          800                  335          335                False         False     a.q.a.b      False                          1556                44                 590                80                True        True         False         510        510                 0  (node,...             False                  8     com.bl...      False    id/des...  com.bl...      [[[35,...         False          False    POLYGO...                  True            1512       1512             1556         44        590         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     as Â¥ ...
  9    281464.0  (196, ...        800          800                  783          783                False         False   androi...      False                          1404               196                 900               667                True       False         False         233        233                 3  (node,...             False                  9     com.bl...      False      id/dock  com.bl...      [[[35,...         False          False    POLYGO...                  True            1208       1208             1404        196        900        667          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Street...
  10   771120.0  (44, 8...        800          800                  335          335                False         False   androi...      False                          1556                44                 590                80                True       False         False         510        510                 0  (node,...             False                 10     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True            1512       1512             1556         44        590         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     as Â¥ ...
  11    21744.0  (196, ...        800          800                  685          685                False         False   androi...      False                          1404               196                 694               676                True       False         False          18         18                 0  (node,...             False                 11     com.bl...      False    id/pop...  com.bl...      [[[35,...         False          False    POLYGO...  JOGOS ...       True            1208       1208             1404        196        694        676          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     JOGOS ...
  12   248848.0  (196, ...        800          800                  797          797                False         False   androi...      False                          1404               196                 900               694                True       False         False         206        206                 1  (node,...             False                 12     com.bl...      False    id/fra...  com.bl...      [[[35,...         False          False    POLYGO...                  True            1208       1208             1404        196        900        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Â¥ 4 e...
  13    42840.0  (44, 8...        170          170                  165          165                False         False   androi...       True                           296                44                 250                80                True        True         False         170        170                 0  (node,...              True                 13     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True             252        252              296         44        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Play S...
  14    42840.0  (296, ...        422          422                  165          165                False         False   androi...       True                           548               296                 250                80                True        True         False         170        170                 1  (node,...              True                 14     com.bl...      False         <NA>                 [[[36,...         False          False    POLYGO...                  True             252        252              548        296        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Centra...
  15    42840.0  (548, ...        674          674                  165          165                False         False   androi...       True                           800               548                 250                80                True        True         False         170        170                 2  (node,...              True                 15     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True             252        252              800        548        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     as Ga ...
  16    42840.0  (800, ...        926          926                  165          165                False         False   androi...       True                          1052               800                 250                80                True        True         False         170        170                 3  (node,...              True                 16     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True             252        252             1052        800        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Jogue ...
  17    42840.0  (1052,...       1178         1178                  165          165                False         False   androi...       True                          1304              1052                 250                80                True        True         False         170        170                 4  (node,...              True                 17     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True             252        252             1304       1052        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     IMEI/P...
  18    42840.0  (1304,...       1430         1430                  165          165                False         False   androi...       True                          1556              1304                 250                80                True        True         False         170        170                 5  (node,...              True                 18     com.bl...      False         <NA>                 [[[38,...         False          False    POLYGO...                  True             252        252             1556       1304        250         80          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     SocksD...
  19   248848.0  (196, ...        800          800                  797          797                False         False   androi...      False                          1404               196                 900               694                True       False         False         206        206                 0  (node,...             False                 19     com.bl...      False         <NA>                 [[[35,...         False          False    POLYGO...                  True            1208       1208             1404        196        900        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Â¥ 4 e...
  20   140128.0  (196, ...        800          800                  842          842                False         False   androi...      False                          1404               196                 900               784                True       False         False         116        116                 1  (node,...             False                 20     com.bl...      False    id/vie...  com.bl...      [[[35,...         False          False    POLYGO...                  True            1208       1208             1404        196        900        784          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  21   197288.0  (258, ...        800          800                  785          785                False         False   androi...      False                          1342               258                 876               694                True       False         False         182        182                 0  (node,...             False                 21     com.bl...      False    id/all...  com.bl...      [[[35,...         False          False    POLYGO...                  True            1084       1084             1342        258        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     a 2e4 ...
  22    28938.0  (324, ...        403          403                  785          785                False         False   androi...       True                           483               324                 876               694                True        True         False         182        182                 0  (node,...             False                 22     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             159        159              483        324        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Street...
  23    28938.0  (483, ...        562          562                  785          785                False         False   androi...       True                           642               483                 876               694                True        True         False         182        182                 1  (node,...             False                 23     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             159        159              642        483        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Ly m V...
  24    28938.0  (642, ...        721          721                  785          785                False         False   androi...       True                           801               642                 876               694                True        True         False         182        182                 2  (node,...             False                 24     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             159        159              801        642        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  25    28938.0  (801, ...        880          880                  785          785                False         False   androi...       True                           960               801                 876               694                True        True         False         182        182                 3  (node,...             False                 25     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             159        159              960        801        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     War Ro...
  26    28756.0  (960, ...       1039         1039                  785          785                False         False   androi...       True                          1118               960                 876               694                True        True         False         182        182                 4  (node,...             False                 26     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             158        158             1118        960        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Warspe...
  27    28756.0  (1118,...       1197         1197                  785          785                False         False   androi...       True                          1276              1118                 876               694                True        True         False         182        182                 5  (node,...             False                 27     com.bl...      False    id/app...  com.bl...      [[[35,...         False          False    POLYGO...                  True             158        158             1276       1118        876        694          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Dark O...
  28    10000.0  (353, ...        403          403                  770          770                False         False   androi...      False                           453               353                 820               720                True       False         False         100        100                 0  (node,...             False                 28     com.bl...      False    id/app...  com.bl...      [[[44,...         False          False    POLYGO...                  True             100        100              453        353        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  29     7632.0  (324, ...        403          403                  852          852                False         False   androi...      False                           483               324                 876               828                True       False         False          48         48                 1  (node,...             False                 29     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  Street...       True             159        159              483        324        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Street...
  30    10000.0  (512, ...        562          562                  770          770                False         False   androi...      False                           612               512                 820               720                True       False         False         100        100                 0  (node,...             False                 30     com.bl...      False    id/app...  com.bl...      [[[46,...         False          False    POLYGO...                  True             100        100              612        512        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()       a wings
  31     7632.0  (483, ...        562          562                  852          852                False         False   androi...      False                           642               483                 876               828                True       False         False          48         48                 1  (node,...             False                 31     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  Viking...       True             159        159              642        483        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Viking...
  32    10000.0  (671, ...        721          721                  770          770                False         False   androi...      False                           771               671                 820               720                True       False         False         100        100                 0  (node,...             False                 32     com.bl...      False    id/app...  com.bl...      [[[182...         False          False    POLYGO...                  True             100        100              771        671        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  33     7632.0  (642, ...        721          721                  852          852                False         False   androi...      False                           801               642                 876               828                True       False         False          48         48                 1  (node,...             False                 33     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  Draken...       True             159        159              801        642        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Draken...
  34    10000.0  (830, ...        880          880                  770          770                False         False   androi...      False                           930               830                 820               720                True       False         False         100        100                 0  (node,...             False                 34     com.bl...      False    id/app...  com.bl...      [[[184...         False          False    POLYGO...                  True             100        100              930        830        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  35     7632.0  (801, ...        880          880                  852          852                False         False   androi...      False                           960               801                 876               828                True       False         False          48         48                 1  (node,...             False                 35     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  War Ro...       True             159        159              960        801        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     War Ro...
  36    10000.0  (989, ...       1039         1039                  770          770                False         False   androi...      False                          1089               989                 820               720                True       False         False         100        100                 0  (node,...             False                 36     com.bl...      False    id/app...  com.bl...      [[[243...         False          False    POLYGO...                  True             100        100             1089        989        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  37     7584.0  (960, ...       1039         1039                  852          852                False         False   androi...      False                          1118               960                 876               828                True       False         False          48         48                 1  (node,...             False                 37     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  Warspe...       True             158        158             1118        960        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Warspe...
  38    10000.0  (1147,...       1197         1197                  770          770                False         False   androi...      False                          1247              1147                 820               720                True       False         False         100        100                 0  (node,...             False                 38     com.bl...      False    id/app...  com.bl...      [[[59,...         False          False    POLYGO...                  True             100        100             1247       1147        820        720          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  39     7584.0  (1118,...       1197         1197                  852          852                False         False   androi...      False                          1276              1118                 876               828                True       False         False          48         48                 1  (node,...             False                 39     com.bl...      False    id/app...  com.bl...      [[[53,...         False          False    POLYGO...  Dark O...       True             158        158             1276       1118        876        828          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()     Dark O...
  40      529.0  (745, ...        756          756                  734          734                False         False   androi...      False                           768               745                 746               723                True       False         False          23         23                 0  (node,...             False                 40     com.bl...      False    id/pop...  com.bl...      [[[0, ...         False          False    POLYGO...                  True              23         23              768        745        746        723          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()
  41      529.0  (1221,...       1232         1232                  734          734                False         False   androi...      False                          1244              1221                 746               723                True       False         False          23         23                 0  (node,...             False                 41     com.bl...      False    id/pop...  com.bl...      [[[0, ...         False          False    POLYGO...                  True              23         23             1244       1221        746        723          ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()





  self.aa_update_screenshot()
  df = self.aa_get_all_displayed_items_from_activities(
  	screenshotfolder="f:\\compare_android",  # screenshots will be saved here
  	max_variation_percent_x=10,  # used for one of the click functions, to not click exactly in the center - more information below
  	max_variation_percent_y=10,  # used for one of the click functions, to not click exactly in the center
  	loung_touch_delay=(
  		1000,
  		1500,
  	),  # with this settings longtouch will take somewhere between 1 and 1,5 seconds
  	swipe_variation_startx=10,  # swipe coordinate variations in percent
  	swipe_variation_endx=10,
  	swipe_variation_starty=10,
  	swipe_variation_endy=10,
  	sdcard="/storage/emulated/0/",  # sdcard will be used if you use the sendevent methods, don't pass a symlink - more information below
  	tmp_folder_on_sd_card="AUTOMAT",  # this folder will be created in the sdcard folder for using sendevent actions
  	bluestacks_divider=32767,  # coordinates must be recalculated for BlueStacks https://stackoverflow.com/a/73733261/15096247 when using sendevent
  )
  dftesser=self.aa_ocr_df_with_tesseract_multiprocessing(df,language='eng', cpus=5)


        aa_area  aa_bounds  aa_center_x  aa_center_x_cropped  aa_center_y  aa_center_y_cropped aa_class_name aa_clickable aa_complete_dump aa_context_clickable  aa_cropped_x_end  aa_cropped_x_start  aa_cropped_y_end  aa_cropped_y_start aa_depth aa_drawn aa_enabled aa_focusable  aa_has_screenshot aa_hashcode_hex aa_hashcode_int  aa_height  aa_height_cropped aa_id_information  aa_is_child aa_long_clickable aa_mID_hex aa_mID_int aa_old_index aa_pflag_activated aa_pflag_dirty_mask aa_pflag_focused aa_pflag_hovered aa_pflag_invalidated aa_pflag_is_root_namespace aa_pflag_prepressed aa_pflag_selected aa_pure_id aa_screenshot aa_scrollbars_horizontal aa_scrollbars_vertical aa_shapely  aa_valid_square aa_visibility  aa_width  aa_width_cropped  aa_x_end aa_x_end_relative  aa_x_start aa_x_start_relative  aa_y_end aa_y_end_relative  aa_y_start aa_y_start_relative ee_aa_longtouch ee_aa_longtouch_bs ee_aa_longtouch_offset ee_aa_longtouch_offset_bs ee_aa_touch ee_aa_touch_bs ee_aa_touch_offset ee_aa_touch_offset_bs ff_aa_downswipe ff_aa_save_screenshot ff_aa_show_screenshot ff_aa_tap_center_offset ff_aa_tap_center_offset_long ff_aa_tap_center_variation ff_aa_tap_center_variation_long ff_aa_tap_exact_center ff_aa_tap_exact_center_long ff_aa_upswipe ff_show_parents  parent_000  parent_001  parent_002  parent_003  parent_004  parent_005  parent_006  parent_007  parent_008  parent_009  parent_010  parent_011 aa_scanned_text
  0       529.0  (427, ...        438          438                  734          734            androi...         False          ...            False                  450               427                 746               723                12     True       True      False         True            c741e85       208936581              23         23          app:id...              True        False          7f08011e  213123...         29        False               True               False            False             True                False                      False               False         id/pop...  [[[103...         False                    False              POLYGO...       True                I           23         23              450         97               427          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              28          27          26          24          22          20           6           5           4           3           2           0
  1       529.0  (586, ...        597          597                  734          734            androi...         False          ...            False                  609               586                 746               723                12     True       True      False         True            e9bb4da       245085402              23         23          app:id...              True        False          7f080121  213123...         33        False               True               False            False             True                False                      False               False         id/pop...  [[[187...         False                    False              POLYGO...       True                I           23         23              609         97               586          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              32          31          26          24          22          20           6           5           4           3           2           0
  2       529.0  (745, ...        756          756                  734          734            androi...         False          ...            False                  768               745                 746               723                12     True       True      False         True            5a48615        94668309              23         23          app:id...              True        False          7f080120  213123...         37        False              False               False            False            False                False                      False               False         id/pop...  [[[0, ...         False                    False              POLYGO...       True                V           23         23              768         97               745          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              36          35          26          24          22          20           6           5           4           3           2           0
  3       529.0  (904, ...        915          915                  734          734            androi...         False          ...            False                  927               904                 746               723                12     True       True      False         True            4029d0b        67280139              23         23          app:id...              True        False          7f08011d  213123...         41        False               True               False            False             True                False                      False               False         id/pop...  [[[255...         False                    False              POLYGO...       True                I           23         23              927         97               904          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              40          39          26          24          22          20           6           5           4           3           2           0
  4       529.0  (1063,...       1074         1074                  734          734            androi...         False          ...            False                 1086              1063                 746               723                12     True       True      False         True            27867e8        41445352              23         23          app:id...              True        False          7f08011c  213123...         45        False               True               False            False             True                False                      False               False         id/pop...  [[[65,...         False                    False              POLYGO...       True                I           23         23             1086         97              1063          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              44          43          26          24          22          20           6           5           4           3           2           0
  5       529.0  (1221,...       1232         1232                  734          734            androi...         False          ...            False                 1244              1221                 746               723                12     True       True      False         True            125ad2a        19246378              23         23          app:id...              True        False          7f08011f  213123...         49        False              False               False            False            False                False                      False               False         id/pop...  [[[0, ...         False                    False              POLYGO...       True                V           23         23             1244         97              1221          74                746         26               723           3                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              48          47          26          24          22          20           6           5           4           3           2           0
  6     10000.0  (353, ...        403          403                  770          770            androi...         False          ...            False                  453               353                 820               720                11    False       True      False         True            29caf0f        43822863             100        100          app:id...              True        False          7f080058  213123...         28        False              False               False            False            False                False                      False               False         id/app...  [[[44,...         False                    False              POLYGO...       True                V          100        100              453        129               353          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              27          26          24          22          20           6           5           4           3           2           0        <NA>
  7      7632.0  (324, ...        403          403                  852          852            androi...         False          ...            False                  483               324                 876               828                11     True       True      False         True            ea74b9c       245844892              48         48          app:id...              True        False          7f080060  213123...         30        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          159        159              483        159               324           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              27          26          24          22          20           6           5           4           3           2           0        <NA>   Street...
  8     10000.0  (512, ...        562          562                  770          770            androi...         False          ...            False                  612               512                 820               720                11    False       True      False         True            cece9a5       216852901             100        100          app:id...              True        False          7f08005b  213123...         32        False              False               False            False            False                False                      False               False         id/app...  [[[46,...         False                    False              POLYGO...       True                V          100        100              612        129               512          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              31          26          24          22          20           6           5           4           3           2           0        <NA>     a wings
  9      7632.0  (483, ...        562          562                  852          852            androi...         False          ...            False                  642               483                 876               828                11     True       True      False         True            aadf17a       179171706              48         48          app:id...              True        False          7f080063  213123...         34        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          159        159              642        159               483           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              31          26          24          22          20           6           5           4           3           2           0        <NA>   Viking...
  10    10000.0  (671, ...        721          721                  770          770            androi...         False          ...            False                  771               671                 820               720                11    False       True      False         True            9ff2d2b       167718187             100        100          app:id...              True        False          7f08005a  213123...         36        False              False               False            False            False                False                      False               False         id/app...  [[[182...         False                    False              POLYGO...       True                V          100        100              771        129               671          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              35          26          24          22          20           6           5           4           3           2           0        <NA>
  11     7632.0  (642, ...        721          721                  852          852            androi...         False          ...            False                  801               642                 876               828                11     True       True      False         True            bab8588       195790216              48         48          app:id...              True        False          7f080062  213123...         38        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          159        159              801        159               642           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              35          26          24          22          20           6           5           4           3           2           0        <NA>   Draken...
  12    10000.0  (830, ...        880          880                  770          770            androi...         False          ...            False                  930               830                 820               720                11    False       True      False         True            9e77b21       166165281             100        100          app:id...              True        False          7f080057  213123...         40        False              False               False            False            False                False                      False               False         id/app...  [[[184...         False                    False              POLYGO...       True                V          100        100              930        129               830          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              39          26          24          22          20           6           5           4           3           2           0        <NA>
  13     7632.0  (801, ...        880          880                  852          852            androi...         False          ...            False                  960               801                 876               828                11     True       True      False         True            b99ab46       194620230              48         48          app:id...              True        False          7f08005f  213123...         42        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          159        159              960        159               801           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              39          26          24          22          20           6           5           4           3           2           0        <NA>   War Ro...
  14    10000.0  (989, ...       1039         1039                  770          770            androi...         False          ...            False                 1089               989                 820               720                11    False       True      False         True             c17107        12677383             100        100          app:id...              True        False          7f080056  213123...         44        False              False               False            False            False                False                      False               False         id/app...  [[[243...         False                    False              POLYGO...       True                V          100        100             1089        129               989          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              43          26          24          22          20           6           5           4           3           2           0        <NA>
  15     7584.0  (960, ...       1039         1039                  852          852            androi...         False          ...            False                 1118               960                 876               828                11     True       True      False         True            5377234        87519796              48         48          app:id...              True        False          7f08005e  213123...         46        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          158        158             1118        158               960           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              43          26          24          22          20           6           5           4           3           2           0        <NA>   Warspe...
  16    10000.0  (1147,...       1197         1197                  770          770            androi...         False          ...            False                 1247              1147                 820               720                11    False       True      False         True            59fa85d        94349405             100        100          app:id...              True        False          7f080059  213123...         48        False              False               False            False            False                False                      False               False         id/app...  [[[59,...         False                    False              POLYGO...       True                V          100        100             1247        129              1147          29                820        134               720          34                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              47          26          24          22          20           6           5           4           3           2           0        <NA>
  17     7584.0  (1118,...       1197         1197                  852          852            androi...         False          ...            False                 1276              1118                 876               828                11     True       True      False         True            f3535d2       255145426              48         48          app:id...              True        False          7f080061  213123...         50        False              False               False            False            False                False                      False               False         id/app...  [[[53,...         False                    False              POLYGO...       True                V          158        158             1276        158              1118           0                876        190               828         142                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              47          26          24          22          20           6           5           4           3           2           0        <NA>   Dark O...
  18    30210.0  (324, ...        403          403                  781          781            androi...          True          ...            False                  483               324                 876               686                10    False       True       True         True            18369ed        25389549             190        190          app:id...              True        False          7f080050  213123...         27        False              False               False            False            False                False                      False               False         id/app...  [[[35,...         False                    False              POLYGO...       True                V          159        159              483        225               324          66                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   Street...
  19    30210.0  (483, ...        562          562                  781          781            androi...          True          ...            False                  642               483                 876               686                10    False       True       True         True            9888022       159940642             190        190          app:id...              True        False          7f080053  213123...         31        False              False               False            False            False                False                      False               False         id/app...  [[[35,...         False                    False              POLYGO...       True                V          159        159              642        384               483         225                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   Ly m V...
  20    30210.0  (642, ...        721          721                  781          781            androi...          True          ...            False                  801               642                 876               686                10    False       True       True         True            2751ab3        41228979             190        190          app:id...              True        False          7f080052  213123...         35        False              False               False            False            False                False                      False               False         id/app...  [[[35,...         False                    False              POLYGO...       True                V          159        159              801        543               642         384                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   i Drak...
  21    30210.0  (801, ...        880          880                  781          781            androi...          True          ...            False                  960               801                 876               686                10    False       True       True         True            3711870        57743472             190        190          app:id...              True        False          7f08004f  213123...         39        False              False               False            False            False                False                      False               False         id/app...  [[[87,...         False                    False              POLYGO...       True                V          159        159              960        702               801         543                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   War Ro...
  22    30020.0  (960, ...       1039         1039                  781          781            androi...          True          ...            False                 1118               960                 876               686                10    False       True       True         True            339b7e9        54114281             190        190          app:id...              True        False          7f08004e  213123...         43        False              False               False            False            False                False                      False               False         id/app...  [[[35,...         False                    False              POLYGO...       True                V          158        158             1118        860               960         702                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   Warspe...
  23    30020.0  (1118,...       1197         1197                  781          781            androi...          True          ...            False                 1276              1118                 876               686                10    False       True       True         True            cd27c6e       215121006             190        190          app:id...              True        False          7f080051  213123...         47        False              False               False            False            False                False                      False               False         id/app...  [[[35,...         False                    False              POLYGO...       True                V          158        158             1276       1018              1118         860                876        190               686           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              26          24          22          20           6           5           4           3           2           0        <NA>        <NA>   Dark O...
  24      900.0  (785, ...        800          800                  797          797            androi...         False          ...            False                  815               785                 812               782                 9     True       True      False         True            268c7fc        40421372              30         30          app:id...              True        False          7f0800a8  213123...         25        False              False               False            False             True                False                      False               False         id/doc...  [[[35,...         False                    False              POLYGO...       True                G           30         30              815        619               785         589                812        118               782          88                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              24          22          20           6           5           4           3           2           0        <NA>        <NA>        <NA>
  25   205960.0  (258, ...        800          800                  781          781            androi...         False          ...            False                 1342               258                 876               686                 9    False       True      False         True            8a2d3cc       144888780             190        190          app:id...              True        False          7f080048  213123...         26        False              False               False            False            False                False                      False               False         id/all...  [[[35,...         False                    False              POLYGO...       True                V         1084       1084             1342       1146               258          62                876        182               686          -8                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              24          22          20           6           5           4           3           2           0        <NA>        <NA>        <NA>   Street...
  26    51579.0  (31, 6...        812          812                   78           78            androi...          True          ...            False                 1594                31                  95                62                 9     True       True       True         True            b601a94       190847636              33         33          app:id...              True        False          7f0800c6  213123...         54        False               True               False            False             True                False                      False               False         id/gro...  [[[35,...         False                    False              POLYGO...       True                V         1563       1563             1594       1588                31          25                 95         53                62          20                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              53          52          51           6           5           4           3           2           0        <NA>        <NA>        <NA>
  27  1179406.0  (43, 9...        800          800                  484          484            com.bl...         False          ...            False                 1557                43                 874                95                 9     True       True      False         True            27c993d        41720125             779        779          app:id...              True        False          7f0800c3  213123...         55        False               True               False            False             True                False                      False               False          id/group  [[[35,...         False                    False              POLYGO...       True                V         1514       1514             1557       1551                43          37                874        832                95          53                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              53          52          51           6           5           4           3           2           0        <NA>        <NA>        <NA>   Ga u i...
  28    42840.0  (296, ...        422          422                  165          165            com.bl...          True          ...            False                  548               296                 250                80                 8     True       True       True         True              d801f          884767             170        170               <NA>              True         True              <NA>       <NA>         10        False              False               False            False            False                False                      False               False              <NA>  [[[36,...         False                    False              POLYGO...       True                V          252        252              548        504               296         252                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   Centra...
  29    42840.0  (44, 8...        170          170                  165          165            com.bl...          True          ...            False                  296                44                 250                80                 8     True       True       True         True            9c32f6c       163786604             170        170               <NA>              True         True              <NA>       <NA>         11        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V          252        252              296        252                44           0                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   Play S...
  30    42840.0  (800, ...        926          926                  165          165            com.bl...          True          ...            False                 1052               800                 250                80                 8     True       True       True         True            a164935       169232693             170        170               <NA>              True         True              <NA>       <NA>         12        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V          252        252             1052       1008               800         756                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   Jogue ...
  31    42840.0  (1052,...       1178         1178                  165          165            com.bl...          True          ...            False                 1304              1052                 250                80                 8     True       True       True         True            9c981ca       164200906             170        170               <NA>              True         True              <NA>       <NA>         13        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V          252        252             1304       1260              1052        1008                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   IMEI/P...
  32    42840.0  (548, ...        674          674                  165          165            com.bl...          True          ...            False                  800               548                 250                80                 8     True       True       True         True            c93ff3b       211025723             170        170               <NA>              True         True              <NA>       <NA>         14        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V          252        252              800        756               548         504                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   as Ga ...
  33    42840.0  (1304,...       1430         1430                  165          165            com.bl...          True          ...            False                 1556              1304                 250                80                 8     True       True       True         True            569d658        90822232             170        170               <NA>              True         True              <NA>       <NA>         15        False              False               False            False            False                False                      False               False              <NA>  [[[38,...         False                    False              POLYGO...       True                V          252        252             1556       1512              1304        1260                250        170                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   SocksD...
  34   140128.0  (196, ...        800          800                  842          842            androi...         False          ...            False                 1404               196                 900               784                 8     True       True      False         True            d395417       221860887             116        116          app:id...              True        False          7f08017f  213123...         23        False              False               False            False            False                False                      False               False         id/vie...  [[[35,...         False                    False              POLYGO...       True                V         1208       1208             1404       1208               196           0                900        206               784          90                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              22          20           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>
  35   248848.0  (196, ...        800          800                  797          797            androi...         False          ...            False                 1404               196                 900               694                 8    False       True      False         True            9d20004       164757508             206        206               <NA>              True        False              <NA>       <NA>         24        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V         1208       1208             1404       1208               196           0                900        206               694           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              22          20           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   Â¥ 4 e...
  36  1352976.0  (6, 42...        800          800                  468          468            androi...         False          ...            False                 1594                 6                 894                42                 8    False       True      False         True            ebbfee7       247201511             852        852               <NA>              True        False              <NA>       <NA>         53        False               True               False            False             True                False                      False               False              <NA>  [[[39,...         False                    False              POLYGO...       True                V         1588       1588             1594       1594                 6           6                894        858                42           6                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              52          51           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>   a | | ...
  37   771120.0  (44, 8...        800          800                  335          335            com.bl...         False          ...            False                 1556                44                 590                80                 7     True       True      False         True             49b71b         4831003             510        510               <NA>              True        False              <NA>       <NA>          9        False              False               False            False            False                False                      False               False              <NA>  [[[35,...         False                    False              POLYGO...       True                V         1512       1512             1556       1512                44           0                590        510                80           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>   as Â¥ ...
  38      225.0  (726, ...        733          733                  620          620            androi...         False          ...            False                  741               726                 628               613                 7     True       True      False         True            1b8c9ce        28887502              15         15          app:id...              True        False          7f0800ef  213123...         18        False               True               False            False             True                False                      False               False         id/loa...  [[[35,...         False                    False              POLYGO...       True                V           15         15              741         25               726          10                628         22               613           7                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              17           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>
  39     2604.0  (751, ...        813          813                  620          620            androi...         False          ...            False                  875               751                 631               610                 7     True       True      False         True            c7ee0ef       209641711              21         21          app:id...              True        False          7f0800dc  213123...         19        False               True               False            False             True                False                      False               False         id/ins...  [[[35,...         False                    False              POLYGO...       True                V          124        124              875        159               751          35                631         25               610           4                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              17           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>
  40    21744.0  (196, ...        800          800                  685          685            androi...         False          ...            False                 1404               196                 694               676                 7     True       True      False         True            d6f43b1       225395633              18         18          app:id...              True        False          7f08011b  213123...         21        False              False               False            False            False                False                      False               False         id/pop...  [[[35,...         False                    False              POLYGO...       True                V         1208       1208             1404       1208               196           0                694         27               676           9                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              20           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>   JOGOS ...
  41   248848.0  (196, ...        800          800                  797          797            androi...         False          ...            False                 1404               196                 900               694                 7    False       True      False         True            ae5f096       182841494             206        206          app:id...              True        False          7f0800bd  213123...         22        False              False               False            False            False                False                      False               False         id/fra...  [[[35,...         False                    False              POLYGO...       True                V         1208       1208             1404       1208               196           0                900        233               694          27                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              20           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>   Â¥ 4 e...
  42  1382400.0  (0, 36...        800          800                  468          468            androi...         False          ...            False                 1600                 0                 900                36                 7    False       True      False         True            69044a6       110118054             864        864               <NA>              True        False              <NA>       <NA>         52        False               True               False            False             True                False                      False               False              <NA>  [[[32,...         False                    False              POLYGO...       True                I         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()              51           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  43  1382400.0  (0, 36...        800          800                  468          468            androi...         False          ...            False                 1600                 0                 900                36                 6    False       True      False         True            46dee93        74313363             864        864          app:id...              True        False          7f08006c  213123...          7        False              False               False            False             True                False                      False               False         id/bac...  [[[32,...         False                    False              POLYGO...       True                I         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  44   771120.0  (44, 8...        800          800                  335          335            com.bl...         False          ...            False                 1556                44                 590                80                 6     True       True       True         True            6affac3       112196291             510        510          app:id...              True        False          7f08009e  213123...          8        False              False               False            False            False                False                      False               False         id/des...  [[[35,...         False                    False              POLYGO...       True                V         1512       1512             1556       1556                44          44                590        554                80          44                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   as Â¥ ...
  45    25600.0  (0, 59...        800          800                  598          598            com.bl...         False          ...            False                 1600                 0                 606               590                 6     True       True      False         True            a318ed0       171019984              16         16          app:id...              True        False          7f08009f  213123...         16        False               True               False            False             True                False                      False               False         id/des...  [[[28,...         False                    False              POLYGO...       True                I         1600       1600             1600       1600                 0           0                606        570               590         554                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
  46     5070.0  (716, ...        800          800                  621          621            androi...         False          ...            False                  885               716                 636               606                 6    False       True      False         True            57d5ec9        92102345              30         30          app:id...              True        False          7f0800db  213123...         17        False               True               False            False             True                False                      False               False         id/ins...  [[[35,...         False                    False              POLYGO...       True                I          169        169              885        885               716         716                636        600               606         570                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
  47   281464.0  (196, ...        800          800                  783          783            androi...         False          ...            False                 1404               196                 900               667                 6    False       True      False         True            d275f40       220684096             233        233          app:id...              True        False          7f0800a7  213123...         20        False              False               False            False            False                False                      False               False           id/dock  [[[35,...         False                    False              POLYGO...       True                V         1208       1208             1404       1404               196         196                900        864               667         631                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   Street...
  48  1382400.0  (0, 36...        800          800                  468          468            com.bl...          True          ...            False                 1600                 0                 900                36                 6    False       True       True         True            25d1e01        39656961             864        864          app:id...              True        False          7f0800c4  213123...         51        False               True               False            False             True                False                      False               False         id/gro...  [[[32,...         False                    False              POLYGO...       True                I         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  49    19380.0  (44, 8...         63           63                  335          335            androi...         False          ...            False                   82                44                 590                80                 6     True       True      False         True            4493e79        71908985             510        510          app:id...              True        False          7f0800e5  213123...         56        False              False               False            False            False                False                      False               False         id/lef...  [[[35,...         False                    False              POLYGO...       True                V           38         38               82         82                44          44                590        554                80          44                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
  50    19380.0  (1518,...       1537         1537                  335          335            androi...         False          ...            False                 1556              1518                 590                80                 6     True       True      False         True            ecea7be       248424382             510        510          app:id...              True        False          7f08012e  213123...         57        False              False               False            False            False                False                      False               False         id/rig...  [[[37,...         False                    False              POLYGO...       True                V           38         38             1556       1556              1518        1518                590        554                80          44                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
  51  1382400.0  (0, 36...        800          800                  468          468            androi...         False          ...            False                 1600                 0                 900                36                 5    False       True      False         True            294a77d        43296637             864        864               <NA>              True        False              <NA>       <NA>          6        False              False               False            False            False                False                      False               False              <NA>  [[[32,...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  52  1382400.0  (0, 36...        800          800                  468          468            com.bl...         False          ...            False                 1600                 0                 900                36                 5     True       True      False         True            c019672       201430642             864        864               <NA>              True        False              <NA>       <NA>         58        False              False               False            False            False                False                      False               False              <NA>  [[[32,...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               5           4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  53  1382400.0  (0, 36...        800          800                  468          468            com.bl...         False          ...            False                 1600                 0                 900                36                 4     True       True      False         True            38d79ff        59603455             864        864          app:id...              True        False          7f0800df  213123...          5        False              False               False            False            False                False                      False               False         id/ite...  [[[32,...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        864                36           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               4           3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  54  1382400.0  (0, 36...        800          800                  468          468            androi...         False          ...            False                 1600                 0                 900                36                 3    False       True       True         True            d8cdd1e       227335454             864        864          app:id...              True        False          7f0800b1  213123...          4        False              False                True            False            False                False                      False               False         id/dra...  [[[32,...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        900                36          36                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               3           2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   m6: Â«...
  55  1440000.0  (0, 0,...        800          800                  450          450            androi...         False        an...            False                 1600                 0                 900                 0                 2    False       True      False         True            2b36d59        45313369             900        900               <NA>              True        False              <NA>       <NA>          3        False              False               False            False            False                False                      False               False              <NA>  [[[144...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        900                 0           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               2           0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   Size: ...
  56        0.0  (0, 0,...          0            0                    0            0            androi...         False      andr...            False                    0                 0                   0                 0                 1    False       True      False        False            812b782       135444354               0          0          androi...              True        False           102018a   16908682          1        False              False               False            False             True                False                      False               False         id/act...        NaN         False                    False              POLYGO...      False                G            0          0                0          0                 0           0                  0          0                 0           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()            <NA>                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
  57  1440000.0  (0, 0,...        800          800                  450          450            androi...         False      andr...            False                 1600                 0                 900                 0                 1    False       True      False         True            5f37da0        99843488             900        900          androi...              True        False           1020002   16908290          2        False              False               False            False            False                False                      False               False         id/con...  [[[144...         False                    False              POLYGO...       True                V         1600       1600             1600       1600                 0           0                900        900                 0           0                  ()              ()                 ()                     ()                        ()          ()             ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                          ()            ()               0        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>   Size: ...

  ```

  **01/03/2023: Added adbdevicechanger**
  ```python


  self.aa_activate_adbdevicechanger()
  self.bb_adbdevicechanger.change_android_id()

  b'Row: 0 _id=227, name=device_name, value=OnePlus 5T\r\n'
  Out[7]: ('f7a32086dc724a4a', 'OnePlus 5T')


  self.bb_adbdevicechanger.change_device_name(
      modelregex=".*",
      developerregex=".*",
      androidfullnameregex=".*",
      year=">1",
      month=">0",
      versionnumberaround=7.05,
  )
  b'Row: 0 _id=2340, name=android_id, value=f7a32086dc724a4a\r\n'
  b'Row: 0 _id=228, name=device_name, value=HTC U11\r\n'
  Out[8]: ('f7a32086dc724a4a', 'HTC U11')

  self.bb_adbdevicechanger.change_android_id_and_device_name(
      modelregex=".*",
      developerregex=".*",
      androidfullnameregex=".*",
      year=">1",
      month=">0",
      versionnumberaround=7.05,
  )
  b'Row: 0 _id=2341, name=android_id, value=fb9afc93197942d8\r\n'
  b'Row: 0 _id=229, name=device_name, value=Nokia 8\r\n'
  Out[9]: ('fb9afc93197942d8', 'Nokia 8')


  self.bb_adbdevicechanger.get_random_android_cellphones(    modelregex="Samsung.*",
      developerregex=".*",
      androidfullnameregex=".*",
      year=">2010",
      month=">0",
      versionnumberaround=9.05,
      howmany=10,
      return_list=False,)
  Out[13]:
                         aa_model  ...              uuid
  0  Samsung Galaxy Note 20/Ultra  ...  36f8a604180b4d7f
  1            Samsung Galaxy A70  ...  cb7f374cd85d4330
  2      Samsung Galaxy A30s/A50s  ...  9380749deb5942f6
  3      Samsung Galaxy Note 10/+  ...  c36816b1906542dc
  4    Samsung Galaxy S20/+/Ultra  ...  33dc12217b404a62
  5         Samsung Galaxy A90 5G  ...  cf0084fa8261465d
  6      Samsung Galaxy A51 5G UW  ...  3177aa09b1fc40d9
  7            Samsung Galaxy A01  ...  44db6d59366143cd
  8         Samsung Galaxy A42 5G  ...  a5b6fb2d08ac4475
  9           Samsung Galaxy A20e  ...  806b4ae287ec4d34
  [10 rows x 10 columns]

  ```


  **23/02/2023: New methods**
  ```python
  from adbkit import ADBTools
  adb_path = "C:\\Users\\Gamer\\AppData\\Local\\Android\\Sdk\\platform-tools\\adb.exe"
  deviceserial = "localhost:5555"
  self = ADBTools(adb_path=adb_path, deviceserial=deviceserial)
  self.aa_connect_to_device()
  self.aa_activate_tesseract(
      tesseractpath=r"C:\Program Files\Tesseract-OCR\tesseract.exe"
  )



  self.aa_update_screenshot() # Update the screenshot before
  df=self.aa_ocr_elements_from_activities(['Play Store'], # pass all strings as a list
  minpercentage=85, # fuzzy match
  maxtolerance=10,
  screenshotfolder="f:\\compare_android",  # screenshots will be saved here

  	max_variation_percent_x=10,  # used for one of the click functions, to not click exactly in the center - more information below
  	max_variation_percent_y=10,  # used for one of the click functions, to not click exactly in the center
  	loung_touch_delay=(
  		1000,
  		1500,
  	),  # with this settings longtouch will take somewhere between 1 and 1,5 seconds
  	swipe_variation_startx=10,  # swipe coordinate variations in percent
  	swipe_variation_endx=10,
  	swipe_variation_starty=10,
  	swipe_variation_endy=10,
  	sdcard="/storage/emulated/0/",  # sdcard will be used if you use the sendevent methods, don't pass a symlink - more information below
  	tmp_folder_on_sd_card="AUTOMAT",  # this folder will be created in the sdcard folder for using sendevent actions
  	bluestacks_divider=32767,  # coordinates must be recalculated for BlueStacks https://stackoverflow.com/a/73733261/15096247 when using sendevent
  )

      aa_area       aa_bounds  aa_center_x  aa_center_x_cropped  aa_center_y  aa_center_y_cropped   aa_class_name aa_clickable aa_complete_dump aa_context_clickable  aa_cropped_x_end  aa_cropped_x_start  aa_cropped_y_end  aa_cropped_y_start aa_depth aa_drawn aa_enabled aa_focusable  aa_has_screenshot aa_hashcode_hex aa_hashcode_int  aa_height  aa_height_cropped aa_id_information  aa_is_child aa_long_clickable aa_mID_hex aa_mID_int aa_old_index aa_pflag_activated aa_pflag_dirty_mask aa_pflag_focused aa_pflag_hovered aa_pflag_invalidated aa_pflag_is_root_namespace aa_pflag_prepressed aa_pflag_selected aa_pure_id   aa_screenshot aa_scrollbars_horizontal aa_scrollbars_vertical      aa_shapely  aa_valid_square aa_visibility  aa_width  aa_width_cropped  aa_x_end aa_x_end_relative  aa_x_start aa_x_start_relative  aa_y_end aa_y_end_relative  aa_y_start aa_y_start_relative ee_aa_longtouch ee_aa_longtouch_bs ee_aa_longtouch_offset ee_aa_longtouch_offset_bs ee_aa_touch ee_aa_touch_bs ee_aa_touch_offset ee_aa_touch_offset_bs ff_aa_downswipe ff_aa_save_screenshot ff_aa_show_screenshot ff_aa_tap_center_offset ff_aa_tap_center_offset_long ff_aa_tap_center_variation ff_aa_tap_center_variation_long ff_aa_tap_exact_center ff_aa_tap_exact_center_long ff_aa_upswipe ff_show_parents  parent_000  parent_001  parent_002  parent_003  parent_004  parent_005  parent_006  parent_007  parent_008  parent_009  parent_010  parent_011 aa_scanned_text  aa_tesseract aa_closest_word  aa_resultdiff
  32  30192.0  (26, 26, 23...          128             128               100             100       com.bluesta...         True             ...            False                  230                26                 174                26            8     True       True        False            True            7529967       122853735        148             148               <NA>           True            True         <NA>       <NA>           14           False              False               False            False            False                False                      False               False         <NA>  [[[41, 12, ...           False                    False         POLYGON ((2...            True              V       204             204         230             204            26               0           174             148            26               0                  ()              ()                 ()                     ()                    ()             ()              ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                        ()              ()           9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>      Play Store         100.0      Play Store            0.0






  df2=self.aa_ocr_elements_from_uiautomator(['blai Store'],minpercentage=70, maxtolerance=10, )

      aa_area       aa_bounds  aa_center_x  aa_center_x_cropped  aa_center_y  aa_center_y_cropped   aa_class_name aa_clickable aa_complete_dump aa_context_clickable  aa_cropped_x_end  aa_cropped_x_start  aa_cropped_y_end  aa_cropped_y_start aa_depth aa_drawn aa_enabled aa_focusable  aa_has_screenshot aa_hashcode_hex aa_hashcode_int  aa_height  aa_height_cropped aa_id_information  aa_is_child aa_long_clickable aa_mID_hex aa_mID_int aa_old_index aa_pflag_activated aa_pflag_dirty_mask aa_pflag_focused aa_pflag_hovered aa_pflag_invalidated aa_pflag_is_root_namespace aa_pflag_prepressed aa_pflag_selected aa_pure_id   aa_screenshot aa_scrollbars_horizontal aa_scrollbars_vertical      aa_shapely  aa_valid_square aa_visibility  aa_width  aa_width_cropped  aa_x_end aa_x_end_relative  aa_x_start aa_x_start_relative  aa_y_end aa_y_end_relative  aa_y_start aa_y_start_relative ee_aa_longtouch ee_aa_longtouch_bs ee_aa_longtouch_offset ee_aa_longtouch_offset_bs ee_aa_touch ee_aa_touch_bs ee_aa_touch_offset ee_aa_touch_offset_bs ff_aa_downswipe ff_aa_save_screenshot ff_aa_show_screenshot ff_aa_tap_center_offset ff_aa_tap_center_offset_long ff_aa_tap_center_variation ff_aa_tap_center_variation_long ff_aa_tap_exact_center ff_aa_tap_exact_center_long ff_aa_upswipe ff_show_parents  parent_000  parent_001  parent_002  parent_003  parent_004  parent_005  parent_006  parent_007  parent_008  parent_009  parent_010  parent_011 aa_scanned_text  aa_tesseract aa_closest_word  aa_resultdiff
  32  30192.0  (26, 26, 23...          128             128               100             100       com.bluesta...         True             ...            False                  230                26                 174                26            8     True       True        False            True            7529967       122853735        148             148               <NA>           True            True         <NA>       <NA>           14           False              False               False            False            False                False                      False               False         <NA>  [[[41, 12, ...           False                    False         POLYGON ((2...            True              V       204             204         230             204            26               0           174             148            26               0                  ()              ()                 ()                     ()                    ()             ()              ()                 ()                    ()              ()                    ()                    ()                      ()                           ()                         ()                              ()                     ()                        ()              ()           9           8           6           5           4           3           2           0        <NA>        <NA>        <NA>        <NA>      Play Store         100.0      Play Store            0.0



  ((x,y),time in seconds)

  self.aa_multi_input_tap_with_delay([((100,100),2), ((200,200),3)])


  self.aa_input_tap(x=100,y=100)





  self.aa_activate_input_text_formated()


  text="""
  "'ąćęłń'\tóśźż\nĄĆĘŁŃÓŚŹŻ\n\"Junto à Estação de \nCarcavelos;\"" "äöüÄÖÜß"
  """
  self.aa_input_text_formated_with_delay(text,delay=(0.01, 0.2),respect_german_letters=False, exit_keys="ctrl+x")



  "'aceln'    oszz
  ACELNOSZZ
  "Junto a Estacao de
  Carcavelos;"" "aouAOUb"


  self.aa_input_text_formated(text,respect_german_letters=True, exit_keys="ctrl+x")

  "'aceln'    oszz
  ACELNOSZZ
  "Junto a Estacao de
  Carcavelos;"" "aeoeueAeOeUess"

  self.aa_install_apk_from_hdd(r"C:\Users\Gamer\anaconda3\envs\instcont\instagram.apk")

  self.aa_uninstall_package('com.instagram.lite')


  self.aa_copy_apk_to_hdd('com.insta.*', 'c:\\instaapkdownload')

  ```



  **17/01/2023: Screenshot fix**


  ```python
  $pip install adbkit
  from adbkit import ADBTools
  adb_path = "C:\\Users\\Gamer\\AppData\\Local\\Android\\Sdk\\platform-tools\\adb.exe"
  deviceserial = "localhost:5875"



  self = ADBTools(adb_path, deviceserial, sdcard="/sdcard/")
  self = ADBTools(adb_path=adb_path, deviceserial=deviceserial)


  self.aa_connect_to_device()
  ```



  ```python

  self.aa_root_bluestacks_instances()



  ```



  ```python

  self.aa_enable_root()

  self.aa_disable_root()
  ```



  ```python


  self.aa_activate_adb_keyboard(exit_keys="ctrl+x")
  ```



  ```python



  self.aa_activate_sendevent_keyboard(
      sdcard="/storage/emulated/0/",
      tmp_folder_on_sd_card="AUTOMAT",
      exit_keys="ctrl+x",
  )  # needs root access


  self.bb_adbkeyboard.press_7_keycode_0()
  ```



  ```python



  self.aa_activate_getevent_sendevent(
      sdcard="/storage/emulated/0/",
      tmp_folder_on_sd_card="AUTOMAT",
      bluestacks_divider=32767,
      exit_keys="ctrl+x",
  )  # needs root access
  ```



  ```python



  self.aa_activate_sendevent_touch(
      sdcard="/storage/emulated/0/",
      tmp_folder_on_sd_card="AUTOMAT",
      bluestacks_divider=32767,
      use_bluestacks_coordinates=True,
  )  # needs root access


  self.bb_sendevent_touch.touch(10,10)
  ```



  ```python




  self.aa_activate_tesseract(
          tesseractpath=r"C:\Program Files\Tesseract-OCR\tesseract.exe"
      )




      left  top  width  height       conf        text  middle_x  middle_y  end_x  end_y
  8    382   42    499      49  37.512093         RH,       631        66    881     91
  9    728   34     98      61  30.925949          2.       777        64    826     95
  13   370  101     37      11   84.72541     'system       388       106    407    112
  14   411  101     24      10  79.929901        Apps       423       106    435    111
  15   536   90     36      28  85.425911      Roblox       554       104    572    118
  16   676  100     55       9  88.744247  BlueStacks       703       104    731    109
  17   735  101      7       8  80.470955           X       738       105    742    109
  18   814  101     31      10  90.271423      Spiele       829       106    845    111
  19   848  101     18       8  93.303749         und       857       105    866    109
  20   869  103     41       9  87.963295     gewinne       889       107    910    112
  28    72  100     20      12  96.004517        Play        82       106     92    112
  29    95  101     27       8  86.986359       Store       108       105    122    109
  33   225  211     49      12  76.804665   Globoplay       249       217    274    223
  37   326  489     25      28  91.894142       Tibia       338       503    351    517
  38   401  500     50       8  91.477989   Guardians       426       504    451    508
  39   455  499     10       9  72.064316          of       460       503    465    508
  41   415  512     37       9  75.078018     Cloudia       433       516    452    521


  xxx = self.aa_ocr_with_tesseract(search_for='Kontakte verwalten')
  ```
  ```python


  self.aa_update_screenshot()

  ```



  ```python

  xx=self.aa_get_screenshots(
          sleeptime=1,
          number=5)

  ```



  ```python



  self.aa_update_imagedf()
  ```


  ```python

  use:
  logcatcap = self.aa_capture_logcat(
          exit_keys="ctrl+x",
          timeout=None,
      )



  ```



  ```python


  df1 = self.aa_get_all_displayed_items_from_uiautomator(
  	screenshotfolder="f:\\compare_android",  # screenshots will be saved here
  	max_variation_percent_x=10,  # used for one of the click functions, to not click exactly in the center - more information below
  	max_variation_percent_y=10,  # used for one of the click functions, to not click exactly in the center
  	loung_touch_delay=(
  		1000,
  		1500,
  	),  # with this settings longtouch will take somewhere between 1 and 1,5 seconds
  	swipe_variation_startx=10,  # swipe coordinate variations in percent
  	swipe_variation_endx=10,
  	swipe_variation_starty=10,
  	swipe_variation_endy=10,
  	sdcard="/storage/emulated/0/",  # sdcard will be used if you use the sendevent methods, don't pass a symlink - more information below
  	tmp_folder_on_sd_card="AUTOMAT",  # this folder will be created in the sdcard folder for using sendevent actions
  	bluestacks_divider=32767,  # coordinates must be recalculated for BlueStacks https://stackoverflow.com/a/73733261/15096247 when using sendevent
  )

  df3 = self.aa_get_all_displayed_items_from_activities(
  	screenshotfolder="f:\\compare_android",  # screenshots will be saved here
  	max_variation_percent_x=10,  # used for one of the click functions, to not click exactly in the center - more information below
  	max_variation_percent_y=10,  # used for one of the click functions, to not click exactly in the center
  	loung_touch_delay=(
  		1000,
  		1500,
  	),  # with this settings longtouch will take somewhere between 1 and 1,5 seconds
  	swipe_variation_startx=10,  # swipe coordinate variations in percent
  	swipe_variation_endx=10,
  	swipe_variation_starty=10,
  	swipe_variation_endy=10,
  	sdcard="/storage/emulated/0/",  # sdcard will be used if you use the sendevent methods, don't pass a symlink - more information below
  	tmp_folder_on_sd_card="AUTOMAT",  # this folder will be created in the sdcard folder for using sendevent actions
  	bluestacks_divider=32767,  # coordinates must be recalculated for BlueStacks https://stackoverflow.com/a/73733261/15096247 when using sendevent
  )
  ```



  ```python




  dffiles = self.aa_list_folder_content(folder_to_search="data/")
  print(dffiles)
                    aa_date  ... ff_pull_file_cat
  0     2022-12-11 06:48:00  ...               ()
  1     2022-12-26 22:16:00  ...               ()
  2     2022-12-06 19:10:00  ...               ()
  3     2022-12-06 13:38:00  ...               ()
  4     2022-12-26 22:16:00  ...               ()
                     ...  ...              ...
  26120 2021-09-16 04:21:00  ...               ()
  26121 2021-09-16 03:53:00  ...               ()
  26122 2021-09-16 03:53:00  ...               ()
  26123 2021-09-16 04:35:00  ...               ()
  26124 2021-09-16 04:31:00  ...               ()
  [26125 rows x 16 columns]
  ```



  ```python


  dfgrep = self.aa_grep_search(
          folder_to_search="data/data",
          filetype="*.db",
          regular_expression=r"CREATE.TABLE",
          exit_keys="ctrl+x",
          timeout=None,
          remove_control_characters=True,
      )

  dfgrep
  Out[19]:
                                                 aa_file  ...      aa_regex
  0    data/data/com.android.providers.media/database...  ...  CREATE.TABLE
  1    data/data/com.android.providers.media/database...  ...  CREATE.TABLE
  2    data/data/com.android.providers.media/database...  ...  CREATE.TABLE
  3    data/data/com.android.providers.media/database...  ...  CREATE.TABLE
  4    data/data/com.globo.globotv/databases/mcsdk_bf...  ...  CREATE.TABLE
  ..                                                 ...  ...           ...
  103  data/data/com.roblox.client/databases/google_a...  ...  CREATE.TABLE
  104  data/data/com.roblox.client/databases/google_a...  ...  CREATE.TABLE
  105  data/data/com.roblox.client/databases/google_a...  ...  CREATE.TABLE
  106  data/data/com.roblox.client/databases/google_a...  ...  CREATE.TABLE
  107  data/data/com.roblox.client/databases/google_a...  ...  CREATE.TABLE
  [108 rows x 5 columns]
  ```



  ```python

  self.aa_parse_settings_from_all_packages(
          tempfolder="f:\\tmpfolder", datafolder="data/"
      )

          index          aa_all_keys  ... level_22 level_23
  0         0.0         (long, name)  ...      NaN      NaN
  1         1.0        (long, value)  ...      NaN      NaN
  2         0.0   (boolean, 0, name)  ...      NaN      NaN
  3         1.0  (boolean, 0, value)  ...      NaN      NaN
  4         2.0   (boolean, 1, name)  ...      NaN      NaN
         ...                  ...  ...      ...      ...
  110795    NaN            (6, desc)  ...      NaN      NaN
  110796    NaN           (6, label)  ...      NaN      NaN
  110797    NaN             (6, pkg)  ...      NaN      NaN
  110798    NaN          (6, source)  ...      NaN      NaN
  110799    NaN             (6, url)  ...      NaN      NaN
  [110800 rows x 31 columns]

  You might see this error messages several times:

  "Go to: https://www.sqlite.org/download.html ,
  download the dll and put it in the DLLs folder of your env!"

  You can ignore it.
  ```



  ```python



  self.aa_get_activity_execution_df_from_one_package(
          packagename="com.roblox.client"
      )
  ```



  ```python

  addcon = self.aa_add_new_contact(
  	"hans", "+55119897827552", "hans@something.com", "my address", save=False
  )
  ```



  ```python

  self.aa_enable_roblox_textures(
  	exit_keys="ctrl+x",
  	print_output=True,
  	timeout=None,
  )

  self.aa_disable_roblox_textures(
  	exit_keys="ctrl+x",
  	print_output=True,
  	timeout=None,
  )
  ```



  ```python

  self.aa_go_to_home_screen()
  ```



  ```python

  self.aa_press_delete_key_repeated_times(repeat=5)
  ```



  ```python

  self.aa_get_content(type_="text/plain")
  ```



  ```python


  print(self.aa_whole_dumpsys_to_df())
  print(self.aa_list_all_packages())
  print(self.aa_list_broadcast_stats())
  print(self.aa_list_pending_intents())
  print(self.aa_list_all_activities_from_device())
  print(self.aa_list_all_services())
  print(self.aa_list_all_receivers())
  print(self.aa_list_all_activities())
  print(self.aa_get_procstats())
  print(self.aa_list_all_devices()) # devices on the device (dev ...)
  print(self.aa_list_devices()) # all adb devices (localhost:5555 ...)
  print(self.aa_list_pids_basic())
  print(self.aa_list_pids_complete())
  print(self.aa_list_memory())
  print(self.aa_getprop())
  print(self.aa_list_all_broadcasts())
  print(self.aa_list_all_broadcasts_history())
  print(self.aa_list_users())
  print(self.aa_list_permission_groups())
  print(self.aa_list_disabled_packages())
  print(self.aa_list_apps_in_use())
  print(self.aa_list_3rd_party_packages())
  print(self.aa_list_features())
  ```



  ```python

  self.aa_open_camera_photo_mode()
  ```



  ```python

  print(self.aa_open_website("google.com"))
  ```



  ```python

  self.aa_start_gallery()
  ```



  ```python

  self.aa_take_a_picture()
  ```



  ```python

  self.aa_adb_turn_screen_compatibility_off()
  self.aa_adb_turn_screen_compatibility_on()
  ```



  ```python

  self.aa_remove_file('/sdcard/9.png')
  ```



  ```python

  self.aa_enable_notifications()
  self.aa_disable_notifications()
  ```



  ```python

  self.aa_expand_settings()
  self.aa_expand_notifications()
  ```



  ```python






  self.aa_change_screen_orientation("horizontal")
  ```



  ```python
  self.aa_get_display_orientation()


  ```



  ```python


  self.aa_rescan_media()
  ```



  ```python

  self.aa_move_to_end_of_line()
  ```



  ```python

  self.aa_hide_keyboard()
  self.aa_is_keyboard_shown()
  ```



  ```python


  self.aa_is_screen_unlocked()
  ```



  ```python

  self.aa_lock_screen()
  ```



  ```python

  self.aa_press_home() #back to home screen
  self.aa_press_app_switch()
  ```



  ```python


  self.aa_swipe_up_to_unlock_screen('3333')
  ```



  ```python



  self.aa_close_all_apps_with_swipe()
  ```



  ```python

  self.aa_uninstall_package('com.google.android.youtube')
  ```



  ```python

  self.aa_resolve_activity('com.roblox.client')
  b'priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=true\r\n'
  b'com.roblox.client/.startup.ActivitySplash\r\n'
  ```



  ```python

  self.aa_open_app('com.roblox.client')
  ```



  ```python


  self.aa_swipe(500, 400, 500, 100, 1.1)
  ```



  ```python

  self.aa_open_shell()
  ```



  ```python


  self.aa_change_cwd_and_execute_adb_shell('ls', 'data/')
  b'5.3.10.1001\r\n'
  b'5.9.300.1014\r\n'
  b'adb\r\n'
  b'anr\r\n'
  b'app\r\n'
  b'app-asec\r\n'
  b'app-ephemeral\r\n'
  b'app-lib\r\n'
  b'app-private\r\n'
  b'arm\r\n'
  ....
  ```



  ```python

  self.aa_execute_multiple_adb_shell_commands(['cd data/', 'ls|grep system'])
  Out[28]: [b'system\r\n', b'system_ce\r\n', b'system_de\r\n']
  ```



  ```python

  self.aa_execute_non_shell_adb_command('devices')
  ```



  ```python

  self.aa_push_to_sdcard(r'F:\donedone.png')
  ```



  ```python

  self.aa_pull('/sdcard/donedone.png', 'f:\\dfdffasd')
  ```



  ```python




  self.aa_connect_do_all_devices(start=4999, end=6000, timeout=10)
      '''self.aa_list_devices()
  b'List of devices attached\r\n'
  b'localhost:5037\toffline\r\n'
  b'localhost:5040\toffline\r\n'
  b'localhost:5357\toffline\r\n'
  b'localhost:5725\tdevice\r\n'
  b'localhost:5800\toffline\r\n'
  b'localhost:5875\tdevice\r\n'
  b'localhost:5900\toffline\r\n'
  b'localhost:5955\tdevice\r\n'
  b'\r\n'''

      '''
  Killing the process
  Killing the process
  Killing the process
  Killing the process
  Killing the process
  Killing the process
  Killing the process
  Killing the process
  Killing the process'''
  ```



  ```python


  self.get_shapes_from_screenshot_THRESH_OTSU()
  self.get_shapes_from_screenshot_ADAPTIVE_THRESH_MEAN_C()
  self.get_shapes_from_screenshot_ADAPTIVE_THRESH_GAUSSIAN_C()
  ```



  ```python


  self.aa_isfolder('/sdcard/donedone.png')
  False
  self.aa_isfolder('/sdcard/')
  True
  next(self.aa_get_screenshots())

  self.aa_path_exists('/sdcard/')
  True
  self.aa_path_exists('/sdcard2/')
  False

  self.aa_get_screen_resolution()
  (960, 540)

  self.aa_restart_server()
  self.aa_reboot_and_listen_to_usb()
  self.aa_start_server()
  self.aa_stop_server()
  self.aa_kill_server()
  self.aa_force_stop('com.roblox.client') #root
  self.aa_show_screenshot_in_browser()
  ```


pkgId: 85c2307fb82332dffe720fd8f4ac83a51663f336e1d526c3a14364bf6930399f
name: python-adblockparser
arch: src
version: 0.7
epoch: 0
release: 1
summary: Parser for Adblock Plus rules
url: https://github.com/scrapinghub/adblockparser
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adblockparser-0.7-1.src.rpm
checksum_type: sha256
description:
  ``adblockparser`` is a package for working with `Adblock Plus`_ filter rules.
  It can parse Adblock Plus filters and match URLs against them.


pkgId: 8c90bc7a63a4673c5c6dea6ed8fb39bda4bd9819c903de39e456167e4a8ef84b
name: python-adbnx-adapter
arch: src
version: 5.0.5
epoch: 0
release: 1
summary: Convert ArangoDB graphs to NetworkX & vice-versa.
url: https://github.com/arangoml/networkx-adapter
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adbnx-adapter-5.0.5-1.src.rpm
checksum_type: sha256
description:
  [![build](https://github.com/arangoml/networkx-adapter/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/arangoml/networkx-adapter/actions/workflows/build.yml)
  [![CodeQL](https://github.com/arangoml/networkx-adapter/actions/workflows/analyze.yml/badge.svg?branch=master)](https://github.com/arangoml/networkx-adapter/actions/workflows/analyze.yml)
  [![Coverage Status](https://coveralls.io/repos/github/arangoml/networkx-adapter/badge.svg?branch=master)](https://coveralls.io/github/arangoml/networkx-adapter)
  [![Last commit](https://img.shields.io/github/last-commit/arangoml/networkx-adapter)](https://github.com/arangoml/networkx-adapter/commits/master)

  [![PyPI version badge](https://img.shields.io/pypi/v/adbnx-adapter?color=3775A9&style=for-the-badge&logo=pypi&logoColor=FFD43B)](https://pypi.org/project/adbnx-adapter/)
  [![Python versions badge](https://img.shields.io/pypi/pyversions/adbnx-adapter?color=3776AB&style=for-the-badge&logo=python&logoColor=FFD43B)](https://pypi.org/project/adbnx-adapter/)

  [![License](https://img.shields.io/github/license/arangoml/networkx-adapter?color=9E2165&style=for-the-badge)](https://github.com/arangoml/networkx-adapter/blob/master/LICENSE)
  [![Code style: black](https://img.shields.io/static/v1?style=for-the-badge&label=code%20style&message=black&color=black)](https://github.com/psf/black)
  [![Downloads](https://img.shields.io/pepy/dt/adbnx-adapter?style=for-the-badge&color=282661
  )](https://pepy.tech/project/adbnx-adapter)

  <a href="https://www.arangodb.com/" rel="arangodb.com">![](https://raw.githubusercontent.com/arangoml/networkx-adapter/master/examples/assets/logos/ArangoDB_logo.png)</a>
  <a href="https://networkx.org/" rel="networkx.org">![](https://raw.githubusercontent.com/arangoml/networkx-adapter/master/examples/assets/logos/networkx_logo.svg)</a>

  The ArangoDB-Networkx Adapter exports Graphs from ArangoDB, the multi-model database for graph & beyond, into NetworkX, the swiss army knife for graph analysis with python, and vice-versa.





  Networkx is a commonly used tool for analysis of network-data. If your analytics use cases require the use of all your graph data, for example, to summarize graph structure, or answer global path traversal queries, then using the ArangoDB Pregel API is recommended. If your analysis pertains to a subgraph, then you may be interested in getting the Networkx representation of the subgraph for one of the following reasons:

      1. An algorithm for your use case is available in Networkx.
      2. A library that you want to use for your use case works with Networkx Graphs as input.





  ```
  pip install adbnx-adapter
  ```

  ```
  pip install git+https://github.com/arangoml/networkx-adapter.git
  ```




  [![Open In Collab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/arangoml/networkx-adapter/blob/master/examples/ArangoDB_NetworkX_Adapter.ipynb)

  Also available as an ArangoDB Lunch & Learn session: [Graph & Beyond Course #2.9](https://www.arangodb.com/resources/lunch-sessions/graph-beyond-lunch-break-2-9-introducing-the-arangodb-networkx-adapter/)

  ```py
  import networkx as nx

  from arango import ArangoClient
  from adbnx_adapter import ADBNX_Adapter, ADBNX_Controller


  db = ArangoClient().db()


  adbnx_adapter = ADBNX_Adapter(db)
  ```


  ```py




  nx_g = adbnx_adapter.arangodb_graph_to_networkx("fraud-detection")





  nx_g = adbnx_adapter.arangodb_collections_to_networkx(
      "fraud-detection",
      {"account", "bank", "branch", "Class", "customer"}, # Vertex collections
      {"accountHolder", "Relationship", "transaction"} # Edge collections
  )





  metagraph = {
      "vertexCollections": {
          "account": {"Balance", "account_type", "customer_id", "rank"},
          "customer": {"Name", "rank"},
      },
      "edgeCollections": {
          "transaction": {"transaction_amt", "sender_bank_id", "receiver_bank_id"},
          "accountHolder": {},
      },
  }

  nx_g = adbnx_adapter.arangodb_to_networkx("fraud-detection", metagraph)





  class Custom_ADBNX_Controller(ADBNX_Controller):
      """ArangoDB-NetworkX controller.

      Responsible for controlling how nodes & edges are handled when
      transitioning from ArangoDB to NetworkX, and vice-versa.
      """

      def _prepare_arangodb_vertex(self, adb_vertex: dict, col: str) -> None:
          """Prepare an ArangoDB vertex before it gets inserted into the NetworkX
          graph.

          :param adb_vertex: The ArangoDB vertex object to (optionally) modify.
          :param col: The ArangoDB collection the vertex belongs to.
          """
          adb_vertex["foo"] = "bar"

      def _prepare_arangodb_edge(self, adb_edge: dict, col: str) -> None:
          """Prepare an ArangoDB edge before it gets inserted into the NetworkX
          graph.

          :param adb_edge: The ArangoDB edge object to (optionally) modify.
          :param col: The ArangoDB collection the edge belongs to.
          """
          adb_edge["bar"] = "foo"

  nx_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).arangodb_graph_to_networkx("fraud-detection")
  ```


  ```py




  nx_g = nx.grid_2d_graph(5, 5)
  edge_definitions = [
      {
          "edge_collection": "to",
          "from_vertex_collections": ["Grid_Node"],
          "to_vertex_collections": ["Grid_Node"],
      }
  ]

  adb_g = adbnx_adapter.networkx_to_arangodb("Grid", nx_g, edge_definitions)





  class Custom_ADBNX_Controller(ADBNX_Controller):
      """ArangoDB-NetworkX controller.

      Responsible for controlling how nodes & edges are handled when
      transitioning from ArangoDB to NetworkX, and vice-versa.
      """

      def _prepare_networkx_node(self, nx_node: dict, col: str) -> None:
          """Prepare a NetworkX node before it gets inserted into the ArangoDB
          collection **col**.

          :param nx_node: The NetworkX node object to (optionally) modify.
          :param col: The ArangoDB collection the node belongs to.
          """
          nx_node["foo"] = "bar"

      def _prepare_networkx_edge(self, nx_edge: dict, col: str) -> None:
          """Prepare a NetworkX edge before it gets inserted into the ArangoDB
          collection **col**.

          :param nx_edge: The NetworkX edge object to (optionally) modify.
          :param col: The ArangoDB collection the edge belongs to.
          """
          nx_edge["bar"] = "foo"

  adb_g = ADBNX_Adapter(db, Custom_ADBNX_Controller()).networkx_to_arangodb("Grid", nx_g, edge_definitions)





  edges = [
     ('student:101', 'lecture:101'),
     ('student:102', 'lecture:102'),
     ('student:103', 'lecture:103'),
     ('student:103', 'student:101'),
     ('student:103', 'student:102'),
     ('teacher:101', 'lecture:101'),
     ('teacher:102', 'lecture:102'),
     ('teacher:103', 'lecture:103'),
     ('teacher:101', 'teacher:102'),
     ('teacher:102', 'teacher:103')
  ]
  nx_g = nx.MultiDiGraph()
  nx_g.add_edges_from(edges)





  ```



  Prerequisite: `arangorestore`

  1. `git clone https://github.com/arangoml/networkx-adapter.git`
  2. `cd networkx-adapter`
  3. (create virtual environment of choice)
  4. `pip install -e .[dev]`
  5. (create an ArangoDB instance with method of choice)
  6. `pytest --url <> --dbName <> --username <> --password <>`

  **Note**: A `pytest` parameter can be omitted if the endpoint is using its default value:
  ```python
  def pytest_addoption(parser):
      parser.addoption("--url", action="store", default="http://localhost:8529")
      parser.addoption("--dbName", action="store", default="_system")
      parser.addoption("--username", action="store", default="root")
      parser.addoption("--password", action="store", default="")
  ```

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:  You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and 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 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 [yyyy] [name of copyright owner]  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: 7758a8c9c7588f773f6e157a5b5aee769fff65882fc21d064b8d41d04d39ef1d
name: python-adbshellexecuter
arch: src
version: 0.12
epoch: 0
release: 1
summary: A class to execute ADB (Android Debug Bridge) commands on multiple operating systems.
url: https://github.com/hansalemaos/adbshellexecuter
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adbshellexecuter-0.12-1.src.rpm
checksum_type: sha256
description:
  ```PY

  A class to execute ADB (Android Debug Bridge) commands on multiple operating systems.

  This class provides methods to run ADB commands with and without capturing stdout and stderr,
  as well as creating non-blocking subprocesses. It handles different operating system environments
  such as Windows, Linux, macOS, and Android, providing a unified interface for ADB command execution.
  Òn Android, the "adb shell" part is completely ignored, instead a subshell (sh) is used to execute commands

  Args:
      adb_path (str): The path to the adb executable.
      device_serial (str): The serial number of the device.
      standard_kwargs_windows (tuple): Standard kwargs for Windows.
      standard_kwargs_linux (tuple): Standard kwargs for Linux.
      standard_kwargs_darwin (tuple): Standard kwargs for macOS.
      standard_kwargs_android (tuple): Standard kwargs for Android.

  import shutil
  from adbshellexecuter import UniversalADBExecutor
  device_serial = "127.0.0.1:5645"
  adb_path = shutil.which("adb")

  adbshell = UniversalADBExecutor(
      adb_path=adb_path,
      device_serial=device_serial,
      standard_kwargs_windows=(
          ("env", os.environ),
          ("shell", False),
          ("startupinfo", startupinfo),
          (
              "creationflags",
              creationflags,
          ),
          ("start_new_session", True),
      ),
      standard_kwargs_linux=(
          ("env", os.environ),
          ("shell", True),
      ),
      standard_kwargs_darwin=(
          ("env", os.environ),
          ("shell", True),
      ),
      standard_kwargs_android=(
          ("env", os.environ),
          ("shell", True),
      ),
  )

  adbshell.non_shell_adb_commands_without_s_serial(
      [
          "connect",
          device_serial,
      ],
  )

  p1 = adbshell.shell_without_capturing_stdout_and_stderr(
      "mkdir -p '/sdcard/testfiles'", cwd="c:\\windows"
  )
  p2 = adbshell.shell_with_capturing_import_stdout_and_stderr("ls /sdcard", check=True)
  p3 = adbshell.non_shell_adb_commands_with_s_serial(
      r'push "C:\writetext.txt" /sdcard/testfiles'
  )

  nonblock = adbshell.create_non_blocking_proc(
      debug=True, ignore_exceptions=False, bufsize=1
  )
  nonblock.extra_data_to_print_stderr = "stderr: "
  nonblock.extra_data_to_print_stdout = "stdout: "
  nonblock.stdinwrite("ls")
  nonblock.stdinwrite("ls /sdcard/testfiles")
  print(nonblock.stdout_results)
  nonblock.stdinwrite("ls /sdcardbbbbbbbb/testfiles")
  print(nonblock.stderr_results)
  nonblock.stdinwrite("su")
  commandok = nonblock.stdinwrite("ls /system")
  print(f"{commandok=}")
  print(nonblock.stderr_results)
  commandok = nonblock.stdinwrite("ls /system")
  nonblock.print_stdout = False
  nonblock.print_stderr = False
  print(nonblock.stderr_results)
  nonblock.kill()
  commandok2 = nonblock.stdinwrite("ls /system")

  p4 = adbshell.shell_without_capturing_stdout_and_stderr(
      command="while true;do ls;sleep 1;done",
      debug=True,
      ignore_exceptions=True,
      timeout=10,
  )
  ```


pkgId: 928071e09d363c1ee837807a2a41ddb8c5cfe41ec03949405338298fd4d407f7
name: python-adbui
arch: src
version: 4.5.22
epoch: 0
release: 1
summary: adbui 所有的功能都是通过 adb 命令，adbui 的特色是可以通过 xpath，ocr 获取 ui 元素。
url: https://github.com/hao1032/adbui
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adbui-4.5.22-1.src.rpm
checksum_type: sha256
description:
  - adbui 交流微信群，加 hao1032，备注 adbui，会拉入微信群
  - 使用 ocr 提示出错，请在该页面最后查看使用 ocr 示例



  adbui 所有的功能都是通过 adb 命令，adbui 的特色是可以通过 xpath，ocr 获取 ui 元素。


      pip install adbui


  - 在命令中可以使用 adb 命令，即adb已经配置到环境变量
  - adb 的版本最好是 >= 1.0.39，用老版本的 adb 可能会有一些奇怪的问题
  - 依赖的库：lxml 解析 xml，requests 发 ocr 请求，pillow 图片处理


  - adbui 当前还在完善，bug 和建议请直接在 github 反馈
  - 主要在 win7，python3 环境使用，其他环境可能有问题



      from adbui import Device

      d = Device('123abc')  # 手机的sn号，如果只有一个手机可以不写



  **util 负责执行完整的命令**

    - **cmd** 用来执行系统命令

          d.util.cmd('adb -s 123abc reboot')
          out = d.util.cmd('ping 127.0.0.1')

    - **adb** 用来执行 adb 命令

          d.util.adb('install xxx.apk')
          d.util.adb('uninstall com.tencent.mtt')

    - **shell** 用来执行 shell 命令

          d.util.shell('pm clear com.tencent.mtt')
          d.util.shell('am force-stop com.tencent.mtt')

  **adb_ext 对常用 adb 命令的封装，下面列出部分操作（可在 adbui/adb_ext.py 文件自行增加需要的操作）**

    - **screenshot**

          d.adb_ext.screenshot() # 截图保存到系统临时目录，也可指定目录

    - **click**

          d.adb_ext.click(10, 32)  # 执行一个点击事件

    - **input**

          d.adb_ext.input('adbui')  # 输入文本

    - **back**

          d.adb_ext.back()  # 发出 back 指令


  **get_ui 可以通过多种方式获取 UI**
    - **by attr** 通过在 uiautomator 里面看到的属性来获取

          ui = d.get_ui_by_attr(text='设置', desc='设置')  # 支持多个属性同时查找

          ui = d.get_ui_by_attr(text='设', is_contains=True)  # 支持模糊查找

          ui = d.get_ui_by_attr(text='设置', is_update=False)  # 如果需要在一个界面上获取多个 UI， 再次查找时可以设置不更新xml文件和截图，节省时间

          ui = d.get_ui_by_attr(class_='android.widget.TextView')  # class 在 python 中是关键字，因此使用 class_ 代替

          ui = d.get_ui_by_attr(desc='fffffff')  # 如果没有找到，返回 None;如果找到多个返回第一个

          ui = d.get_uis_by_attr(desc='fffffff')  # 如果是 get uis 没有找到，返回空的 list

    - **by xpath** 使用 xpath 来获取
          ![xpath](docs/image/xpath01.png)

          mic_btn = d.get_ui_by_xpath('.//FrameLayout/LinearLayout/RelativeLayout/ImageView[2]')  # 获取麦克风按钮
          mic_btn.click()  # 点击麦克风按钮

          
          

          
          
          

          scan_element = ui.element.getprevious()  # 获取麦克风的上一个 element，即扫一扫按钮
          scan_btn = d.get_ui_by_element(scan_element)  # 使用 element 实例化 UI
          scan_btn.click()  # 点击扫一扫按钮

    - **by ocr** 使用腾讯的OCR技术来获取
          ![xpath](docs/image/ocr01.png)

          d.init_ocr('10126986', 'AKIDT1Ws34B98MgtvmqRIC4oQr7CBzhEPvCL', 'AAyb3KQL5d1DE4jIMF2f6PYWJvLaeXEk')
          
          

          btn = d.get_ui_by_ocr(text='爱拍')  # 找到爱拍文字的位置
          btn.click()  # 点击爱拍


  20210425 version 4.5.0
  - screenshot 和 dump xml 优先使用 adbui，预期速度有很大的提升
  - 删除 Pillow 依赖

  20210425 version 4.0.0
  - screenshot 参数有变化，升级请谨慎
  - 尝试尽量使用 minicap 截图
  - 尝试不使用 pillow 功能

  20210418 version 3.5.2
  - 增加 minicap 截图

  20210325 version 2.6
  - dump xml 优先使用 --compressed 模式

  20210325 version 2.4
  - 修复python3.8以上版本找控件报错 RuntimeError: dictionary keys changed during iteration

  20200402 version 1.0
  - 修改screenshot 参数情况
  - 去掉 cmd out save 函数
  - init ocr支持keys传入多个key

  20200328 version 0.40.1
  - 修改 push pull 方法等参数
  - 使用 timeout 库控制超时
  - get ui by orc 去掉 min hit 参数，增加 is contains 参数


pkgId: 65a408a31e1121264d1cd0638da926bb02d1d8c69cffd974cbbeb3a88e4a9d57
name: python-adc-streaming
arch: src
version: 2.4.0
epoch: 0
release: 1
summary: Astronomy Data Commons streaming client libraries
url: https://github.com/astronomy-commons/adc-streaming
rpm_license: BSD
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adc-streaming-2.4.0-1.src.rpm
checksum_type: sha256
description:
  Libraries making it easy to access astronomy data commons resources.





  To prepare for development, run `pip install --editable ".[dev]"` from within
  the repo directory. This will install all dependencies, including those using
  during development workflows.

  This project expects you to use a `pip`-centric workflow for development on the
  project itself. If you're using conda, then use the conda environment's `pip` to
  install development dependencies, as described above.

  Integration tests require Docker to run a Kafka broker. The broker might have
  network problems on OSX if you use Docker Desktop; run the tests in a Linux
  virtual machine (like with VirtualBox) to get around this.



  Write code, making changes.

  Use `make format` to reformat your code to comply with PEP8.

  Use `make lint` to catch common mistakes.

  Use `make test-quick` to run fast unit tests.

  Use `make test` to run the full slow test suite, including integration tests.

  Once satisfied with all four of those, push your changes and open a PR.



  Tag a new version:
  ```
  git tag -s -a v0.x.x
  ```

  Build and release:

  ```
  make pypi-dist
  make pypi-dist-check
  make pypi-upload
  make conda-build
  make conda-upload
  ```


pkgId: feaec6f24876222a7c2d124e72487f1b0010054d0e36b7b54208f599ae19132c
name: python-adcircpy
arch: src
version: 1.2.7
epoch: 0
release: 1
summary: Python package for working with ADCIRC input and output files
url: https://github.com/noaa-ocs-modeling/adcircpy.git
rpm_license: GPL-3.0-or-later
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-adcircpy-1.2.7-1.src.rpm
checksum_type: sha256
description:
  [![tests](https://github.com/noaa-ocs-modeling/adcircpy/workflows/tests/badge.svg)](https://github.com/noaa-ocs-modeling/adcircpy/actions?query=workflow%3Atests)
  [![build](https://github.com/noaa-ocs-modeling/adcircpy/workflows/build/badge.svg)](https://github.com/noaa-ocs-modeling/adcircpy/actions?query=workflow%3Abuild)
  [![codecov](https://codecov.io/gh/noaa-ocs-modeling/adcircpy/branch/main/graph/badge.svg?token=BQWB1QKJ3Q)](https://codecov.io/gh/noaa-ocs-modeling/adcircpy)
  [![version](https://img.shields.io/pypi/v/adcircpy)](https://pypi.org/project/adcircpy)
  [![license](https://img.shields.io/github/license/noaa-ocs-modeling/adcircpy)](https://opensource.org/licenses/gpl-license)
  [![style](https://sourceforge.net/p/oitnb/code/ci/default/tree/_doc/_static/oitnb.svg?format=raw)](https://sourceforge.net/p/oitnb/code)
  [![documentation](https://readthedocs.org/projects/adcircpy/badge/?version=latest)](https://adcircpy.readthedocs.io/en/latest/?badge=latest)

  Documentation can be found at https://adcircpy.readthedocs.io



  ADCIRCpy is currently maintained by the [Coastal Marine Modeling Branch (CMMB)](https://coastaloceanmodels.noaa.gov) of the
  Office of Coast Survey (OCS), a part of the [National Oceanic and Atmospheric Administration (NOAA)](https://www.noaa.gov), an
  agency of the United States federal government. It was majorly developed by [@jreniel](https://github.com/jreniel).

  - Zachary Burnett (**lead**) - zachary.burnett@noaa.gov
  - Jaime Calzada - jrcalzada@vims.edu



  Please use a virtual environment with Python>=3.6. You may use conda or the OS's Python to provide a virtual environment for
  the application.

  You may install the application though pip. This will install the latest tagged version.
  <!--pytest-codeblocks:skip-->

  ```bash
  pip install adcircpy
  ```

  Alternatively, you many manually install the repo by cloning it and then running
  <!--pytest-codeblocks:skip-->

  ```bash
  pip install .
  ```





  This program exposes a few commands available from the command line interface. You may pass the `-h` flag to any of this
  commands to explore their functionality.

  * `tide_gen`
  * `plot_mesh`
  * `tidal_run`
  * `best_track_run`
  * `best_track_file`
  * `plot_maxele`
  * `plot_fort61`
  * `fort63`





  You can quickly create a tidal component table for your your mesh by executing the `tide_gen` command and by passing a mesh, a
  start date and number of run days as arguments. This functions sources data from
  the [HAMTIDE](https://icdc.cen.uni-hamburg.de/en/hamtide.html) database by default.
  <!--pytest-codeblocks:skip-->

  ```bash
  tide_gen \
      /path/to/your/fort.14 \
      2021-02-26T00:00:00 \
      15 \
      --mesh-crs='epsg:4326'
  ```



  To create the ADCIRC input files includes both tides and storm data for Hurricane Sandy:
  <!--pytest-codeblocks:skip-->

  ```bash
  best_track_run \
      /path/to/your/fort.14 \
      Sandy2012 \
      --fort13=/path/to/your/fort.13 \
      --crs=EPSG:4326 \
      --output-directory=/path/where/you/want/the/files \
      --constituents=all \
      --spinup-days=15.0 \
      --elev=30. \
      --mete=30. \
      --velo=30. \
      --skip-run
  ```

  Note that the --crs flag is required due to the fort.14 not containing Coordinate Reference System information which is
  required for correct operation. [EPSG:4326](https://spatialreference.org/ref/epsg/wgs-84/) means that the mesh is in WGS84 (
  lat/lon). Note that the backlash represents "continue on next line" for the shell. You may write the command above on a single
  line after excluding the backslashes.



  These are two examples for doing quick plots with the package. These are given here as illustrative examples only. There is
  support for more file types than this examples, but the program does not yet support every output input/output file type. As a
  user, you are encouraged to explore what's available and suggest and contribute your improvements.
  <!--pytest-codeblocks:skip-->

  ```bash
  plot_fort61 /path/to/fort.61.nc MSL --show --coops-only
  ```

  <!--pytest-codeblocks:skip-->

  ```bash
  plot_mesh /path/to/fort.14 --show-elements
  ```



  See the [examples](./examples) directory for usage examples.



  The following code builds a simple ADCIRC run configuration by doing the following:

  1. reads a `fort.14` mesh file (specifically a test mesh for Shinnecock Inlet)
  2. adds tidal forcing to the mesh
  3. creates an `AdcircRun` driver object with the mesh, including start and end dates
  4. overrides default model options in the resulting `fort.15`
  5. runs ADCIRC if present, otherwise writes configuration to disk

  ```python
  from datetime import datetime, timedelta
  from pathlib import Path
  import shutil

  from adcircpy import AdcircMesh, AdcircRun, Tides
  from adcircpy.utilities import download_mesh, get_logger

  LOGGER = get_logger(__name__)

  DATA_DIRECTORY = Path(__file__).parent.absolute() / 'data'
  INPUT_DIRECTORY = DATA_DIRECTORY / 'input' / 'shinnecock'
  OUTPUT_DIRECTORY = DATA_DIRECTORY / 'output' / 'example_1'

  MESH_DIRECTORY = INPUT_DIRECTORY / 'shinnecock'

  download_mesh(
      url='https://www.dropbox.com/s/1wk91r67cacf132/NetCDF_shinnecock_inlet.tar.bz2?dl=1',
      directory=MESH_DIRECTORY,
      known_hash='99d764541983bfee60d4176af48ed803d427dea61243fa22d3f4003ebcec98f4',
  )


  mesh = AdcircMesh.open(MESH_DIRECTORY / 'fort.14', crs=4326)


  tidal_forcing = Tides()
  tidal_forcing.use_constituent('M2')
  tidal_forcing.use_constituent('N2')
  tidal_forcing.use_constituent('S2')
  tidal_forcing.use_constituent('K1')
  tidal_forcing.use_constituent('O1')
  mesh.add_forcing(tidal_forcing)


  duration = timedelta(days=5)
  start_date = datetime(2015, 12, 14)
  end_date = start_date + duration


  driver = AdcircRun(mesh, start_date, end_date)


  driver.set_elevation_surface_output(sampling_rate=timedelta(minutes=30))
  driver.set_velocity_surface_output(sampling_rate=timedelta(minutes=30))


  driver.timestep = 6.0
  driver.DRAMP = 2.0
  driver.TOUTGE = 3.8
  driver.TOUTGV = 3.8
  driver.smagorinsky = False
  driver.horizontal_mixing_coefficient = 5.0
  driver.gwce_solution_scheme = 'semi-implicit-legacy'

  if shutil.which('padcirc') is not None:
      driver.run(OUTPUT_DIRECTORY, overwrite=True)
  elif shutil.which('adcirc') is not None:
      driver.run(OUTPUT_DIRECTORY, overwrite=True, nproc=1)
  else:
      LOGGER.warning(
          'ADCIRC binaries were not found in PATH. '
          'ADCIRC will not run. Writing files to disk...'
      )
      driver.write(OUTPUT_DIRECTORY, overwrite=True)
  ```



  The following code is similar to `example_1.py`, above, except it adds a static Manning's N coefficient to the mesh.

  ```python
  from datetime import datetime, timedelta
  from pathlib import Path
  import shutil

  import numpy

  from adcircpy import AdcircMesh, AdcircRun, Tides
  from adcircpy.utilities import download_mesh, get_logger

  LOGGER = get_logger(__name__)

  DATA_DIRECTORY = Path(__file__).parent.absolute() / 'data'
  INPUT_DIRECTORY = DATA_DIRECTORY / 'input'
  OUTPUT_DIRECTORY = DATA_DIRECTORY / 'output' / 'example_2'

  MESH_DIRECTORY = INPUT_DIRECTORY / 'shinnecock'

  download_mesh(
      url='https://www.dropbox.com/s/1wk91r67cacf132/NetCDF_shinnecock_inlet.tar.bz2?dl=1',
      directory=MESH_DIRECTORY,
      known_hash='99d764541983bfee60d4176af48ed803d427dea61243fa22d3f4003ebcec98f4',
  )


  mesh = AdcircMesh.open(MESH_DIRECTORY / 'fort.14', crs=4326)


  mesh.generate_tau0()


  mesh.mannings_n_at_sea_floor = numpy.full(mesh.values.shape, 0.025)


  tidal_forcing = Tides()
  tidal_forcing.use_constituent('M2')
  tidal_forcing.use_constituent('N2')
  tidal_forcing.use_constituent('S2')
  tidal_forcing.use_constituent('K1')
  tidal_forcing.use_constituent('O1')
  mesh.add_forcing(tidal_forcing)


  spinup_time = timedelta(days=2)
  duration = timedelta(days=3)
  start_date = datetime(2015, 12, 14) + spinup_time
  end_date = start_date + duration


  driver = AdcircRun(mesh, start_date, end_date, spinup_time)


  driver.set_elevation_surface_output(sampling_rate=timedelta(minutes=30))
  driver.set_velocity_surface_output(sampling_rate=timedelta(minutes=30))


  driver.timestep = 4.0

  if shutil.which('padcirc') is not None:
      driver.run(OUTPUT_DIRECTORY, overwrite=True)
  elif shutil.which('adcirc') is not None:
      driver.run(OUTPUT_DIRECTORY, overwrite=True, nproc=1)
  else:
      LOGGER.warning(
          'ADCIRC binaries were not found in PATH. '
          'ADCIRC will not run. Writing files to disk...'
      )
      driver.write(OUTPUT_DIRECTORY, overwrite=True)
  ```



  The following code is similar to `example_1.py`, above, except it adds HURDAT BestTrack wind forcing and also builds a Slurm
  job script for submission to a job manager.

  ```python
  from datetime import datetime, timedelta
  from pathlib import Path

  from adcircpy import AdcircMesh, AdcircRun, Tides
  from adcircpy.forcing.winds import BestTrackForcing
  from adcircpy.server import SlurmConfig
  from adcircpy.utilities import download_mesh

  DATA_DIRECTORY = Path(__file__).parent.absolute() / 'data'
  INPUT_DIRECTORY = DATA_DIRECTORY / 'input'
  OUTPUT_DIRECTORY = DATA_DIRECTORY / 'output' / 'example_3'

  MESH_DIRECTORY = INPUT_DIRECTORY / 'shinnecock'

  download_mesh(
      url='https://www.dropbox.com/s/1wk91r67cacf132/NetCDF_shinnecock_inlet.tar.bz2?dl=1',
      directory=MESH_DIRECTORY,
      known_hash='99d764541983bfee60d4176af48ed803d427dea61243fa22d3f4003ebcec98f4',
  )


  mesh = AdcircMesh.open(MESH_DIRECTORY / 'fort.14', crs=4326)


  tidal_forcing = Tides()
  tidal_forcing.use_all()
  mesh.add_forcing(tidal_forcing)


  wind_forcing = BestTrackForcing('Sandy2012')
  mesh.add_forcing(wind_forcing)


  slurm = SlurmConfig(
      account='account',
      ntasks=1000,
      run_name='adcircpy/examples/example_3.py',
      partition='partition',
      walltime=timedelta(hours=8),
      mail_type='all',
      mail_user='example@email.gov',
      log_filename='example_3.log',
      modules=['intel/2020', 'impi/2020', 'netcdf/4.7.2-parallel'],
      path_prefix='$HOME/adcirc/build',
  )


  spinup_time = timedelta(days=15)
  duration = timedelta(days=3)
  start_date = datetime(2012, 10, 21, 18)
  end_date = start_date + duration


  driver = AdcircRun(mesh, start_date, end_date, spinup_time, server_config=slurm)


  driver.write(OUTPUT_DIRECTORY, overwrite=True)
  ```



  The following code is similar to `example_3.py`, above, except it uses ATMESH wind forcing and WW3DATA wave forcing.

  ```python
  from datetime import datetime, timedelta
  from pathlib import Path

  from adcircpy import AdcircMesh, AdcircRun, Tides
  from adcircpy.forcing.waves.ww3 import WaveWatch3DataForcing
  from adcircpy.forcing.winds.atmesh import AtmosphericMeshForcing
  from adcircpy.server import SlurmConfig
  from adcircpy.utilities import download_mesh

  DATA_DIRECTORY = Path(__file__).parent.absolute() / 'data'
  INPUT_DIRECTORY = DATA_DIRECTORY / 'input'
  OUTPUT_DIRECTORY = DATA_DIRECTORY / 'output' / 'example_4'

  MESH_DIRECTORY = INPUT_DIRECTORY / 'shinnecock'

  download_mesh(
      url='https://www.dropbox.com/s/1wk91r67cacf132/NetCDF_shinnecock_inlet.tar.bz2?dl=1',
      directory=MESH_DIRECTORY,
      known_hash='99d764541983bfee60d4176af48ed803d427dea61243fa22d3f4003ebcec98f4',
  )


  mesh = AdcircMesh.open(MESH_DIRECTORY / 'fort.14', crs=4326)


  tidal_forcing = Tides()
  tidal_forcing.use_all()
  mesh.add_forcing(tidal_forcing)


  wind_forcing = AtmosphericMeshForcing(
      filename='Wind_HWRF_SANDY_Nov2018_ExtendedSmoothT.nc', nws=17, interval_seconds=3600,
  )
  mesh.add_forcing(wind_forcing)


  wave_forcing = WaveWatch3DataForcing(
      filename='ww3.HWRF.NOV2018.2012_sxy.nc', nrs=5, interval_seconds=3600,
  )
  mesh.add_forcing(wave_forcing)


  slurm = SlurmConfig(
      account='account',
      ntasks=1000,
      run_name='adcircpy/examples/example_4.py',
      partition='partition',
      walltime=timedelta(hours=8),
      mail_type='all',
      mail_user='example@email.gov',
      log_filename='example_4.log',
      modules=['intel/2020', 'impi/2020', 'netcdf/4.7.2-parallel'],
      path_prefix='$HOME/adcirc/build',
  )


  driver = AdcircRun(
      mesh=mesh,
      start_date=datetime.now(),
      end_date=timedelta(days=7),
      spinup_time=timedelta(days=5),
      server_config=slurm,
  )


  driver.write(OUTPUT_DIRECTORY, overwrite=True)
  ```



  ```
  Calzada, J., Burnett, Z., Moghimi, S., Myers, E., & Pe’eri, S. (2021). ADCIRCpy: A Python API to generate ADCIRC model input files (Technical Memorandum No. 41; NOAA NOS OCS). National Oceanic and Atmospheric Administation.
  ```

  ```bibtex
  @techreport{calzadaADCIRCpyPythonAPI2021,
      type = {Technical {{Memorandum}}},
      title = {{{ADCIRCpy}}: A {{Python API}} to Generate {{ADCIRC}} Model Input Files},
      author = {Calzada, Jaime and Burnett, Zachary and Moghimi, Saeed and Myers, Edward and Pe'eri, Shachak},
      year = {2021},
      month = dec,
      number = {41},
      institution = {{National Oceanic and Atmospheric Administation}},
      abstract = {The Advanced Circulation Model (ADCIRC) is a Fortran program used for modeling ocean circulation due to tides, surface waves and atmospheric forcings. However, the input formats and configuration are inflexible and not straight forward for operational implementation, making rapid iteration of model testing, ensemble configuration, and model coupling complicated. Here, we introduce a flexible abstraction of model inputs and outputs written in Python, called ADCIRCpy, that provides a simpler user interface for automatically generating ADCIRC configuration to a variety of inputs and model scenarios. This documentation outlines 1. the needs for such an abstraction, 2. the peculiarities and challenges with the ADCIRC model that necessitate custom logic, and 3. methodologies for generalizing user input in such a way as to make generating model configurations consistent, fast, and efficient.}
  }
  ```



  The majority of ADCIRCpy was written by Jaime Calzada [@jreniel](https://github.com/jreniel).


pkgId: b927361d4697e415dd2217173082f5aff21fa0ec6f8a2c7588eeaeefce3b8179
name: python-add-license-header
arch: src
version: 2.2.0
epoch: 0
release: 1
summary: A tool for automatically adding your license as a header in your source code.
url: https://github.com/arkinmodi/add-license-header
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-add-license-header-2.2.0-1.src.rpm
checksum_type: sha256
description:
  A tool for automatically adding your license as a header in your source code.



  ```bash
  pip install add-license-header
  ```



  See [pre-commit](https://github.com/pre-commit/pre-commit) for instructions.

  Sample with license template file:

  ```yaml
  - repo: https://github.com/arkinmodi/add-license-header
    rev: v2.2.0
    hooks:
        - id: add-license-header
          args:
              - --license-file
              - MIT-LICENSE.template
  ```

  Sample with inline license template:

  ```yaml
  - repo: https://github.com/arkinmodi/add-license-header
    rev: v2.2.0
    hooks:
        - id: add-license-header
          args:
              - --license
              - |
                  MIT License

                  Copyright (c) $create_year $author_name
                  ...
  ```



  You can use template markers to dynamically change your license.

  |  Template Marker  |                                   Default                                    |      CLI Flag      |
  | :---------------: | :--------------------------------------------------------------------------: | :----------------: |
  |  `$author_name`   |                                Empty string.                                 |  `--author-name`   |
  |  `$create_year`   | Introduction into git history. If not managed by git, then the current year. |  `--create-year`   |
  |   `$edit_year`    |                                Current year.                                 |   `--edit-year`    |
  | `$year_delimiter` |                                     ", "                                     | `--year-delimiter` |

  For example:

  ```text
  MIT License

  Copyright (c) $create_year $author_name

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



  ```shell
  $ cat example.py
  print("Hello World")

  $ add-license-header \
      --license-file MIT-LICENSE.template \
      --author-name 'Arkin Modi' \
      --create-year 2023 \
      example.py
  updating license in example.py

  $ cat example.py

























  print("Hello World")
  ```



  In managed mode (the default), the license header will contain
  `LICENSE HEADER MANAGED BY add-license-header` in first line of the comment
  block. This enabled the tool to be able to accurately find the license header
  and allows you to place the license header anywhere in the file.

  In unmanaged mode, enabled with the `--unmanaged` flag, the top-most comment
  block will be assumed to be the license header.


pkgId: 070326d35c4e5ea09abdc85d0beee0f544a0cdac9f51a055d3bdf255863efccb
name: python-add-only-dictionary
arch: src
version: 0.2.0
epoch: 0
release: 1
summary: Add Only Dictionary
url: https://github.com/maccam912/add-only-dictionary
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-add-only-dictionary-0.2.0-1.src.rpm
checksum_type: sha256
description:
  [![PyPI](https://img.shields.io/pypi/v/add-only-dictionary.svg)][pypi_]
  [![Status](https://img.shields.io/pypi/status/add-only-dictionary.svg)][status]
  [![Python Version](https://img.shields.io/pypi/pyversions/add-only-dictionary)][python version]
  [![License](https://img.shields.io/pypi/l/add-only-dictionary)][license]

  [![Read the documentation at https://add-only-dictionary.readthedocs.io/](https://img.shields.io/readthedocs/add-only-dictionary/latest.svg?label=Read%20the%20Docs)][read the docs]
  [![Tests](https://github.com/maccam912/add-only-dictionary/workflows/Tests/badge.svg)][tests]
  [![Codecov](https://codecov.io/gh/maccam912/add-only-dictionary/branch/main/graph/badge.svg)][codecov]

  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)][pre-commit]
  [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)][black]

  [pypi_]: https://pypi.org/project/add-only-dictionary/
  [status]: https://pypi.org/project/add-only-dictionary/
  [python version]: https://pypi.org/project/add-only-dictionary
  [read the docs]: https://add-only-dictionary.readthedocs.io/
  [tests]: https://github.com/maccam912/add-only-dictionary/actions?workflow=Tests
  [codecov]: https://app.codecov.io/gh/maccam912/add-only-dictionary
  [pre-commit]: https://github.com/pre-commit/pre-commit
  [black]: https://github.com/psf/black



  - Create dictionaries that let you continue adding key/value pairs, but never change existing values or remove existing keys. If a value is a dictionary, that will also be updated to have the same behavior. If the value is a list, items can only be added on to the list, but never removed from any position.



  You can install _Add Only Dictionary_ via [pip] from [PyPI]:

  ```console
  $ pip install add-only-dictionary
  ```



  ```python
  from add_only_dictionary import AODict

  regular_dict: Dict = {"a": 1}
  ao_dict: AODict = AODict(regular_dict)

  ao_dict["b"] = 2 # works!
  ao_dict["a"] = 3 # Nothing happens...
  ao_dict["a"] == 1 # True, since the key already existed.
  ```

  <!-- ## Contributing

  Contributions are very welcome.
  To learn more, see the [Contributor Guide].



  Distributed under the terms of the [MIT license][license],
  _Add Only Dictionary_ is free and open source software.



  If you encounter any problems,
  please [file an issue] along with a detailed description. -->



  This project was generated from [@cjolowicz]'s [Hypermodern Python Cookiecutter] template.

  [@cjolowicz]: https://github.com/cjolowicz
  [pypi]: https://pypi.org/
  [hypermodern python cookiecutter]: https://github.com/cjolowicz/cookiecutter-hypermodern-python
  [file an issue]: https://github.com/maccam912/add-only-dictionary/issues
  [pip]: https://pip.pypa.io/

  <!-- github-only -->

  [license]: https://github.com/maccam912/add-only-dictionary/blob/main/LICENSE
  [contributor guide]: https://github.com/maccam912/add-only-dictionary/blob/main/CONTRIBUTING.md
  [command-line reference]: https://add-only-dictionary.readthedocs.io/en/latest/usage.html


pkgId: 4293008bb2079d4c523d1ebad3e08c606fc28ff487c054742941d521e4400c3e
name: python-add-qbt-trackers
arch: src
version: 0.2
epoch: 0
release: 1
summary: Add known working trackers to a qBittorrent instance.
url: https://codeberg.org/hyperreal/add-qbt-trackers
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-add-qbt-trackers-0.2-1.src.rpm
checksum_type: sha256
description:
  This program simply adds known working trackers to a qBittorrent instance. The tracker URLs are taken from the following lists:

  ``` shell
  https://newtrackon.com/api/stable
  https://trackerslist.com/best.txt
  https://trackerslist.com/http.txt
  https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt
  ```

  I've also included my own tracker URLs:

  ``` shell
  http://tracker.hyperreal.coffee/announce
  udp://tracker.hyperreal.coffee:1337
  ```



  ``` shell
  pipx install add-qbt-trackers --include-deps
  ```



  ``` shell
  add-qbt-trackers HOSTNAME USERNAME PASSWORD
  add-qbt-trackers -h
  ```

  Example:

  ``` shell
  add-qbt-trackers "http://localhost:8080" "admin" "password"
  ```

  > Note: Be sure to use quotes around the HOSTNAME, USERNAME, and PASSWORD so that the shell parses them correctly.


pkgId: 63c38dc885ce1082e1df2031da475b1f1d9a77fb8d50e3086fddef6e3ab18626
name: python-add-trailing-comma
arch: src
version: 3.1.0
epoch: 0
release: 1
summary: Automatically add trailing commas to calls and literals
url: https://github.com/asottile/add-trailing-comma
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-add-trailing-comma-3.1.0-1.src.rpm
checksum_type: sha256
description:
  A tool (and pre-commit hook) to automatically add trailing commas to calls and
  literals.

  ```bash
  pip install add-trailing-comma
  ```

  See [pre-commit](https://github.com/pre-commit/pre-commit) for instructions
  Sample `.pre-commit-config.yaml`:
  ```yaml
  -   repo: https://github.com/asottile/add-trailing-comma
      rev: v3.1.0
      hooks:
      -   id: add-trailing-comma
  ```

  ```python

  function_call(
      argument,
      5 ** 5,
      kwarg=foo,
  )
  ```
  - the initial paren is at the end of the line
  - each argument is indented one level further than the function name
  - the last parameter (unless the call contains an unpacking
    (`*args` / `**kwargs`)) has a trailing comma
  This has the following benefits:
  - arbitrary indentation is avoided:
      ```python
      
      
      very_long_call(arg,
                     arg,
                     arg)
      ```
  - adding / removing a parameter preserves `git blame` and is a minimal diff:
      ```diff
       
       x(
      -    arg
      +    arg,
      +    arg2
       )
      ```
      ```diff
       
       x(
           arg,
      +    arg2,
       )
      ```


  ```diff
   x(
       arg,
  -    arg
  +    arg,
   )
  ```

  ```diff
   x = [
  -    1, 2, 3
  +    1, 2, 3,
   ]
  ```

  ```diff
   def func(
           arg1,
  -        arg2
  +        arg2,
   ):
  ```
  ```diff
   async def func(
           arg1,
  -        arg2
  +        arg2,
   ):
  ```

  ```diff
   from os import (
       path,
  -    makedirs
  +    makedirs,
   )
  ```

  ```diff
   class C(
       Base1,
  -    Base2
  +    Base2,
   ):
       pass
  ```

  ```diff
   with (
           open('f1', 'r') as f1,
  -        open('f2', 'w') as f2
  +        open('f2', 'w') as f2,
   ):
       pass
  ```

  ```diff
   match x:
       case A(
          1,
  -       2
  +       2,
       ):
          pass
       case (
          1,
  -       2
  +       2,
       ):
          pass
       case [
          1,
  -       2
  +       2,
       ]:
          pass
       case {
          'x': 1,
  -       'y': 2
  +       'y': 2,
       }:
          pass
  ```

  ```diff
   def f[
  -    T
  +    T,
   ](x: T) -> T:
       return x
  ```
  ```diff
   class A[
  -    K
  +    K,
   ]:
       def __init__(self, x: T) -> None:
           self.x = x
  ```
  ```diff
   type ListOrSet[
  -     T
  +     T,
  ] = list[T] | set[T]
  ```

  ```diff
   x(
       arg1,
  -    arg2)
  +    arg2,
  +)
  ```

  ```diff
  -function_name(arg1,
  -              arg2)
  +function_name(
  +    arg1,
  +    arg2,
  +)
  ```

  ```diff
   x = [
       1,
       2,
       3,
  -    ]
  +]
  ```

  yes yes, I realize the tool is called `add-trailing-comma` :laughing:
  ```diff
  -[1, 2, 3,]
  -[1, 2, 3, ]
  +[1, 2, 3]
  +[1, 2, 3]
  ```


pkgId: 081a36826df70ccf7d784810bd703ffdfda723fa5e718485b5a0e3b0776a593a
name: python-addbioschemas
arch: src
version: 1.0.2
epoch: 0
release: 1
summary: A markdown extension to add bioschemas markup to rendered html
url: https://github.com/GeertvanGeest/addbioschemas/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addbioschemas-1.0.2-1.src.rpm
checksum_type: sha256
description:
  A small markdown extension to add bioschemas to mkdocs. It requires a yaml or json file with bioschemas markup, and adds it to the rendered html.



  ```bash
  pip install addbioschemas
  ```

  To use the plugin simply add `addbioschemas` to the list of plugins in `mkdocs.yml`:

  ```yml
  markdown_extensions:
    - addbioschemas
  ```





  Simply add `[add-bioschemas file='path/to/yaml/metadata.yaml']` to the markdown file where you want to add the bioschemas. This method supports multiple metadata files.

  A markdown snippet of a page where you want to add bioschemas to:

  ```markdown

  [add-bioschemas file='path/to/yaml/metadata.yaml']
  I started with some YAML and turned it into JSON-LD
  ```

  **Important**: If you are using [mkdocs-material](https://squidfunk.github.io/mkdocs-material/), make sure there is markdown before the insertion of `[add-bioschemas]`. Otherwise, other plugins will add incorrect tags to the json-LD chunk.

  The contents of `path/to/yaml/metadata.yaml` use the bioschemas properties:

  ```yaml
  "@context": https://schema.org/
  "@type": LearningResource
  "@id": https://elixir-europe-training.github.io/ELIXIR-TrP-LessonTemplate-MkDocs/
  http://purl.org/dc/terms/conformsTo:
    "@type": CreativeWork
    "@id": https://bioschemas.org/profiles/TrainingMaterial/1.0-RELEASE
  description: Template for ELIXIR lessons
  keywords: FAIR, OPEN, Bioinformatics, Teaching
  name: ELIXIR Training Lesson template

  license: CC-BY-4.0
  author:
  - "@type": Person
    name: Geert van Geest
    email: geert.vangeest@sib.swiss
    github: GeertvanGeest
    orcid: 0000-0002-1561-078X
  - "@type": Person
    name: Elin Kronander
    github: elinkronander
    orcid: 0000-0003-0280-6318
  ```

  `addbioschemas` also supports the json format.



  Specify the path to the yaml file in `mkdocs.yml`. This method only supports one metadata file.

  Add to `mkdocs.yml`:

  ```yaml
  markdown_extensions:
    - addbioschemas:
        metadata: 'path/to/yaml/metadata.yaml'
  ```

  A markdown snippet of a page where you want to add bioschemas to:

  ```markdown

  [add-bioschemas]
  I started with some YAML and turned it into JSON-LD
  ```


  **Important**: If you are using [mkdocs-material](https://squidfunk.github.io/mkdocs-material/), make sure there is markdown before the insertion of `[add-bioschemas]`. Otherwise, other plugins will add incorrect tags to the json-LD chunk.


pkgId: 9f20609603a5bded84df9f75c0c695352f7da25146758531f28debb9ceb5d2d5
name: python-addcopyfighandler
arch: src
version: 3.2.4
epoch: 0
release: 1
summary: Adds a Ctrl+C handler to matplotlib figures for copying the figure to the clipboard
url: https://pypi.org/project/addcopyfighandler/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addcopyfighandler-3.2.4-1.src.rpm
checksum_type: sha256
description:
  Importing this module (after importing matplotlib or pyplot) will add a handler
  to all subsequently-created matplotlib figures
  so that pressing Ctrl+C (or Cmd+C on MacOS) with a matplotlib figure window selected will copy
  the figure to the clipboard as an image.  The copied image is generated through
  matplotlib.pyplot.savefig(), and thus is affected by the relevant rcParams
  settings (savefig.dpi, savefig.format, etc.).
  Uses code & concepts from:
  - https://stackoverflow.com/questions/31607458/how-to-add-clipboard-support-to-matplotlib-figures
  - https://stackoverflow.com/questions/34322132/copy-image-to-clipboard-in-python3

  - addcopyfighandler should work regardless of which graphical backend is being used by matplotlib
      (tkagg, gtk3agg, qtagg, etc.).
  - If `matplotlib.rcParams['savefig.format']` is `'svg'`, the figure will be copied to the clipboard
      as an SVG.
  - If Pillow is installed, all non-SVG format specifiers will be overridden, and the
      figure will be copied to the clipboard as a Device-Independant Bitmap.
  - If Pillow is not installed, the supported format specifiers are `'png'`, `'jpg'`, `'jpeg'`, and `'svg'`.
      All other format specifiers will be overridden, and the figure will be copied to the clipboard as PNG data.

  - Requires either Qt or GTK libraries for clipboard interaction. Automatically detects which is being used from
      `matplotlib.get_backend()`.
      - Qt support requires `PyQt5`, `PyQt6`, `PySide2` or `PySide6`.
      - GTK support requires `pycairo`, `PyGObject` and `PIL` or `pillow` to be installed.
        - Only GTK 3 is supported, as GTK 4 has totally changed the way clipboard data is handled and I can't figure
          it out. I'm totally open to someone else solving this and submitting a PR if they want. I don't use GTK.
  - The figure will be copied to the clipboard as a PNG, regardless of `matplotlib.rcParams['savefig.format']`. Alas, SVG output is not currently supported. Pull requests that enable SVG support would be welcomed.

  - Requires Qt, whether PyQt5/6 or PySide2/6.
  - The figure will be copied to the clipboard as a PNG, regardless of matplotlib.rcParams['savefig.format'].


pkgId: 9d1d9343bb05045e949d8c9713e77f19a4d586db16e0b96e4ca500c062d574f1
name: python-addemongo
arch: src
version: 0.0.17
epoch: 0
release: 1
summary: Private mongo repository for Addebitare company
url: https://pypi.org/project/addemongo/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addemongo-0.0.17-1.src.rpm
checksum_type: sha256
description:
  - [Gabriel Nobrega](gabrieltkdnobrega63@gmail.com)
  - [Victor Gabriel Deon](victordeonroyale@gmail.com)

rpm_license:
  All Rights Reserved.  (c) Copyright 2024 Gabriel Nobrega, Victor Gabriel and Addebitare Team, all rights reserved.


pkgId: e6df1184464fcca2459d54bd3b4abc022841475edd9b1d1f1ff9664d6d0cb49d
name: python-addfips
arch: src
version: 0.4.2
epoch: 0
release: 1
summary: Add county FIPS to tabular data
url: http://github.com/fitnr/addfips
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addfips-0.4.2-1.src.rpm
checksum_type: sha256
description:
  AddFIPS is a tool for adding state or county FIPS codes to files that contain just the names of those geographies.

  FIPS codes are the official ID numbers of places in the US. They're invaluable for matching data from different sources.

  Say you have a CSV file like this:

  ```
  state,county,statistic
  IL,Cook,123
  California,Los Angeles County,321
  New York,Kings,137
  LA,Orleans,99
  Alaska,Kusilvak,12
  ```

  AddFIPS lets you do this:
  ```
  > addfips --county-field=county input.csv
  countyfp,state,county,statistic
  17031,IL,Cook,123
  06037,California,Los Angeles County,321
  36047,New York,Kings,137
  22071,LA,Orleans,99
  02270,Alaska,Kusilvak,12
  ```



  AddFIPS is a Python package compatible with versions 3.7+.

  If you've used Python packages before:
  ```
  pip install addfips

  pip install --user addfips
  ```

  If you haven't used Python packages before, [get pip](http://pip.readthedocs.org/en/stable/installing/), then come back.



  * Use full names or postal abbrevations for states
  * Works with all states, territories, and the District of Columbia
  * Slightly fuzzy matching allows for missing diacretic marks and different name formats ("Nye County" or "Nye', "Saint Louis" or "St. Louis", "Prince George's" or "Prince Georges")
  * Includes up-to-date 2015 geographies (shout out to Kusilvak Census Area, AK, and Oglala Lakota Co., SD)

  Note that some states have counties and county-equivalent independent cities with the same names (e.g. Baltimore city & County, MD, Richmond city & County, VA). AddFIPS's behavior may pick the wrong geography if just the name ("Baltimore") is passed.


  ````
  usage: addfips [-h] [-V] [-d CHAR] (-s FIELD | -n NAME) [-c FIELD]
                 [-v VINTAGE] [--no-header]
                 [input]

  AddFIPS codes to a CSV with state and/or county names

  positional arguments:
    input                 Input file. default: stdin

  optional arguments:
    -h, --help            show this help message and exit
    -V, --version         show program's version number and exit
    -d CHAR, --delimiter CHAR
                          field delimiter. default: ,
    -s FIELD, --state-field FIELD
                          Read state name or FIPS code from this field
    -n NAME, --state-name NAME
                          Use this state for all rows
    -c FIELD, --county-field FIELD
                          Read county name from this field. If blank, only state
                          FIPS code will be added
    -v VINTAGE, --vintage VINTAGE
                          2000, 2010, or 2015. default: 2015
    --no-header           Input has no header now, interpret fields as integers
    -u, --err-unmatched   Print rows that addfips cannot match to stderr
  ````

  Options and flags:
  * `input`: (positional argument) The name of the file. If blank, `addfips` reads from stdin.
  * `--delimiter`: Field delimiter, defaults to ','.
  * `--state-field`: Name of the field containing state name
  * `--state-name`: Name, postal abbreviation or state FIPS code to use for all rows.
  * `--county-field`: Name of the field containing county name. If this is blank, the output will contain the two-character state FIPS code.
  * `--vintage`: Use earlier county names and FIPS codes. For instance, Clifton Forge city, VA, is not included in 2010 or later vintages.
  * `--no-header`: Indicates that the input file has no header. `--state-field` and `--county-field` are parsed as field indices.
  * `--err-unmatched`: Rows that `addfips` cannot match will be printed to stderr, rather than stdout

  The output is a CSV with a new column, "fips", appended to the front. When `addfips` cannot make a match, the fips column will have an empty value.



  Add state FIPS codes:
  ````
  addfips data.csv --state-field fieldName > data_with_fips.csv
  ````

  Add state and county FIPS codes:
  ````
  addfips data.csv --state-field fieldName --county-field countyName > data_with_fips.csv
  ````

  For files with no header row, use a number to refer to the columns with state and/or county names:
  ```
  addfips --no-header-row --state-field 1 --county-field 2 data_no_header.csv > data_no_header_fips.csv
  ```

  Column numbers are one-indexed.

  AddFIPS for counties from a specific state. These are equivalent:
  ```
  addfips ny_data.csv -c county --state-name NY > ny_data_fips.csv
  addfips ny_data.csv -c county --state-name 'New York' > ny_data_fips.csv
  addfips ny_data.csv -c county --state-name 36 > ny_data_fips.csv
  ```

  Use an alternate delimiter:
  ```
  addfips -d'|' -s state pipe_delimited.dsv > result.csv
  addfips -d';' -s state semicolon_delimited.dsv > result.csv
  ```

  Print unmatched rows to another file:
  ```
  addfips --err-unmatched -s state state_data.csv > state_data_fips.csv 2> state_unmatched.csv
  addfips -u -s STATE -c COUNTY county_data.csv > county_data_fips.csv 2> county_unmatched.csv
  ```

  Pipe from other programs:
  ````
  curl http://example.com/data.csv | addfips -s stateFieldName -c countyField > data_with_fips.csv
  csvkit -c state,county,important huge_file.csv | addfips -s state -c county > small_file.csv
  ````

  Pipe to other programs. In files with extensive text, filtering with the FIPS code is safer than using county names, which may be common words (e.g. cook):
  ````
  addfips culinary_data.csv -s stateFieldName -c countyField | grep -e "^17031" > culinary_data_cook_county.csv
  addfips -s StateName -c CountyName data.csv | csvsort -c fips > sorted_by_fips.csv
  ````



  AddFIPS is available for use in your Python scripts:
  ````python
  >>> import addfips
  >>> af = addfips.AddFIPS()
  >>> af.get_state_fips('Puerto Rico')
  '72'
  >>> af.get_county_fips('Nye', state='Nevada')
  '32023'
  >>> row = {'county': 'Cook County', 'state': 'IL'}
  >>> af.add_county_fips(row, county_field="county", state_field="state")
  {'county': 'Cook County', 'state': 'IL', 'fips': '17031'}
  ````

  The results of `AddFIPS.get_state_fips` and `AddFIPS.get_county_fips` are strings, since FIPS codes may have leading zeros.





  The AddFIPS class takes one keyword argument, `vintage`, which may be either `2000`, `2010` or `2015`. Any other value will use the most recent vintage. Other vintages may be added in the future.

  __get_state_fips(self, state)__
  Returns two-digit FIPS code based on  a state name or postal code.

  __get_county_fips(self, county, state)__
  Returns five-digit FIPS code based on county name and state name/abbreviation/FIPS.

  __add_state_fips(self, row, state_field='state')__
  Returns the input row with a two-figit state FIPS code added.
  Input row may be either a `dict` or a `list`. If a `dict`, the 'fips' key is added. If a `list`, the FIPS code is added at the start of the list.

  __add_county_fips(self, row, county_field='county', state_field='state', state=None)__
  Returns the input row with a five-figit county FIPS code added.
  Input row may be either a `dict` or a `list`. If a `dict`, the 'fips' key is added. If a `list`, the FIPS code is added at the start of the list.


  Distributed under the GNU General Public License, version 3. See LICENSE for more information.

rpm_license:
  GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007  Copyright (C) 2007 Free Software Foundation, Inc.  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.  Copyright (C)  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 . 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:  Copyright (C)  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 .  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 .


pkgId: 9773ead1e154db6e51f344a134eb6e35befecfcd57985d6594e6aabf7232d2a9
name: python-addheader
arch: src
version: 0.3.2
epoch: 0
release: 1
summary: A command to manage a header section for a source code tree
url: https://pypi.org/project/addheader/
rpm_license: BSD License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addheader-0.3.2-1.src.rpm
checksum_type: sha256
description:
  This repository contains a single command to manage a header section,
  e.g. copyright, for a source code tree.

  Using UNIX glob patterns, addheader modifies an entire tree of
  source code at once. The program replaces existing headers with
  an updated version, and places the header after any shell magic
  at the top of the file.

  As of version 0.3.0, Jupyter notebooks can also be handled.
  See Usage -> Adding headers to Jupyter Notebooks.



  _addheader_ is written in Python and can be simply installed from the PyPI package:

  ```
  pip install addheader
  ```

  If you want Jupyter Notebook support, add "jupyter" in square brackets after the name of the package
  (use the quotes unless you know your shell doesn't need them):

  ```
  pip install 'addheader[jupyter]'
  ```



  Use the command `addheader`. Invoking`addheader -h` shows a detailed help message
  for the command arguments and options. Below are some examples and comments on usage.



  If you have the header file in "copyright.txt", and your source tree is a Python
  package located at "./mypackage",
  then you would invoke the program like this:
  ```shell
  adddheader mypackage --text copyright.txt
  ```
  By default, the header will not be added to "__init__.py" files.



  If you want to see which files would be changed without modifying them, add
  `-n` or `--dry-run` to the command line arguments.
  If this argument is given, any arguments related to modifying or removing headers will be ignored.

  If you want to remove existing headers instead of adding or updating them,
  add `-r` or `--remove` to the command line arguments.



  You can customize the files that
  are modified with the `-p` or `--pattern` argument, which takes a UNIX glob-style pattern and can be
  repeated as many times as you like. To help exclude files, if the '~' is the first letter of the pattern,
  then the rest of the pattern is used to exclude (not include) files. So, for example, if you provide the
  following source code tree:
  ```
  mypackage
     __init__.py
     foo.py
     bar.py
     tests/
         __init__.py
         test_foo.py
         test_bar.py
  ```
  The following commands would match the following lists of files:

  * `addheader mypackage -t header.txt -p *.py`
  mypackage/{__init__.py, foo.py, bar.py}, mypackage/tests/{__init__.py, test_foo.py, test_bar.py}
  * `addheader mypackage -t header.txt -p *.py -p ~__init__.py`
  mypackage/{foo.py, bar.py}, mypackage/tests/{test_foo.py, test_bar.py}
  * `addheader mypackage -t header.txt -p *.py -p ~__init__.py -p ~test_*.py`
  mypackage/{foo.py, bar.py}



  The header itself is, by default, delimited by a line of 78 '#' characters. While _detecting_ an existing
  header, the program will look for any separator of 10 or more '#' characters.
  For example, if you have a file that looks like this:
  ```python

  my header with 10
  hashes above and below

  hello
  ```

  and a header text file containing simply "Hello, world!", then the modified
  header will be:
  ```python



  hello
  ```

  The comment character and separator character, as well as the width of the
  separator, can be modified with command-line options. For example, to add
  a C/C++ style comment as a header, use these options:

  ```shell
  addheader mypackage --comment "//" --sep "=" --sep-len 40 -t myheader.txt
  ```

  This will insert a header that looks like this:
  ```
  //========================================
  // my text goes here
  //========================================
  ```

  Keep in mind that subsequent operations on files with this header, including
  `--remove`, will need the same `--comment` and `--sep`
  arguments so that the header can be properly identified. For example,
  running `addheader mypackage --remove` after the above command will not
  remove anything, and `addheader mypackage -t myheader.txt` will insert a
  second header (using the default comment character  and separator).

  You can control whether the final line has a newline character appended with the `--final-linesep` command-line option (or the `final_linesep` configuration option). This is True by default for text files, but False for Jupyter notebooks. The logic is that Jupyter notebook headers are in their own cell -- and also, this avoids spurious modifications by the Black code reformatter.

  > To avoid
  passing command-line arguments every time,
  > use the configuration file.
  > See the "Configuration" section for more details.



  Starting in version 0.3.0, you can add headers to Jupyter Notebooks as well.

  > To enable Jupyter notebooks, you must
  > install the 'jupyter' optional dependencies, e.g.,
  > `pip install addheader[jupyter]`.

  To enable this, add a `-j {suffix}` or `--jupyter {suffix}` argument to the command-line, or
  similarly add a `jupyter: {suffix}` argument in the configuration file.
  The `{suffix}` indicates an alternate file suffix to use for identifying
  whether a file is a Jupyter Notebook, where the default is ".ipynb".
  In the configuration file, use `jupyter: true` to use the default.
  On the command-line, omit the value to use the default.

  To set the Jupyter notebook format version, add `--notebook-version {value}` to the command-line or,  equivalently, `notebook_version: {value}` to the configuration file.
  Values can be from 1 to 4. The default value is 4.

  The file pattern arguments (see *Specifying file patterns*, above) are still honored,
  but if Jupyter notebooks are enabled, the pattern `*{suffix}` will be automatically added
   to the patterns to match. Thus, by default `*.ipynb` will be added to the files to match.

  If there is no existing header, the Jupyter notebook header will be inserted as the first 'cell', i.e. the first
  item, in the notebook. An existing header will be found anywhere in the notebook (by its `header` tag, see below).

  Currently the header cell is of type "code", with every line of the cell
  commented (using a 'markdown' cell is another possibility, but the code cell is friendler to the Jupyterbook machinery, and also retains the header in exported versions of the notebook without markdown cells).
  The content of the header is the same as for text files.
  Two, optionally three, tags will be added to the cell metadata:
  * `header` - Indicates this is the header cell, so it can be modified or removed later.
  * `hide-cell` - If you build documentation with Jupyterbook, this will hide the cell in the generated documentation behind a toggle button (see https://jupyterbook.org/interactive/hiding.html).

  Just as for text files, Jupyter notebook headers can be updated or removed.


  For reference, below is the form of the generated Jupyter notebook cell JSON (with the 'id' field):

  ```json
     {
        "id": "1234567890abcdef1234567890abcdef",
        "cell_type": "code",
        "metadata": {
          "tags": [
            "header",
            "hide-cell"
          ]
        },
        "source": [
          "# Copyright info\n",
          "# is placed here.\n"
        ],
        "outputs": []
      }
  ```


  To avoid passing commandline arguments every time, you can create a configuration
  file that simply lists them as key/value pairs (using the long-option name as
  the key). By default, the program will look for a file `addheader.cfg` in the
  current directory, but this can also be specified on the command-line with
  `-c/--config`. For example:

  ```shell
  addheader  # looks for addheader.cfg, ok if not present
  addheader -c myoptions.conf  # uses myoptions.conf, fails if not present
  ```

  The configuration file is in YAML format. For example:

  ```yaml
  text: myheader.txt
  pattern:
     - "*.py"
     - "~__init__.py"

  sep: "-"
  comment: "//"
  sep-len: 40

  verbose: 2
  ```

  Command-line arguments will override configuration arguments, even if the
  configuration file is explicitly provided with `-c/--config`.
  The "action" arguments, `-r/--remove` and `-n/--dry-run`, will be
  ignored in the configuration file.



  To test your package for files missing headers, use the following formula:
  ```python
  import os
  import mypackage
  from addheader.add import FileFinder, detect_files

  def test_headers():
      root = os.path.dirname(mypackage.__file__)
      
      ff = FileFinder(root, glob_pat=["*.py", "~__init__.py"])
      has_header, missing_header = detect_files(ff)
      assert len(missing_header) == 0
  ```


  The _addheader_ program was developed for use in the [IDAES](www.idaes.org) project and is maintained in the
  IDAES organization in Github at https://github.com/IDAES/addheader . The primary author
  and maintainer is Dan Gunter (dkgunter at lbl dot gov).


  Please see the COPYRIGHT.md and LICENSE.md files in the repository for
  limitations on use and distribution of this software.


pkgId: f426b7347fc604794824d190f5dafe0aa6cae80d83beac7ba3f9752f6e5a6b2c
name: python-addict
arch: src
version: 2.4.0
epoch: 0
release: 1
summary: Addict is a dictionary whose items can be set using both attribute and item syntax.
url: https://github.com/mewwts/addict
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addict-2.4.0-1.src.rpm
checksum_type: sha256
description:
  Addict is a module that exposes a dictionary subclass that allows items to be set like attributes. Values are gettable and settable using both attribute and item syntax. For more info check out the README at 'github.com/mewwts/addict'.


pkgId: 6181fcdf600209f0cdf6974dde687365e425be999e96962696dd9c09eeafaea6
name: python-addict-tracking-changes
arch: src
version: 1.0.6
epoch: 0
release: 1
summary: Addict dictionary enhanced with ability to track changes -- currently only supports field additions
url: https://pypi.org/project/addict-tracking-changes/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-addict-tracking-changes-1.0.6-1.src.rpm
checksum_type: sha256
description:
  [![Python versions](https://img.shields.io/badge/Python-3.11-green)](https://pypi.python.org/pypi/addict-tracking-changes)
  [![Tests Status](https://github.com/ofjustpy/addict-tracking-changes/blob/main/badge_tests.svg)](https://github.com/ofjustpy/addict-tracking-changes/actions)
  [![Coverage Status](https://github.com/ofjustpy/addict-tracking-changes/blob/main/badge_coverage.svg)](https://github.com/ofjustpy/addict-tracking-changes/actions)
  [![Flake8 Status](https://github.com/ofjustpy/addict-tracking-changes/blob/main/badge_flake8.svg)](https://github.com/ofjustpy/addict-tracking-changes/actions)

  [![Documentation](https://img.shields.io/badge/doc-latest-blue.svg)](https://ofjustpy.github.io/addict-tracking-changes/)
  [![PyPI](https://img.shields.io/pypi/v/addict-tracking-changes.svg)](https://pypi.python.org/pypi/addict-tracking-changes)
  [![Downloads](https://pepy.tech/badge/addict-tracking-changes)](https://pepy.tech/project/addict-tracking-changes)
  [![Downloads per week](https://pepy.tech/badge/addict-tracking-changes/week)](https://pepy.tech/project/addict-tracking-changes)
  [![GitHub stars](https://img.shields.io/github/stars/ofjustpy/addict-tracking-changes.svg)](https://github.com/ofjustpy/addict-tracking-changes/stargazers)




  **HEADS UP**
  Before using the library carefully read the Known bugs and Caveats section below.


  Originally, this repository was a fork of [addict](https://github.com/mewwts/addict) by Mats Julian Olsen.
  Overtime, it has substatially diverged in functionality and codebase that it made
  sense to breakout as its own repository.

  The original addict:  provides an alternative and succient interface to manipulate a dictionary. This is especially
  useful when dealing with heavily nested dictionaries. As example (taken from https://github.com/mewwts/addict)
  a dictionary created using standard python dictionary interface looks as follows:
  ```python
  body = {
      'query': {
          'filtered': {
              'query': {
                  'match': {'description': 'addictive'}
              },
              'filter': {
                  'term': {'created_by': 'Mats'}
              }
          }
      }
  }`

  ```
  can be summarized to following three lines:

  ```python
  body = Dict()
  body.query.filtered.query.match.description = 'addictive'
  body.query.filtered.filter.term.created_by = 'Mats'
  ```

  This repo builds on original addict and adds contraptions to track key additions in the dictionary.
  This features comes in quite handy in building reactive webapps where one has to respond
  to all the changes made on the browser. Addict-tracking-changes is the underpinning
  data-structure in [ofjustpy](https://github.com/Monallabs-org/ofjustpy): a python based webframework build from [justpy](https://github.com/justpy-org/justpy)

  The functions relevant to tracking changed history are:
  `get_changed_history` and `clear_changed_history`.
  The `get_changed_history` returns an iterator of XPath style paths like `/a/b/c/e` (see [Demo example](#demo-example)).




  This project is not on PyPI. Its a simple package with no third party dependency.
  Simply clone from github and include the source directory in your PYTHONPATH.



  ```python
  from addict import Dict
  body = Dict()
  body.query.filtered.query.match.description = 'addictive'
  body.query.filtered.filter.term.created_by = 'Mats'

  for changed_path in body.get_changed_history():
      

  body.clear_changed_history()
  ```


  addict works as expected when the values of keys are simple data types (such as string, int, float, etc.). However, for container types such as dict, list, tuples, etc. the behaviour is somewhat differs.

  * dicts are treated as opaque object just like simple data types

  ```python
  from addict import Dict

  mydict = Dict()
  mydict.a.b.c = {'kk': 1}
  mydict.a.b.e = {'dd': 1}

  for _ in mydict.get_changed_history():
      print(_)
  ```
  will print
  ```
  /a/b/c
  /a/b/e
  ```
  and not
  ```
  /a/b/cc/kk
  /a/b/e/dd
  ```

  * lists
  are seen as container, i.e., `get_changed_history` will report path for each element of
  the list

  ```python
  from addict import Dict

  mydict = Dict()

  mydict.a.b = [1, [1]]
  mydict.a.c = [2, [2, [3]]]
  ```
  get_changed_history will report following paths:
  ```
  /a/b/0,
  /a/b/1/0,
  /a/c/0,
  /a/c/1/0,
  /a/c/1/1/"
  ```

  * tuple, namedtuple, sets
  tuple  behave same as dict and are treated as opaque data structure



  1. Only tracks  field additions.  Deletions and updates are not tracked.
  2. freeze doesn't guards against deletions
  3. building dict from another dict as shown in following expression wont' work
  ```python
  cjs_cfg = Dict(other_dict, track_changes=True)
  ```
  instead use
  ```python
  cjs_cfg = Dict(track_changes = True)
  with open("other_dict.pickle", "rb") as fh:
      x = pickle.load(fh)
  for _ in oj.dictWalker(x):
      oj.dnew(cjs_cfg, _[0], _[1])

  ```
  4. Use TrackedList for tracking nested list

  ```python
  from addict_tracking_changes import Dict, TrackedList


  trackerprop = Dict(track_changes = True)
  trackerprop.a.b = [1, TrackedList([1], track_changes=True)]
  trackerprop.a.c = [2, TrackedList([2, TrackedList([3], track_changes=True)
                                     ], track_changes=True)
                     ]
  ```
  which when asked changed history will output as follows:
  ```python
  print(list(trackerprop.get_changed_history()))
  ```
  output
  ```bash
  ['/a/b/0', '/a/b/1/0', '/a/c/0', '/a/c/1/0', '/a/c/1/1/0']
  ```



  | API                                                  | Description                                        |
  |------------------------------------------------------|----------------------------------------------------|
  | `Dict(*args, **kwargs)`                              | Initializes a new Dict object                      |
  | `to_dict(self)`                                      | Converts the Dict object to a regular dictionary   |
  | `freeze(self, shouldFreeze=True)`                    | Freezes the Dict object, making it immutable       |
  | `unfreeze(self)`                                     | Unfreezes the Dict object, making it mutable again |
  | `get_changed_history(self, prefix="", path_guards=None)` | Returns an iterator with the changed history of keys |
  | `clear_changed_history(self)`                        | Clears the changed history of the Dict object      |
  | `set_tracker(self, track_changes=False)`             | Sets or resets the change tracker for the Dict object |




  - Docs (in readthedocs format): https://monallabs-org.github.io/addict-tracking-changes/#introduction, https://webworks.monallabs.in/addict-tracking-changes

  - Developed By: webworks.monallabs.in


