Skip to content

Исправление ошибки в логах при импорте #261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

GeorgeNikitinNV
Copy link

@GeorgeNikitinNV GeorgeNikitinNV commented Jun 18, 2025

При импорте библиотеки в логах возникают множественные ошибки.

Кроме того, версия не всегда корректно импортируется при установке с помощью uv, поскольку получается кольцевая зависимость - мы не можем получить версию в setup.py, пока не установим все пакеты, а установить не можем, поскольку версии нет. Предложен хак для исправления.

Обзор от Sourcery

Исправлены ошибки импорта и логирования путем изменения получения версии в setup и исправления форматирования отладки.

Исправления ошибок:

  • Использовать f-строку в logger.debug, чтобы предотвратить ошибки форматирования JSON в логах
logger.debug(f"JSON data: {json.dumps(data)}")

Сборка:

  • Читать и выполнять __version__.py в setup.py, чтобы избежать циклической зависимости при установке
with open(os.path.join(here, '__version__.py'), encoding='utf-8') as f:
    exec(f.read(), about)

Мелкие задачи:

  • Поднять версию пакета до 1.8.6
Original summary in English

Обзор от Sourcery

Исправлены ошибки импорта и ведения журнала во время установки и выполнения, путем загрузки файла версии в setup, чтобы избежать циклических зависимостей, увеличена версия пакета и переключены вызовы logger.debug на f-strings, чтобы предотвратить проблемы с форматированием JSON.

Исправления ошибок:

  • Обновлены вызовы logger.debug для использования f-strings для данных JSON, чтобы избежать ошибок форматирования

Сборка:

  • Чтение и выполнение __version__.py в setup.py для разрыва циклической зависимости при установке

Прочие работы:

  • Увеличение версии пакета до 1.8.6
Original summary in English

Summary by Sourcery

Fix import and logging errors during install and runtime by loading the version file in setup to avoid circular dependencies, bump the package version, and switch logger.debug calls to f-strings to prevent JSON formatting issues

Bug Fixes:

  • Update logger.debug calls to use f-strings for JSON data to avoid formatting errors

Build:

  • Read and exec version.py in setup.py to break the circular dependency when installing

Chores:

  • Bump package version to 1.8.6

Copy link

sourcery-ai bot commented Jun 18, 2025

Руководство для проверяющего

Этот PR исправляет ошибки импорта и логирования, динамически загружая номер версии в setup.py, чтобы избежать циклических зависимостей, повышает версию пакета до 1.8.6 и обновляет отладочные сообщения журнала для использования f-строк для правильного форматирования JSON.

Блок-схема получения версии в setup.py

flowchart TD
    A[setup.py] --> B[Open fast_bitrix24/__version__.py]
    B --> C[exec file contents to get __version__]
    C --> D[Use __version__ in setup configuration]
Loading

Изменения на уровне файлов

Изменение Подробности Файлы
Загрузка версии через exec в setup.py для избежания цикла импорта
  • Удаление прямого импорта version
  • Чтение и выполнение содержимого version.py во время выполнения
setup.py
Повышение версии пакета
  • Обновление version с 1.8.5 до 1.8.6
fast_bitrix24/__version__.py
Использование f-строк в отладочном логировании для вывода JSON
  • Замена logger.debug("Response: %s", json) на форматирование f-строкой
fast_bitrix24/srh.py

Советы и команды

Взаимодействие с Sourcery

  • Запустить новую проверку: Оставьте комментарий @sourcery-ai review в pull request.
  • Продолжить обсуждение: Отвечайте непосредственно на комментарии Sourcery.
  • Создать issue на GitHub из комментария: Попросите Sourcery создать
    issue из комментария, ответив на него. Вы также можете ответить на
    комментарий @sourcery-ai issue, чтобы создать issue из него.
  • Сгенерировать заголовок pull request: Напишите @sourcery-ai в любом месте
    заголовка pull request, чтобы сгенерировать заголовок в любое время. Вы также можете оставить комментарий
    @sourcery-ai title в pull request, чтобы (пере)сгенерировать заголовок в любое время.
  • Сгенерировать краткое описание pull request: Напишите @sourcery-ai summary в любом месте
    тела pull request, чтобы сгенерировать краткое описание PR в любое время и именно там, где вы
    хотите. Вы также можете оставить комментарий @sourcery-ai summary в pull request, чтобы
    (пере)сгенерировать краткое описание в любое время.
  • Сгенерировать руководство для проверяющего: Оставьте комментарий @sourcery-ai guide в pull
    request, чтобы (пере)сгенерировать руководство для проверяющего в любое время.
  • Разрешить все комментарии Sourcery: Оставьте комментарий @sourcery-ai resolve в pull
    request, чтобы разрешить все комментарии Sourcery. Полезно, если вы уже
    рассмотрели все комментарии и больше не хотите их видеть.
  • Отклонить все проверки Sourcery: Оставьте комментарий @sourcery-ai dismiss в pull
    request, чтобы отклонить все существующие проверки Sourcery. Особенно полезно, если вы
    хотите начать заново с новой проверкой - не забудьте оставить комментарий
    @sourcery-ai review, чтобы запустить новую проверку!

Настройка вашего опыта

Перейдите в свою панель управления, чтобы:

  • Включить или отключить функции проверки, такие как сгенерированное Sourcery краткое описание pull request,
    руководство для проверяющего и другие.
  • Изменить язык проверки.
  • Добавить, удалить или изменить пользовательские инструкции по проверке.
  • Настроить другие параметры проверки.

Получение помощи

Original review guide in English

Reviewer's Guide

This PR addresses import and logging errors by loading the version number dynamically in setup.py to avoid circular dependencies, bumps the package version to 1.8.6, and updates debug logging statements to use f-strings for correct JSON formatting.

Flow diagram for version retrieval in setup.py

flowchart TD
    A[setup.py] --> B[Open fast_bitrix24/__version__.py]
    B --> C[exec file contents to get __version__]
    C --> D[Use __version__ in setup configuration]
Loading

File-Level Changes

Change Details Files
Load version via exec in setup.py to avoid import cycle
  • Remove direct import of version
  • Read and execute version.py content at runtime
setup.py
Bump package version
  • Update version from 1.8.5 to 1.8.6
fast_bitrix24/__version__.py
Use f-string in debug logging for JSON output
  • Replace logger.debug("Response: %s", json) with f-string formatting
fast_bitrix24/srh.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет, @GeorgeNikitinNV - я проверил ваши изменения, и они выглядят отлично!

Подсказка для AI Agents
Пожалуйста, обратите внимание на комментарии из этого обзора кода:
## Индивидуальные комментарии

### Комментарий 1
<location> `fast_bitrix24/srh.py:194` </location>
<code_context>
                     json = await response.json(encoding="utf-8")

-                    logger.debug("Response: %s", json)
+                    logger.debug(f"Response: {str(json)}")

                     self.add_throttler_records(method, params, json)
</code_context>

<issue_to_address>
Использование f-строки с str(json) может не предоставить столько полезной информации, как логирование объекта напрямую.

Передача объекта напрямую в logger.debug сохраняет форматирование и может улучшить читаемость, особенно для сложных объектов. Рассмотрите возможность возврата к logger.debug("Response: %s", json).
</issue_to_address>

<suggested_fix>
<<<<<<< SEARCH
                    logger.debug(f"Response: {str(json)}")
=======
                    logger.debug("Response: %s", json)
>>>>>>> REPLACE

</suggested_fix>

Sourcery бесплатен для открытого исходного кода - если вам нравятся наши обзоры, пожалуйста, поделитесь ими ✨
Помогите мне быть полезнее! Пожалуйста, нажмите 👍 или 👎 на каждом комментарии, и я буду использовать обратную связь для улучшения ваших обзоров.
Original comment in English

Hey @GeorgeNikitinNV - I've reviewed your changes and they look great!

Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments

### Comment 1
<location> `fast_bitrix24/srh.py:194` </location>
<code_context>
                     json = await response.json(encoding="utf-8")

-                    logger.debug("Response: %s", json)
+                    logger.debug(f"Response: {str(json)}")

                     self.add_throttler_records(method, params, json)
</code_context>

<issue_to_address>
Using f-string with str(json) may not provide as much useful information as logging the object directly.

Passing the object directly to logger.debug preserves formatting and can improve readability, especially for complex objects. Consider reverting to logger.debug("Response: %s", json).
</issue_to_address>

<suggested_fix>
<<<<<<< SEARCH
                    logger.debug(f"Response: {str(json)}")
=======
                    logger.debug("Response: %s", json)
>>>>>>> REPLACE

</suggested_fix>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@@ -191,7 +191,7 @@ async def request_attempt(self, method, params=None) -> dict:
) as response:
json = await response.json(encoding="utf-8")

logger.debug("Response: %s", json)
logger.debug(f"Response: {str(json)}")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

предложение: Использование f-строки с str(json) может не предоставить столько полезной информации, как логирование объекта напрямую.

Передача объекта напрямую в logger.debug сохраняет форматирование и может улучшить читаемость, особенно для сложных объектов. Рассмотрите возможность возврата к logger.debug("Response: %s", json).

Suggested change
logger.debug(f"Response: {str(json)}")
logger.debug("Response: %s", json)
Original comment in English

suggestion: Using f-string with str(json) may not provide as much useful information as logging the object directly.

Passing the object directly to logger.debug preserves formatting and can improve readability, especially for complex objects. Consider reverting to logger.debug("Response: %s", json).

Suggested change
logger.debug(f"Response: {str(json)}")
logger.debug("Response: %s", json)

@leshchenko1979
Copy link
Owner

А вас не затруднит показать ошибки, которые выдает uv?

А также множественные ошибки в логах.

@GeorgeNikitinNV
Copy link
Author

А вас не затруднит показать ошибки, которые выдает uv?

А также множественные ошибки в логах.

Да, не проблема - вот такие валятся при каждом вызове, после фикса их нет:

2025-06-18 23:27:01,143 - fast_bitrix24 - DEBUG - [no-correlation-id] [anonymous] - srh:request_attempt:183 - Requesting {'method': batch, 'params': {'halt': 0, 'cmd': {'order0000000000': 'crm.company.add?__order=order0000000000&fields[TITLE]=...l&fields[COMPANY_TYPE]=OTHER&'}}}
--- Logging error ---
Traceback (most recent call last):
  File "/app/.../bitrix/tasks.py", line 66, in sync_study_to_crm_task
    current_loop = asyncio.get_running_loop()  # noqa: F841
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: no running event loop
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/logging/__init__.py", line 1160, in emit
    msg = self.format(record)
          ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 999, in format
    return fmt.format(record)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 703, in format
    record.message = record.getMessage()
                     ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 392, in getMessage
    msg = msg % self.args
          ~~~~^~~~~~~~~~~
TypeError: not all arguments converted during string formatting
Call stack:
  File "/app/.venv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 1134, in __call__
    ret = self.original_func(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.12/threading.py", line 1032, in _bootstrap
    self._bootstrap_inner()
  File "/usr/local/lib/python3.12/threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/worker.py", line 462, in run
    self.process_message(message)
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/worker.py", line 487, in process_message
    res = actor(*message.args, **message.kwargs)
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/actor.py", line 185, in __call__
    return self.fn(*args, **kwargs)
  File "/app/.../bitrix/decorators.py", line 149, in wrapper
    result = func(*args, **kwargs)
  File "/app/.../bitrix/tasks.py", line 77, in sync_study_to_crm_task
    result = _run_sync_in_new_loop(sync_service, nct_id)
  File "/app/.../bitrix/tasks.py", line 88, in _run_sync_in_new_loop
    return loop.run_until_complete(sync_service.sync_single_study(nct_id))
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 673, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 640, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 1992, in _run_once
    handle._run()
  File "/usr/local/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/app/.venv/lib/python3.12/site-packages/fast_bitrix24/srh.py", line 166, in single_request
    result = await self.request_attempt(method.strip().lower(), params)
  File "/app/.venv/lib/python3.12/site-packages/fast_bitrix24/srh.py", line 194, in request_attempt
    logger.debug("Response: %s", json)
Message: 'Response: %s'
Arguments: ('result', 'time')
--- Logging error ---
Traceback (most recent call last):
  File "/app/.../bitrix/tasks.py", line 66, in sync_study_to_crm_task
    current_loop = asyncio.get_running_loop()  # noqa: F841
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: no running event loop
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/logging/handlers.py", line 73, in emit
    if self.shouldRollover(record):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/handlers.py", line 197, in shouldRollover
    msg = "%s\n" % self.format(record)
                   ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 999, in format
    return fmt.format(record)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 703, in format
    record.message = record.getMessage()
                     ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/logging/__init__.py", line 392, in getMessage
    msg = msg % self.args
          ~~~~^~~~~~~~~~~
TypeError: not all arguments converted during string formatting
Call stack:
  File "/app/.venv/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 1134, in __call__
    ret = self.original_func(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.12/threading.py", line 1032, in _bootstrap
    self._bootstrap_inner()
  File "/usr/local/lib/python3.12/threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/worker.py", line 462, in run
    self.process_message(message)
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/worker.py", line 487, in process_message
    res = actor(*message.args, **message.kwargs)
  File "/app/.venv/lib/python3.12/site-packages/dramatiq/actor.py", line 185, in __call__
    return self.fn(*args, **kwargs)
  File "/app/.../bitrix/decorators.py", line 149, in wrapper
    result = func(*args, **kwargs)
  File "/app/.../bitrix/tasks.py", line 77, in sync_study_to_crm_task
    result = _run_sync_in_new_loop(sync_service, nct_id)
  File "/app/.../bitrix/tasks.py", line 88, in _run_sync_in_new_loop
    return loop.run_until_complete(sync_service.sync_single_study(nct_id))
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 673, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 640, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 1992, in _run_once
    handle._run()
  File "/usr/local/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/app/.venv/lib/python3.12/site-packages/fast_bitrix24/srh.py", line 166, in single_request
    result = await self.request_attempt(method.strip().lower(), params)
  File "/app/.venv/lib/python3.12/site-packages/fast_bitrix24/srh.py", line 194, in request_attempt
    logger.debug("Response: %s", json)
Message: 'Response: %s'
Arguments: ('result', 'time')

@GeorgeNikitinNV
Copy link
Author

Сейчас откатился на Вашу версию (1.8.5), но пока воспроизвести глюк с uv не могу. Если ничего не путаю, версия бралась из модуля в setup.py, но зависимости были еще не установлены (asyncio и др.), что вызывало ошибку, поскольку uv пытался его инициализировать.

Copy link
Owner

@leshchenko1979 leshchenko1979 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так, ну давайте тогда с uv отложим историю, а по логированию -- что там такого у вас в json?

Я не могу повторить ошибку.

Copy link
Owner

@leshchenko1979 leshchenko1979 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Второй вопрос -- вы при инициализации Bitrix24 прописываете параметр client? Можете показать код инициализации?

@GeorgeNikitinNV
Copy link
Author

Второй вопрос -- вы при инициализации Bitrix24 прописываете параметр client? Можете показать код инициализации?

from fast_bitrix24 import Bitrix
...
self.client = Bitrix(settings.bitrix_webhook_url, verbose=False)
...

@GeorgeNikitinNV
Copy link
Author

Так, ну давайте тогда с uv отложим историю, а по логированию -- что там такого у вас в json?

Я не могу повторить ошибку.

json как json - вот пример:

{
    "result": {
        "items": [
            {
                "id": 93,
                "createdTime": "2025-05-31T02:10:40+03:00",
                "updatedTime": "2025-05-31T02:10:40+03:00",
                "createdBy": 27,
                "updatedBy": 27,
                "assignedById": 27,
                "opened": "Y",
                "title": "REDACTED",
                "logo": "",
                "address": null,
                "addressLegal": null,
                "bankingDetails": null,
                "comments": null,
                "typeId": "CUSTOMER",
                "industry": "IT",
                "revenue": 0,
                "currencyId": "RUB",
                "employees": "EMPLOYEES_1",
                "leadId": null,
                "webformId": 0,
                "originatorId": null,
                "originId": null,
                "originVersion": null,
                "hasPhone": "N",
                "hasEmail": "N",
                "hasImol": "N",
                "isMyCompany": "N",
                "searchContent": "REDACTED,
                "categoryId": 0,
                "lastActivityBy": 27,
                "lastActivityTime": "2025-05-31T02:10:40+03:00",
                "emailHome": "",
                "emailWork": "",
                "emailMailing": "",
                "phoneMobile": "",
                "phoneWork": "",
                "phoneMailing": "",
                "imol": "",
                "email": "",
                "phone": "",
                "lastCommunicationTime": null,
                "lastCommunicationCallTime": null,
                "lastCommunicationEmailTime": null,
                "lastCommunicationImolTime": null,
                "lastCommunicationWebformTime": null,
                "parentId1056": null,
                "utmSource": null,
                "utmMedium": null,
                "utmCampaign": null,
                "utmContent": null,
                "utmTerm": null,
                "observers": [],
                "contactIds": [
                    123,
                    REDACTED
                ],
                "entityTypeId": 4,
                "UF_CRM_1750292035721": null,
                "fm": [],
            },
            ...
        ]
    },
    "total": 45,
    "time": {
        "start": 1750395562.854183,
        "finish": 1750395563.09679,
        "duration": 0.24260711669921875,
        "processing": 0.21869206428527832,
        "date_start": "2025-06-20T07:59:22+03:00",
        "date_finish": "2025-06-20T07:59:23+03:00",
        "operating_reset_at": 1750396162,
        "operating": 1.4807531833648682,
    },
}

@GeorgeNikitinNV
Copy link
Author

GeorgeNikitinNV commented Jun 20, 2025

О, удалось повторить ошибку после отката импорта. Когда я импортирую fast_bitrix24 из своего форка:

pyproject.toml:

[project]
...
dependencies = [
    "fast-bitrix24>=0.4.0",
...

[tool.uv.sources]
fast-bitrix24 = { git = "https://github.com/<MY_FORK>/fast_bitrix24.git", rev = "Fix-logging" }

то при uv sync получаю следующее:

❯ uv sync
    Updated https://github.com/<MY_FORK>/fast_bitrix24.git (71dff2ab1623293fc8ef259e83f3144e920a080c)
  × Failed to build `fast-bitrix24 @ git+https://github.com/<MY_FORK>/fast_bitrix24.git@Fix-logging`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1)

      [stderr]
      Traceback (most recent call last):
        File "<string>", line 14, in <module>
        File "/Users/george.nikitin/.cache/uv/builds-v0/.tmpY39W1u/lib/python3.12/site-packages/setuptools/build_meta.py", line 331, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=[])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/george.nikitin/.cache/uv/builds-v0/.tmpY39W1u/lib/python3.12/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/Users/george.nikitin/.cache/uv/builds-v0/.tmpY39W1u/lib/python3.12/site-packages/setuptools/build_meta.py", line 512, in run_setup
          super().run_setup(setup_script=setup_script)
        File "/Users/george.nikitin/.cache/uv/builds-v0/.tmpY39W1u/lib/python3.12/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "<string>", line 2, in <module>
        File "/Users/george.nikitin/.cache/uv/git-v0/checkouts/2b00622910832253/71dff2a/fast_bitrix24/__init__.py", line 3, in <module>
          from fast_bitrix24.bitrix import Bitrix, BitrixAsync
        File "/Users/george.nikitin/.cache/uv/git-v0/checkouts/2b00622910832253/71dff2a/fast_bitrix24/bitrix.py", line 9, in <module>
          import aiohttp
      ModuleNotFoundError: No module named 'aiohttp'

      hint: This usually indicates a problem with the package or the build environment.

Интересно, что при импорте из Вашего репо все работает, как надо (ну, кроме ошибок в логах, см. выше). Может быть, я что-то тут упускаю?

@leshchenko1979
Copy link
Owner

Все равно не могу повторить ошибку с логированием.

Запускаю такой скрипт

from logging import getLogger
import json

logger = getLogger(__name__)

json_data = json.loads("""{
    "result": {
        "items": [
            {
                "id": 93,
                "createdTime": "2025-05-31T02:10:40+03:00",
                "updatedTime": "2025-05-31T02:10:40+03:00",
                "createdBy": 27,
                "updatedBy": 27,
                "assignedById": 27,
                "opened": "Y",
                "title": "REDACTED",
                "logo": "",
                "address": null,
                "addressLegal": null,
                "bankingDetails": null,
                "comments": null,
                "typeId": "CUSTOMER",
                "industry": "IT",
                "revenue": 0,
                "currencyId": "RUB",
                "employees": "EMPLOYEES_1",
                "leadId": null,
                "webformId": 0,
                "originatorId": null,
                "originId": null,
                "originVersion": null,
                "hasPhone": "N",
                "hasEmail": "N",
                "hasImol": "N",
                "isMyCompany": "N",
                "searchContent": "REDACTED",
                "categoryId": 0,
                "lastActivityBy": 27,
                "lastActivityTime": "2025-05-31T02:10:40+03:00",
                "emailHome": "",
                "emailWork": "",
                "emailMailing": "",
                "phoneMobile": "",
                "phoneWork": "",
                "phoneMailing": "",
                "imol": "",
                "email": "",
                "phone": "",
                "lastCommunicationTime": null,
                "lastCommunicationCallTime": null,
                "lastCommunicationEmailTime": null,
                "lastCommunicationImolTime": null,
                "lastCommunicationWebformTime": null,
                "parentId1056": null,
                "utmSource": null,
                "utmMedium": null,
                "utmCampaign": null,
                "utmContent": null,
                "utmTerm": null,
                "observers": [],
                "contactIds": [
                    123,
                    "REDACTED"
                ],
                "entityTypeId": 4,
                "UF_CRM_1750292035721": null,
                "fm": []
            }
        ],
    "total": 45,
    "time": {
        "start": 1750395562.854183,
        "finish": 1750395563.09679,
        "duration": 0.24260711669921875,
        "processing": 0.21869206428527832,
        "date_start": "2025-06-20T07:59:22+03:00",
        "date_finish": "2025-06-20T07:59:23+03:00",
        "operating_reset_at": 1750396162,
        "operating": 1.4807531833648682
    }}}""")

logger.warning("Response: %s",json_data)

Все отрабатывает без ошибок:

Response: {'result': {'items': [{'id': 93, 'createdTime': '2025-05-31T02:10:40+03:00', 'updatedTime': '2025-05-31T02:10:40+03:00', 'createdBy': 27, 'updatedBy': 27, 'assignedById': 27, 'opened': 'Y', 'title': 'REDACTED', 'logo': '', 'address': None, 'addressLegal': None, 'bankingDetails': None, 'comments': None, 'typeId': 'CUSTOMER', 'industry': 'IT', 'revenue': 0, 'currencyId': 'RUB', 'employees': 'EMPLOYEES_1', 'leadId': None, 'webformId': 0, 'originatorId': None, 'originId': None, 'originVersion': None, 'hasPhone': 'N', 'hasEmail': 'N', 'hasImol': 'N', 'isMyCompany': 'N', 'searchContent': 'REDACTED', 'categoryId': 0, 'lastActivityBy': 27, 'lastActivityTime': '2025-05-31T02:10:40+03:00', 'emailHome': '', 'emailWork': '', 'emailMailing': '', 'phoneMobile': '', 'phoneWork': '', 'phoneMailing': '', 'imol': '', 'email': '', 'phone': '', 'lastCommunicationTime': None, 'lastCommunicationCallTime': None, 'lastCommunicationEmailTime': None, 'lastCommunicationImolTime': None, 'lastCommunicationWebformTime': None, 'parentId1056': None, 'utmSource': None, 'utmMedium': None, 'utmCampaign': None, 'utmContent': None, 'utmTerm': None, 'observers': [], 'contactIds': [123, 'REDACTED'], 'entityTypeId': 4, 'UF_CRM_1750292035721': None, 'fm': []}], 'total': 45, 'time': {'start': 1750395562.854183, 'finish': 1750395563.09679, 'duration': 0.24260711669921875, 'processing': 0.21869206428527832, 'date_start': '2025-06-20T07:59:22+03:00', 'date_finish': '2025-06-20T07:59:23+03:00', 'operating_reset_at': 1750396162, 'operating': 1.4807531833648682}}}

@leshchenko1979
Copy link
Owner

У меня зреет подозрение, что у вас какая-то нестрандартная среда. Какие-то либы подменены, возможно. Вы пробовали ставить либу в чистый venv?

@leshchenko1979
Copy link
Owner

Вы можете написать минимальный тест, который будет использовать текущий код либы и демонстрировать ошибку? Сейчас речь пока только о логировании.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants