%global _empty_manifest_terminate_build 0 Name: python-pyQiwiP2P Version: 2.0.6 Release: 1 Summary: pyQiwiP2P License: Mozilla Public License 2.0 URL: https://github.com/WhiteApfel/pyQiwiP2P Source0: https://mirrors.aliyun.com/pypi/web/packages/86/51/452ff6eeab5efa55d9c4fb0d3c036aa4c920afa7256aa51e601a76e1ca73/pyQiwiP2P-2.0.6.tar.gz BuildArch: noarch Requires: python3-setuptools Requires: python3-phonenumbers Requires: python3-email-validator Requires: python3-typing Requires: python3-Hypercorn Requires: python3-starlette Requires: python3-httpx Requires: python3-pydantic Requires: python3-validators Requires: python3-ipaddress Requires: python3-loguru Requires: python3-dotenv Requires: python3-pytest Requires: python3-CherryPy Requires: python3-response-report %description ## А как пользоваться ### Что есть? Есть сам класс QiwiP2P, который обладает тремя инструментами: для выставления, проверки и закрытия платежа (счёта). Пример использования: ```python from pyqiwip2p import QiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY) # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print(p2p.check(bill_id=new_bill.bill_id).status) # Потеряли ссылку на оплату счета? Не проблема! print(p2p.check(bill_id=245532).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть p2p.reject(bill_id=new_bill.bill_id) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) # Теперь, если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма new_bill = p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } p2p.bill(fields=fields) # Либо же воспользоваться удобными полями p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") ``` ### А асинхронно могёте? Могём. Причём примерно так же. ```python from pyqiwip2p import AioQiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) async def main(): async with p2p: # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print((await p2p.check(bill_id=new_bill.bill_id)).status) # Потеряли ссылку на оплату счета? Не проблема! print((await p2p.check(bill_id=245532)).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть await p2p.reject(bill_id=new_bill.bill_id) # Если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма, которую вы установили new_bill = await p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = await p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } await p2p.bill(fields=fields) # Либо же воспользоваться удобными полями await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") p2p.run(main()) # Аналог # asyncio.run(main()) ``` ### И всё? Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер, для этого придется немного пострадать, но лишь немного. **Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом. Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно") А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её. Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя. ```python from pyqiwip2p.notify import QiwiNotify from pyqiwip2p.p2p_types import Bill QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = QiwiNotify(QIWI_PRIV_KEY) # # Хэндлер принимает в себя аргументом функцию, # в которую передаст объект счёта - Bill # # Добавим хэндлер, который будет печатать billID для всех счетов @qiwi_notify.handler(lambda bill: True) def print_bill(bill: Bill): print(bill.bill_id) # Создадим хэндлер, который будет печатать сумму оплаченных счетов @qiwi_notify.handler(lambda bill: bill.status == "PAID") def print_bill(bill: Bill): print(bill.amount) # Теперь запустим сервер на 12345'ом порту qiwi_notify.start(port=12345) ``` ### И асинхронный сервер, наверное, у вас есть? Да есть. Причём хендлить функции можно и асинхронные, и синхронные. ```python from pyqiwip2p import QiwiP2P, AioQiwiP2P from pyqiwip2p.p2p_types import Bill from pyqiwip2p.notify import AioQiwiNotify import asyncio QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY) p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) @qiwi_notify.handler(lambda bill: bill.status == "EXPIRED") async def on_expired(bill: Bill): new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment) print(new_bill.pay_url) @qiwi_notify.handler(lambda bill: True) def on_all(bill: Bill): print(bill.status) async def main(): p = asyncio.get_event_loop() server = p.create_task(qiwi_notify.a_start(port=12345)) await server loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ### Настройка проксирующего Nginx Для порта 12345 (как в примерах выше) будет: ``` server { listen 443; server_name qiwinotify.domain.com; ssl_certificate cert.crt; ssl_certificate_key pkey.key; location /superSecretQiwiURI { proxy_pass http://0.0.0.0:12345/qiwi_notify; } } ``` В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений **P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже. Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)** %package -n python3-pyQiwiP2P Summary: pyQiwiP2P Provides: python-pyQiwiP2P BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-pyQiwiP2P ## А как пользоваться ### Что есть? Есть сам класс QiwiP2P, который обладает тремя инструментами: для выставления, проверки и закрытия платежа (счёта). Пример использования: ```python from pyqiwip2p import QiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY) # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print(p2p.check(bill_id=new_bill.bill_id).status) # Потеряли ссылку на оплату счета? Не проблема! print(p2p.check(bill_id=245532).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть p2p.reject(bill_id=new_bill.bill_id) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) # Теперь, если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма new_bill = p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } p2p.bill(fields=fields) # Либо же воспользоваться удобными полями p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") ``` ### А асинхронно могёте? Могём. Причём примерно так же. ```python from pyqiwip2p import AioQiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) async def main(): async with p2p: # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print((await p2p.check(bill_id=new_bill.bill_id)).status) # Потеряли ссылку на оплату счета? Не проблема! print((await p2p.check(bill_id=245532)).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть await p2p.reject(bill_id=new_bill.bill_id) # Если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма, которую вы установили new_bill = await p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = await p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } await p2p.bill(fields=fields) # Либо же воспользоваться удобными полями await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") p2p.run(main()) # Аналог # asyncio.run(main()) ``` ### И всё? Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер, для этого придется немного пострадать, но лишь немного. **Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом. Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно") А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её. Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя. ```python from pyqiwip2p.notify import QiwiNotify from pyqiwip2p.p2p_types import Bill QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = QiwiNotify(QIWI_PRIV_KEY) # # Хэндлер принимает в себя аргументом функцию, # в которую передаст объект счёта - Bill # # Добавим хэндлер, который будет печатать billID для всех счетов @qiwi_notify.handler(lambda bill: True) def print_bill(bill: Bill): print(bill.bill_id) # Создадим хэндлер, который будет печатать сумму оплаченных счетов @qiwi_notify.handler(lambda bill: bill.status == "PAID") def print_bill(bill: Bill): print(bill.amount) # Теперь запустим сервер на 12345'ом порту qiwi_notify.start(port=12345) ``` ### И асинхронный сервер, наверное, у вас есть? Да есть. Причём хендлить функции можно и асинхронные, и синхронные. ```python from pyqiwip2p import QiwiP2P, AioQiwiP2P from pyqiwip2p.p2p_types import Bill from pyqiwip2p.notify import AioQiwiNotify import asyncio QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY) p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) @qiwi_notify.handler(lambda bill: bill.status == "EXPIRED") async def on_expired(bill: Bill): new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment) print(new_bill.pay_url) @qiwi_notify.handler(lambda bill: True) def on_all(bill: Bill): print(bill.status) async def main(): p = asyncio.get_event_loop() server = p.create_task(qiwi_notify.a_start(port=12345)) await server loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ### Настройка проксирующего Nginx Для порта 12345 (как в примерах выше) будет: ``` server { listen 443; server_name qiwinotify.domain.com; ssl_certificate cert.crt; ssl_certificate_key pkey.key; location /superSecretQiwiURI { proxy_pass http://0.0.0.0:12345/qiwi_notify; } } ``` В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений **P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже. Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)** %package help Summary: Development documents and examples for pyQiwiP2P Provides: python3-pyQiwiP2P-doc %description help ## А как пользоваться ### Что есть? Есть сам класс QiwiP2P, который обладает тремя инструментами: для выставления, проверки и закрытия платежа (счёта). Пример использования: ```python from pyqiwip2p import QiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY) # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print(p2p.check(bill_id=new_bill.bill_id).status) # Потеряли ссылку на оплату счета? Не проблема! print(p2p.check(bill_id=245532).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть p2p.reject(bill_id=new_bill.bill_id) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) # Теперь, если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма new_bill = p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } p2p.bill(fields=fields) # Либо же воспользоваться удобными полями p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") ``` ### А асинхронно могёте? Могём. Причём примерно так же. ```python from pyqiwip2p import AioQiwiP2P from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods QIWI_PRIV_KEY = "abCdef...xYz" p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) # Если планируете выставлять счета с одинаковой суммой, # можно воспользоваться параметром default_amount p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148) async def main(): async with p2p: # Выставим счет на сумму 228 рублей который будет работать 45 минут new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45) print(new_bill.bill_id, new_bill.pay_url) # Проверим статус выставленного счета print((await p2p.check(bill_id=new_bill.bill_id)).status) # Потеряли ссылку на оплату счета? Не проблема! print((await p2p.check(bill_id=245532)).pay_url) # Клиент отменил заказ? Тогда и счет надо закрыть await p2p.reject(bill_id=new_bill.bill_id) # Если не указывать в методе p2p.bill() значение суммы заказа, # будет применяться указанная базовая сумма, которую вы установили new_bill = await p2p.bill(bill_id=6627358) # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически. # Его можно будет посмотреть в объекте ответа Bill # В комбинации со стандартным значением суммы будет вот так new_bill = await p2p.bill() print(new_bill.bill_id, new_bill.pay_url) # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты, # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode fields = { "paySourcesFilter": "qw,card", "themeCode": "MalchikGay", } await p2p.bill(fields=fields) # Либо же воспользоваться удобными полями await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card]) await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay") p2p.run(main()) # Аналог # asyncio.run(main()) ``` ### И всё? Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер, для этого придется немного пострадать, но лишь немного. **Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом. Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно") А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её. Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя. ```python from pyqiwip2p.notify import QiwiNotify from pyqiwip2p.p2p_types import Bill QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = QiwiNotify(QIWI_PRIV_KEY) # # Хэндлер принимает в себя аргументом функцию, # в которую передаст объект счёта - Bill # # Добавим хэндлер, который будет печатать billID для всех счетов @qiwi_notify.handler(lambda bill: True) def print_bill(bill: Bill): print(bill.bill_id) # Создадим хэндлер, который будет печатать сумму оплаченных счетов @qiwi_notify.handler(lambda bill: bill.status == "PAID") def print_bill(bill: Bill): print(bill.amount) # Теперь запустим сервер на 12345'ом порту qiwi_notify.start(port=12345) ``` ### И асинхронный сервер, наверное, у вас есть? Да есть. Причём хендлить функции можно и асинхронные, и синхронные. ```python from pyqiwip2p import QiwiP2P, AioQiwiP2P from pyqiwip2p.p2p_types import Bill from pyqiwip2p.notify import AioQiwiNotify import asyncio QIWI_PRIV_KEY = "abCdef...xYz" qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY) p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY) @qiwi_notify.handler(lambda bill: bill.status == "EXPIRED") async def on_expired(bill: Bill): new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment) print(new_bill.pay_url) @qiwi_notify.handler(lambda bill: True) def on_all(bill: Bill): print(bill.status) async def main(): p = asyncio.get_event_loop() server = p.create_task(qiwi_notify.a_start(port=12345)) await server loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` ### Настройка проксирующего Nginx Для порта 12345 (как в примерах выше) будет: ``` server { listen 443; server_name qiwinotify.domain.com; ssl_certificate cert.crt; ssl_certificate_key pkey.key; location /superSecretQiwiURI { proxy_pass http://0.0.0.0:12345/qiwi_notify; } } ``` В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений **P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже. Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)** %prep %autosetup -n pyQiwiP2P-2.0.6 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-pyQiwiP2P -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Thu Jun 08 2023 Python_Bot - 2.0.6-1 - Package Spec generated