Skip to content

fix: Issue #19 Partial API Response Handling [AI-assisted]#41

Merged
madmatvey merged 3 commits into
madmatvey:masterfrom
Ferrayd:feature/issue-19-Partial-API
Jul 26, 2025
Merged

fix: Issue #19 Partial API Response Handling [AI-assisted]#41
madmatvey merged 3 commits into
madmatvey:masterfrom
Ferrayd:feature/issue-19-Partial-API

Conversation

@Ferrayd

@Ferrayd Ferrayd commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Safe Handling of Optional Model Fields

Starting from version [specify version], all optional fields in SDK models (using attribute?) explicitly have a default value of nil. This means:

  • If an optional field is missing in the API response, the SDK will not raise an error or crash.
  • All new optional fields must use .optional.default(nil) or another appropriate default value.
  • This makes the SDK more robust to API evolution and partial failures.

Example

attribute? :foo, Types::String.optional.default(nil)

Contributor Guidelines

  • When adding new models or fields, always use .optional.default(nil) for all optional fields.
  • Do not leave optional fields without a default value—this can cause errors if the API changes.
  • Add tests to ensure models handle missing data gracefully.

Безопасная обработка опциональных полей моделей

Начиная с версии [указать версию], все опциональные поля моделей (attribute?) в SDK имеют явное значение по умолчанию (nil). Это означает:

  • Если в ответе API отсутствует опциональное поле, SDK не выбрасывает ошибку и не падает.
  • Для всех новых опциональных полей обязательно указывать .optional.default(nil) или другое подходящее значение по умолчанию.
  • Это повышает устойчивость SDK к эволюции и частичным сбоям API.

Пример

attribute? :foo, Types::String.optional.default(nil)

Рекомендации для контрибьюторов

  • При добавлении новых моделей или полей используйте .optional.default(nil) для всех опциональных полей.
  • Не оставляйте опциональные поля без дефолта — это может привести к ошибкам при изменениях API.
  • Добавляйте тесты на обработку отсутствующих данных в моделях.

@madmatvey madmatvey linked an issue Jul 26, 2025 that may be closed by this pull request

@madmatvey madmatvey left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Саммари изменений: Обработка частичных ответов API #19

Общее описание изменений

Ценность для продукта: Изменения делают SDK более устойчивым, предотвращая краши при получении неполных или отсутствующих опциональных полей от API. Это улучшает пользовательский опыт, позволяя SDK корректно обрабатывать эволюцию API и частичные сбои.

Инженерный подход: Решение следует принципу защитного программирования, добавляя явные значения по умолчанию (nil) для всех опциональных полей в модели TransferResponse. Это сохраняет обратную совместимость и делает SDK устойчивым к изменениям API.

Изменённые файлы

  1. Issue19-notes.md (новый файл)

    • Подробная документация проблемы и решения
    • Лог работы с AI-ассистентом
    • План действий и рекомендации
  2. lib/gasfree_sdk/models/transfer_response.rb (изменён)

    • Добавлены .optional.default(nil) для всех опциональных полей
    • Всего изменено 20 полей из 21 опционального

Результаты тестирования

  • 97 тестов RSpec - все прошли успешно
  • RuboCop - 32 файла проверены, нарушений стиля нет
  • Обратная совместимость - полностью сохранена

Ключевые улучшения

  1. Устойчивость к сбоям API: SDK больше не падает при отсутствии опциональных полей
  2. Эволюция API: Поддержка изменений в структуре ответов API
  3. Частичные ответы: Корректная обработка неполных данных
  4. Документация: Подробное описание проблемы и решения

Техническая реализация

# Было:
attribute? :created_at, Types::JSON::Time

# Стало:
attribute? :created_at, Types::JSON::Time.optional.default(nil)

Рекомендация

ОДОБРИТЬ - Pull Request готов к слиянию.

Изменения успешно решают основную проблему крашей SDK при отсутствии опциональных полей в ответах API. Реализация чистая, хорошо протестированная и сохраняет полную обратную совместимость, одновременно улучшая надёжность SDK.

# Было:
attribute? :created_at, Types::JSON::Time

# Стало:
attribute? :created_at, Types::JSON::Time.optional.default(nil)

@madmatvey
madmatvey merged commit 64afa26 into madmatvey:master Jul 26, 2025
1 check passed
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.

Partial API Response Handling

2 participants