lunchmoney-python 2.17.0__tar.gz → 2.18.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/PKG-INFO +2 -2
  2. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/README.md +1 -1
  3. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/__init__.py +1 -1
  4. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api_client.py +1 -1
  5. lunchmoney_python-2.18.0/lunchmoney/app.py +589 -0
  6. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/configuration.py +1 -1
  7. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney_python.egg-info/PKG-INFO +2 -2
  8. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney_python.egg-info/SOURCES.txt +2 -0
  9. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/pyproject.toml +1 -1
  10. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/setup.py +1 -1
  11. lunchmoney_python-2.18.0/test/test_app.py +12 -0
  12. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/__init__.py +0 -0
  13. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/categories_api.py +0 -0
  14. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/manual_accounts_api.py +0 -0
  15. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/me_api.py +0 -0
  16. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/plaid_accounts_api.py +0 -0
  17. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/recurring_items_api.py +0 -0
  18. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/summary_api.py +0 -0
  19. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/tags_api.py +0 -0
  20. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/transactions_api.py +0 -0
  21. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/transactions_bulk_api.py +0 -0
  22. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/transactions_files_api.py +0 -0
  23. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/transactions_group_api.py +0 -0
  24. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api/transactions_split_api.py +0 -0
  25. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/api_response.py +0 -0
  26. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/exceptions.py +0 -0
  27. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/__init__.py +0 -0
  28. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/account_type_enum.py +0 -0
  29. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/aligned_category_totals_object.py +0 -0
  30. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/aligned_summary_category_object.py +0 -0
  31. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/aligned_summary_response_object.py +0 -0
  32. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/category_object.py +0 -0
  33. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/child_category_object.py +0 -0
  34. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/child_transaction_object.py +0 -0
  35. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_category_request_object.py +0 -0
  36. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_category_request_object_children_inner.py +0 -0
  37. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_manual_account_request_object.py +0 -0
  38. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_manual_account_request_object_balance.py +0 -0
  39. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_new_transactions_request.py +0 -0
  40. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/create_tag_request_object.py +0 -0
  41. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/currency_enum.py +0 -0
  42. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/delete_category_response_with_dependencies.py +0 -0
  43. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/delete_category_response_with_dependencies_dependents.py +0 -0
  44. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/delete_tag_response_with_dependencies.py +0 -0
  45. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/delete_tag_response_with_dependencies_dependents.py +0 -0
  46. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/delete_transactions_request.py +0 -0
  47. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/error_response_object.py +0 -0
  48. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/error_response_object_errors_inner.py +0 -0
  49. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_categories200_response.py +0 -0
  50. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_manual_accounts200_response.py +0 -0
  51. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_plaid_accounts200_response.py +0 -0
  52. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_recurring200_response.py +0 -0
  53. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_tags200_response.py +0 -0
  54. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_transactions200_response.py +0 -0
  55. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_all_transactions_created_since_parameter.py +0 -0
  56. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_budget_summary200_response.py +0 -0
  57. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/get_transaction_attachment_url200_response.py +0 -0
  58. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/group_transactions_request.py +0 -0
  59. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/insert_transaction_object.py +0 -0
  60. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/insert_transaction_object_amount.py +0 -0
  61. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/insert_transactions_response_object.py +0 -0
  62. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/manual_account_object.py +0 -0
  63. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/non_aligned_category_totals_object.py +0 -0
  64. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/non_aligned_summary_category_object.py +0 -0
  65. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/non_aligned_summary_response_object.py +0 -0
  66. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/plaid_account_object.py +0 -0
  67. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/recurring_object.py +0 -0
  68. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/recurring_object_matches.py +0 -0
  69. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/recurring_object_matches_found_transactions_inner.py +0 -0
  70. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/recurring_object_overrides.py +0 -0
  71. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/recurring_object_transaction_criteria.py +0 -0
  72. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/skipped_existing_external_id_object.py +0 -0
  73. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/split_transaction_object.py +0 -0
  74. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/split_transaction_object_amount.py +0 -0
  75. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/split_transaction_request.py +0 -0
  76. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_category_occurrence_object.py +0 -0
  77. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_recurring_transaction_object.py +0 -0
  78. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_rollover_pool_adjustment_object.py +0 -0
  79. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_rollover_pool_object.py +0 -0
  80. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_totals_breakdown_object.py +0 -0
  81. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/summary_totals_object.py +0 -0
  82. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/tag_object.py +0 -0
  83. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/transaction_attachment_object.py +0 -0
  84. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/transaction_object.py +0 -0
  85. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_category_request_object.py +0 -0
  86. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_manual_account_request_object.py +0 -0
  87. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_manual_account_request_object_balance.py +0 -0
  88. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_tag_request_object.py +0 -0
  89. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_transaction_object.py +0 -0
  90. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_transaction_object_amount.py +0 -0
  91. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_transactions200_response.py +0 -0
  92. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_transactions_request.py +0 -0
  93. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/update_transactions_request_transactions_inner.py +0 -0
  94. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/models/user_object.py +0 -0
  95. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/py.typed +0 -0
  96. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney/rest.py +0 -0
  97. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney_python.egg-info/dependency_links.txt +0 -0
  98. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney_python.egg-info/requires.txt +0 -0
  99. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/lunchmoney_python.egg-info/top_level.txt +0 -0
  100. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/setup.cfg +0 -0
  101. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_account_type_enum.py +0 -0
  102. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_aligned_category_totals_object.py +0 -0
  103. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_aligned_summary_category_object.py +0 -0
  104. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_aligned_summary_response_object.py +0 -0
  105. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_categories_api.py +0 -0
  106. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_category_object.py +0 -0
  107. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_child_category_object.py +0 -0
  108. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_child_transaction_object.py +0 -0
  109. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_category_request_object.py +0 -0
  110. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_category_request_object_children_inner.py +0 -0
  111. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_manual_account_request_object.py +0 -0
  112. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_manual_account_request_object_balance.py +0 -0
  113. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_new_transactions_request.py +0 -0
  114. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_create_tag_request_object.py +0 -0
  115. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_currency_enum.py +0 -0
  116. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_delete_category_response_with_dependencies.py +0 -0
  117. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_delete_category_response_with_dependencies_dependents.py +0 -0
  118. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_delete_tag_response_with_dependencies.py +0 -0
  119. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_delete_tag_response_with_dependencies_dependents.py +0 -0
  120. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_delete_transactions_request.py +0 -0
  121. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_error_response_object.py +0 -0
  122. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_error_response_object_errors_inner.py +0 -0
  123. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_categories200_response.py +0 -0
  124. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_manual_accounts200_response.py +0 -0
  125. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_plaid_accounts200_response.py +0 -0
  126. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_recurring200_response.py +0 -0
  127. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_tags200_response.py +0 -0
  128. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_transactions200_response.py +0 -0
  129. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_all_transactions_created_since_parameter.py +0 -0
  130. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_budget_summary200_response.py +0 -0
  131. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_get_transaction_attachment_url200_response.py +0 -0
  132. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_group_transactions_request.py +0 -0
  133. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_insert_transaction_object.py +0 -0
  134. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_insert_transaction_object_amount.py +0 -0
  135. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_insert_transactions_response_object.py +0 -0
  136. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_manual_account_object.py +0 -0
  137. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_manual_accounts_api.py +0 -0
  138. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_me_api.py +0 -0
  139. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_non_aligned_category_totals_object.py +0 -0
  140. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_non_aligned_summary_category_object.py +0 -0
  141. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_non_aligned_summary_response_object.py +0 -0
  142. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_plaid_account_object.py +0 -0
  143. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_plaid_accounts_api.py +0 -0
  144. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_items_api.py +0 -0
  145. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_object.py +0 -0
  146. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_object_matches.py +0 -0
  147. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_object_matches_found_transactions_inner.py +0 -0
  148. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_object_overrides.py +0 -0
  149. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_recurring_object_transaction_criteria.py +0 -0
  150. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_skipped_existing_external_id_object.py +0 -0
  151. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_split_transaction_object.py +0 -0
  152. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_split_transaction_object_amount.py +0 -0
  153. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_split_transaction_request.py +0 -0
  154. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_api.py +0 -0
  155. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_category_occurrence_object.py +0 -0
  156. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_recurring_transaction_object.py +0 -0
  157. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_rollover_pool_adjustment_object.py +0 -0
  158. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_rollover_pool_object.py +0 -0
  159. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_totals_breakdown_object.py +0 -0
  160. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_summary_totals_object.py +0 -0
  161. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_tag_object.py +0 -0
  162. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_tags_api.py +0 -0
  163. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transaction_attachment_object.py +0 -0
  164. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transaction_object.py +0 -0
  165. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transactions_api.py +0 -0
  166. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transactions_bulk_api.py +0 -0
  167. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transactions_files_api.py +0 -0
  168. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transactions_group_api.py +0 -0
  169. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_transactions_split_api.py +0 -0
  170. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_category_request_object.py +0 -0
  171. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_manual_account_request_object.py +0 -0
  172. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_manual_account_request_object_balance.py +0 -0
  173. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_tag_request_object.py +0 -0
  174. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_transaction_object.py +0 -0
  175. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_transaction_object_amount.py +0 -0
  176. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_transactions200_response.py +0 -0
  177. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_transactions_request.py +0 -0
  178. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_update_transactions_request_transactions_inner.py +0 -0
  179. {lunchmoney_python-2.17.0 → lunchmoney_python-2.18.0}/test/test_user_object.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lunchmoney-python
3
- Version: 2.17.0
3
+ Version: 2.18.0
4
4
  Summary: Lunch Money API - v2
5
5
  Home-page:
6
6
  Author: OpenAPI Generator community
@@ -55,7 +55,7 @@ If you have been providing feedback on the API during our iterative design proce
55
55
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
56
56
 
57
57
  - API version: 2.8.4
58
- - Package version: 2.17.0
58
+ - Package version: 2.18.0
59
59
  - Generator version: 7.17.0
60
60
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
61
61
 
@@ -37,7 +37,7 @@ If you have been providing feedback on the API during our iterative design proce
37
37
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
38
38
 
39
39
  - API version: 2.8.4
40
- - Package version: 2.17.0
40
+ - Package version: 2.18.0
41
41
  - Generator version: 7.17.0
42
42
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
43
43
 
@@ -15,7 +15,7 @@
15
15
  """ # noqa: E501
16
16
 
17
17
 
18
- __version__ = "2.17.0"
18
+ __version__ = "2.18.0"
19
19
 
20
20
  # Define package exports
21
21
  __all__ = [
@@ -92,7 +92,7 @@ class ApiClient:
92
92
  self.default_headers[header_name] = header_value
93
93
  self.cookie = cookie
94
94
  # Set default User-Agent.
95
- self.user_agent = 'OpenAPI-Generator/2.17.0/python'
95
+ self.user_agent = 'OpenAPI-Generator/2.18.0/python'
96
96
  self.client_side_validation = configuration.client_side_validation
97
97
 
98
98
  def __enter__(self):
@@ -0,0 +1,589 @@
1
+ """
2
+ Base Classes for LunchMoneyApp
3
+ """
4
+
5
+ import datetime
6
+ import logging
7
+ from collections.abc import Iterable
8
+ from dataclasses import dataclass, field
9
+ from functools import cached_property
10
+ from os import getenv
11
+ from typing import Any, Callable, ClassVar, NamedTuple, TypeVar, overload
12
+
13
+ import lunchmoney
14
+ from lunchmoney import GetAllTransactions200Response
15
+ from lunchmoney.models import ( # type: ignore[attr-defined]
16
+ CategoryObject,
17
+ ManualAccountObject,
18
+ PlaidAccountObject,
19
+ TagObject,
20
+ TransactionObject,
21
+ UserObject,
22
+ )
23
+ from pydantic import BaseModel
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ LunchableModelType = TypeVar("LunchableModelType", bound=BaseModel)
29
+
30
+
31
+ @dataclass(slots=True)
32
+ class LunchableData:
33
+ """
34
+ Data Container for Lunchable App Data
35
+ """
36
+
37
+ plaid_accounts: dict[int, PlaidAccountObject] = field(default_factory=dict)
38
+ """Plaid Accounts"""
39
+ transactions: dict[int, TransactionObject] = field(default_factory=dict)
40
+ """Transactions"""
41
+ categories: dict[int, CategoryObject] = field(default_factory=dict)
42
+ """Categories"""
43
+ manual_accounts: dict[int, ManualAccountObject] = field(default_factory=dict)
44
+ """Manual Accounts"""
45
+ tags: dict[int, TagObject] = field(default_factory=dict)
46
+ """Tags"""
47
+ user: UserObject | None = None
48
+ """User"""
49
+
50
+ @property
51
+ def current_user(self) -> UserObject:
52
+ """
53
+ Current User Object
54
+
55
+ Returns
56
+ -------
57
+ UserObject
58
+ """
59
+ if not self.user:
60
+ raise ValueError("User data has not been loaded.")
61
+ return self.user
62
+
63
+ @property
64
+ def asset_map(self) -> dict[int, PlaidAccountObject | ManualAccountObject]:
65
+ """
66
+ Asset Mapping Across Plaid Accounts and Assets
67
+
68
+ Returns
69
+ -------
70
+ dict[int, Union[PlaidAccountObject, ManualAccountObject]]
71
+ """
72
+ return {
73
+ **self.plaid_accounts,
74
+ **self.manual_accounts,
75
+ }
76
+
77
+ @property
78
+ def plaid_accounts_list(self) -> list[PlaidAccountObject]:
79
+ """
80
+ List of Plaid Accounts
81
+
82
+ Returns
83
+ -------
84
+ list[PlaidAccountObject]
85
+ """
86
+ return list(self.plaid_accounts.values())
87
+
88
+ @property
89
+ def manual_accounts_list(self) -> list[ManualAccountObject]:
90
+ """
91
+ List of Manual Accounts
92
+
93
+ Returns
94
+ -------
95
+ list[ManualAccountObject]
96
+ """
97
+ return list(self.manual_accounts.values())
98
+
99
+ @property
100
+ def transactions_list(self) -> list[TransactionObject]:
101
+ """
102
+ List of Transactions
103
+
104
+ Returns
105
+ -------
106
+ list[TransactionObject]
107
+ """
108
+ return list(self.transactions.values())
109
+
110
+ @property
111
+ def categories_list(self) -> list[CategoryObject]:
112
+ """
113
+ List of Categories
114
+
115
+ Returns
116
+ -------
117
+ list[CategoryObject]
118
+ """
119
+ return list(self.categories.values())
120
+
121
+ @property
122
+ def tags_list(self) -> list[TagObject]:
123
+ """
124
+ List of Tags
125
+
126
+ Returns
127
+ -------
128
+ list[TagObject]
129
+ """
130
+ return list(self.tags.values())
131
+
132
+
133
+ class _ObjectMapper(NamedTuple):
134
+ """
135
+ Object Mapper for Lunchable Models
136
+ """
137
+
138
+ func: Callable[..., Any]
139
+ data_attr: str
140
+
141
+
142
+ @dataclass(slots=True)
143
+ class LunchableApi:
144
+ """
145
+ API Container for Lunchable App APIs
146
+ """
147
+
148
+ plaid: lunchmoney.PlaidAccountsApi
149
+ transactions: lunchmoney.TransactionsApi
150
+ transactions_bulk: lunchmoney.TransactionsBulkApi
151
+ categories: lunchmoney.CategoriesApi
152
+ manual_accounts: lunchmoney.ManualAccountsApi
153
+ tags: lunchmoney.TagsApi
154
+ me: lunchmoney.MeApi
155
+ recurring_items: lunchmoney.RecurringItemsApi
156
+ summary: lunchmoney.SummaryApi
157
+ transactions_files: lunchmoney.TransactionsFilesApi
158
+ transactions_group: lunchmoney.TransactionsGroupApi
159
+ transactions_split: lunchmoney.TransactionsSplitApi
160
+
161
+ @classmethod
162
+ def from_client(cls, client: lunchmoney.ApiClient) -> "LunchableApi":
163
+ """
164
+ Initialize LunchableApi from ApiClient
165
+ """
166
+ return cls(
167
+ plaid=lunchmoney.PlaidAccountsApi(client),
168
+ transactions=lunchmoney.TransactionsApi(client),
169
+ transactions_bulk=lunchmoney.TransactionsBulkApi(client),
170
+ categories=lunchmoney.CategoriesApi(client),
171
+ manual_accounts=lunchmoney.ManualAccountsApi(client),
172
+ tags=lunchmoney.TagsApi(client),
173
+ me=lunchmoney.MeApi(client),
174
+ recurring_items=lunchmoney.RecurringItemsApi(client),
175
+ summary=lunchmoney.SummaryApi(client),
176
+ transactions_files=lunchmoney.TransactionsFilesApi(client),
177
+ transactions_group=lunchmoney.TransactionsGroupApi(client),
178
+ transactions_split=lunchmoney.TransactionsSplitApi(client),
179
+ )
180
+
181
+
182
+ class LunchMoneyApp:
183
+ """
184
+ Base LunchMoney App Class
185
+ """
186
+
187
+ lunchable_models: ClassVar[Iterable[type[BaseModel]]] = [
188
+ PlaidAccountObject,
189
+ CategoryObject,
190
+ ManualAccountObject,
191
+ TagObject,
192
+ UserObject,
193
+ ]
194
+ """Every LunchableApp should define which data objects it depends on"""
195
+ lunchable_models_kwargs: ClassVar[dict[type[BaseModel], dict[str, Any]]] = {}
196
+ """Optional keyword arguments to pass to model constructors (supports callables)"""
197
+ transaction_pagination: ClassVar[int] = 500
198
+ """Number of Transactions to fetch per page during pagination"""
199
+
200
+ def __init__(
201
+ self,
202
+ access_token: str | None = None,
203
+ lunchable_models: Iterable[type[BaseModel]] | None = None,
204
+ lunchable_models_kwargs: dict[type[BaseModel], dict[str, Any]] | None = None,
205
+ transaction_pagination: int | None = None,
206
+ ) -> None:
207
+ """
208
+ Initialize LunchMoneyApp
209
+
210
+ Parameters
211
+ ----------
212
+ access_token: str | None
213
+ LunchMoney Access Token. If not provided, will attempt to read from
214
+ `LUNCHMONEY_ACCESS_TOKEN` environment variable.
215
+ lunchable_models: Iterable[type[LunchableModelType]] | None
216
+ Explicit list of Lunchable Models to use in this app. If not provided,
217
+ will default to the class variable `lunchable_models`.
218
+ lunchable_models_kwargs: dict[type[LunchableModelType], dict[str, Any]] | None
219
+ Optional keyword arguments to pass to model constructors. If not provided,
220
+ will default to the class variable `lunchable_models_kwargs`.
221
+ transaction_pagination: int | None
222
+ Number of Transactions to fetch per page during pagination. If not provided,
223
+ will default to the class variable `transaction_pagination`.
224
+ """
225
+ access_token = access_token or getenv("LUNCHMONEY_ACCESS_TOKEN")
226
+ if not access_token:
227
+ raise ValueError(
228
+ "LunchMoney API key must be provided via "
229
+ "parameter or LUNCHMONEY_ACCESS_TOKEN environment "
230
+ "variable."
231
+ )
232
+ configuration = lunchmoney.Configuration(
233
+ host="https://api.lunchmoney.dev/v2", access_token=access_token
234
+ )
235
+ self.client: lunchmoney.ApiClient = lunchmoney.ApiClient(
236
+ configuration=configuration
237
+ )
238
+ self.api: LunchableApi = LunchableApi.from_client(self.client)
239
+ self.data: LunchableData = LunchableData()
240
+ self._lunchable_models: Iterable[type[BaseModel]] = (
241
+ lunchable_models or self.__class__.lunchable_models
242
+ )
243
+ self._lunchable_models_kwargs: dict[type[BaseModel], dict[str, Any]] = (
244
+ lunchable_models_kwargs or self.__class__.lunchable_models_kwargs
245
+ )
246
+ self._transaction_pagination: int = (
247
+ transaction_pagination or self.__class__.transaction_pagination
248
+ )
249
+
250
+ @cached_property
251
+ def _model_mapping(self) -> dict[type[BaseModel], _ObjectMapper]:
252
+ """
253
+ Model Class -> _ObjectMapper Mapping
254
+ """
255
+ return {
256
+ PlaidAccountObject: _ObjectMapper(
257
+ func=self.api.plaid.get_all_plaid_accounts,
258
+ data_attr="plaid_accounts",
259
+ ),
260
+ TransactionObject: _ObjectMapper(
261
+ func=self.api.transactions_bulk.get_all_transactions,
262
+ data_attr="transactions",
263
+ ),
264
+ CategoryObject: _ObjectMapper(
265
+ func=self.api.categories.get_all_categories,
266
+ data_attr="categories",
267
+ ),
268
+ ManualAccountObject: _ObjectMapper(
269
+ func=self.api.manual_accounts.get_all_manual_accounts,
270
+ data_attr="manual_accounts",
271
+ ),
272
+ TagObject: _ObjectMapper(
273
+ func=self.api.tags.get_all_tags,
274
+ data_attr="tags",
275
+ ),
276
+ UserObject: _ObjectMapper(
277
+ func=self.api.me.get_me,
278
+ data_attr="me",
279
+ ),
280
+ }
281
+
282
+ def _get_model_mapper(self, model: type[LunchableModelType]) -> _ObjectMapper:
283
+ """
284
+ Get the appropriate function for a given Lunchable Model
285
+
286
+ Parameters
287
+ ----------
288
+ model: Type[LunchableModelType]
289
+ Type of Lunchable Model to get the function for
290
+
291
+ Returns
292
+ -------
293
+ _ObjectMapper
294
+ _ObjectMapper containing the function and data attribute name
295
+ """
296
+ mapper = self._model_mapping.get(model)
297
+ if not mapper:
298
+ msg = f"Model {model.__name__} is not supported for refresh."
299
+ raise NotImplementedError(msg)
300
+ return mapper
301
+
302
+ def _resolve_model_kwargs(
303
+ self, model: type[LunchableModelType], **kwargs: Any
304
+ ) -> dict[str, Any]:
305
+ """
306
+ Resolve Any Model Kwargs that Are Callable
307
+ """
308
+ model_kwargs = self._lunchable_models_kwargs.get(model, {}).copy()
309
+ model_kwargs.update(kwargs)
310
+ resolved_kwargs: dict[str, Any] = {}
311
+ for key, value in model_kwargs.items():
312
+ if callable(value):
313
+ resolved_value = value()
314
+ else:
315
+ resolved_value = value
316
+ resolved_kwargs[key] = resolved_value
317
+ return resolved_kwargs
318
+
319
+ @overload
320
+ def refresh(self, model: type[UserObject], **kwargs: Any) -> UserObject: ...
321
+
322
+ @overload
323
+ def refresh(
324
+ self, model: type[TransactionObject], **kwargs: Any
325
+ ) -> dict[int, TransactionObject]: ...
326
+
327
+ @overload
328
+ def refresh(
329
+ self, model: type[LunchableModelType], **kwargs: Any
330
+ ) -> dict[int, LunchableModelType]: ...
331
+
332
+ def refresh(
333
+ self, model: type[LunchableModelType], **kwargs: Any
334
+ ) -> LunchableModelType | dict[int, LunchableModelType]:
335
+ """
336
+ Refresh a Lunchable Model
337
+
338
+ Parameters
339
+ ----------
340
+ model: Type[LunchableModelType]
341
+ Type of Lunchable Model to refresh
342
+ kwargs: Any
343
+ Additional keyword arguments to pass to the function that
344
+ fetches the data.
345
+
346
+ Returns
347
+ -------
348
+ LunchableModelType | dict[int, LunchableModelType]
349
+ Unless you're requesting the `UserObject`, this method will return a
350
+ dictionary of the refreshed data, keyed by the object's ID.
351
+
352
+ Examples
353
+ --------
354
+ ```python
355
+ from lunchable.models import CategoriesObject
356
+ from lunchable.plugins import LunchableApp
357
+
358
+ app = LunchableApp()
359
+ categories: dict[int, CategoriesObject] = app.refresh(CategoriesObject)
360
+ ```
361
+ """
362
+ mapper = self._get_model_mapper(model)
363
+ model_kwargs = self._resolve_model_kwargs(model=model, **kwargs)
364
+ logger.info("Refreshing LunchMoney Data: %s", mapper.data_attr)
365
+ if model is UserObject:
366
+ user = mapper.func(**model_kwargs)
367
+ self.data.user = user
368
+ return user
369
+ elif model is TransactionObject:
370
+ transaction_map: dict[int, TransactionObject] = {
371
+ obj.id: obj for obj in self._paginate_transactions(**model_kwargs)
372
+ }
373
+ logger.info("Refreshed LunchMoney Transactions (%s)", len(transaction_map))
374
+ self.data.transactions.update(transaction_map)
375
+ return transaction_map # type: ignore[return-value]
376
+ else:
377
+ response = mapper.func(**model_kwargs)
378
+ data_dict = {obj.id: obj for obj in getattr(response, mapper.data_attr)}
379
+ setattr(self.data, mapper.data_attr, data_dict)
380
+ return getattr(self.data, mapper.data_attr)
381
+
382
+ def refresh_data(
383
+ self, models: Iterable[type[LunchableModelType]] | None = None
384
+ ) -> None:
385
+ """
386
+ Refresh the data in the Lunchable App
387
+
388
+ Parameters
389
+ ----------
390
+ models: Iterable[type[LunchableModelType]] | None
391
+ Explicit list of Lunchable Models to refresh. If not provided,
392
+ all models defined in will be refreshed (which by default is
393
+ all of them except for transactions)
394
+
395
+ Examples
396
+ --------
397
+ ```python
398
+ from lunchable.models import PlaidAccountObject
399
+ from lunchable.plugins import LunchableApp
400
+
401
+ app = LunchableApp()
402
+ app.refresh_data()
403
+ plaid_accounts: dict[int, PlaidAccountObject] = app.data.plaid_accounts
404
+ ```
405
+
406
+ ```python
407
+ from lunchable.models import AssetsObject
408
+ from lunchable.plugins import LunchableApp
409
+
410
+ app = LunchableApp()
411
+ app.refresh_data(models=[AssetsObject])
412
+ assets: dict[int, AssetsObject] = app.data.assets
413
+ ```
414
+ """
415
+ refresh_models = models or self._lunchable_models
416
+ for model in set(refresh_models):
417
+ self.refresh(model)
418
+
419
+ def refresh_transactions(
420
+ self,
421
+ start_date: datetime.date | None = None,
422
+ end_date: datetime.date | None = None,
423
+ created_since: datetime.date | str | None = None,
424
+ updated_since: datetime.date | str | None = None,
425
+ manual_account_id: int | None = None,
426
+ plaid_account_id: int | None = None,
427
+ recurring_id: int | None = None,
428
+ category_id: int | None = None,
429
+ tag_id: int | None = None,
430
+ is_group_parent: bool | None = None,
431
+ status: str | None = None,
432
+ is_pending: bool | None = None,
433
+ include_pending: bool | None = None,
434
+ include_metadata: bool | None = None,
435
+ include_split_parents: bool | None = None,
436
+ include_group_children: bool | None = None,
437
+ include_files: bool | None = None,
438
+ ) -> dict[int, TransactionObject]:
439
+ """
440
+ Refresh Transactions in the App
441
+
442
+ Parameters
443
+ ----------
444
+ start_date: datetime.date | None
445
+ Denotes the beginning of the time period to fetch transactions for. If
446
+ omitted, the most recent transactions will be returned. See `limit`.
447
+ Required if end_date exists.
448
+ end_date: datetime.date | None
449
+ Denotes the end of the time period you'd like to get transactions for.
450
+ Required if start_date exists.
451
+ created_since: datetime.date | str | None
452
+ Filter transactions to those created after the specified timestamp.
453
+ Accepts either a date (YYYY-MM-DD) or ISO 8601 datetime string.
454
+ Date-only values are interpreted as midnight UTC (00:00:00Z).
455
+ updated_since: datetime.date | str | None
456
+ Filter transactions to those updated after the specified timestamp.
457
+ Accepts either a date (YYYY-MM-DD) or ISO 8601 datetime string.
458
+ Date-only values are interpreted as midnight UTC (00:00:00Z).
459
+ manual_account_id: int | None
460
+ Filter transactions to those associated with specified manual account ID
461
+ or set this to 0 to omit any transactions from manual accounts. Setting
462
+ both this and `plaid_account_id` to 0 will return transactions with no
463
+ account. These are listed as "Cash Transactions" in the Lunch Money GUI.
464
+ Note that transaction groups are not associated with any account. If you
465
+ want the response to include transactions from transaction groups, set
466
+ the `include_group_children` query parameter to `true` when filtering
467
+ by manual accounts.
468
+ plaid_account_id: int | None
469
+ Filter transactions to those associated with specified plaid account ID
470
+ or set this to 0 to omit any transactions from plaid accounts. Setting
471
+ both this and `manual_account_id` to 0 will return transactions with no
472
+ account. These are listed as "Cash Transactions" in the Lunch Money GUI.
473
+ Note that transaction groups are not associated with any account. If you
474
+ want the response to include transactions from transaction groups, set
475
+ the `include_group_children` query parameter to `true` when filtering
476
+ by plaid accounts.
477
+ recurring_id: int | None
478
+ Filter transactions to those associated with specified Recurring Item ID
479
+ category_id: int | None
480
+ Filter transactions to those associated with the specified category ID.
481
+ Will also match category groups. Set this to 0 to return only
482
+ un-categorized transactions.
483
+ tag_id: int | None
484
+ Filter transactions to those that have a tag with the specified Tag ID.
485
+ is_group_parent: bool | None
486
+ Filter by group (returns only transaction groups if `true`).
487
+ status: str | None
488
+ Filter transactions to those with the specified status:
489
+ - `reviewed`: Only user reviewed transactions or those that were
490
+ automatically marked as reviewed due to reviewed recurring_item logic
491
+ - `unreviewed`: Only transactions that need to be reviewed
492
+ - `delete_pending`: Only transactions that require manual intervention
493
+ because the plaid account deleted this transaction after it was
494
+ updated by the user.
495
+ is_pending: bool | None
496
+ Filter transactions by pending status. Set to `true` to return only
497
+ pending transactions, or `false` to return only non-pending
498
+ transactions. When this parameter is set, it takes precedence over
499
+ `include_pending`. Note: Pending transactions always have a status of
500
+ `unreviewed`, so when setting this parameter to `true`, either omit the
501
+ `status` parameter or set it to `unreviewed`.
502
+ include_pending: bool | None
503
+ By default, pending transactions are excluded from results. Set to
504
+ `true` to include imported transactions with a pending status in the
505
+ results. This query param is ignored if the `is_pending` query param is
506
+ also set.
507
+ include_metadata: bool | None
508
+ By default, custom and plaid metadata are not included in the response.
509
+ Set to true if you'd like the returned transactions objects to include
510
+ any metadata associated with the transactions.
511
+ include_split_parents: bool | None
512
+ By default, transactions that were split into multiple transactions are
513
+ not included in the response. Set to true if you'd like the returned
514
+ transactions objects to include any transactions that were split into
515
+ multiple transactions. Use with caution as this data is normally not
516
+ exposed after the split transactions are created.
517
+ include_group_children: bool | None
518
+ By default, individual transactions that joined into a transaction group
519
+ are not included in the response. Set to true if you'd like the returned
520
+ transactions objects to include any transactions that joined into a
521
+ transaction group.
522
+ include_files: bool | None
523
+ By default, the `files` property is not included in the response. Set to
524
+ true if you'd like the responses to include a list of objects that
525
+ describe any files attached to the transactions.
526
+
527
+ Returns
528
+ -------
529
+ dict[int, TransactionObject]
530
+ Dictionary of Transactions keyed by Transaction ID
531
+ """
532
+ kwargs: dict[str, Any] = {
533
+ "start_date": start_date,
534
+ "end_date": end_date,
535
+ "created_since": created_since,
536
+ "updated_since": updated_since,
537
+ "manual_account_id": manual_account_id,
538
+ "plaid_account_id": plaid_account_id,
539
+ "recurring_id": recurring_id,
540
+ "category_id": category_id,
541
+ "tag_id": tag_id,
542
+ "is_group_parent": is_group_parent,
543
+ "status": status,
544
+ "is_pending": is_pending,
545
+ "include_pending": include_pending,
546
+ "include_metadata": include_metadata,
547
+ "include_split_parents": include_split_parents,
548
+ "include_group_children": include_group_children,
549
+ "include_files": include_files,
550
+ }
551
+ filtered_kwargs: dict[str, Any] = {
552
+ k: v for k, v in kwargs.items() if v is not None
553
+ }
554
+ transaction_map: dict[int, TransactionObject] = {
555
+ obj.id: obj for obj in self._paginate_transactions(**filtered_kwargs)
556
+ }
557
+ logger.info("Refreshed LunchMoney Transactions (%s)", len(transaction_map))
558
+ self.data.transactions.update(transaction_map)
559
+ return transaction_map
560
+
561
+ def _paginate_transactions(
562
+ self, **kwargs: Any
563
+ ) -> Iterable[TransactionObject]:
564
+ """
565
+ Paginate Transactions from the App
566
+ """
567
+ offset = 0
568
+ while True:
569
+ paginated_kwargs = {
570
+ **kwargs,
571
+ "offset": offset,
572
+ "limit": self._transaction_pagination,
573
+ }
574
+ response: GetAllTransactions200Response = (
575
+ self.api.transactions_bulk.get_all_transactions(
576
+ **paginated_kwargs
577
+ )
578
+ )
579
+ for transaction in response.transactions:
580
+ yield transaction
581
+ if not response.has_more:
582
+ break
583
+ offset += self._transaction_pagination
584
+
585
+ def clear_transactions(self) -> None:
586
+ """
587
+ Clear Transactions from the App
588
+ """
589
+ self.data.transactions.clear()
@@ -545,7 +545,7 @@ conf = lunchmoney.Configuration(
545
545
  "OS: {env}\n"\
546
546
  "Python Version: {pyversion}\n"\
547
547
  "Version of the API: 2.8.4\n"\
548
- "SDK Package Version: 2.17.0".\
548
+ "SDK Package Version: 2.18.0".\
549
549
  format(env=sys.platform, pyversion=sys.version)
550
550
 
551
551
  def get_host_settings(self) -> List[HostSetting]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lunchmoney-python
3
- Version: 2.17.0
3
+ Version: 2.18.0
4
4
  Summary: Lunch Money API - v2
5
5
  Home-page:
6
6
  Author: OpenAPI Generator community
@@ -55,7 +55,7 @@ If you have been providing feedback on the API during our iterative design proce
55
55
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
56
56
 
57
57
  - API version: 2.8.4
58
- - Package version: 2.17.0
58
+ - Package version: 2.18.0
59
59
  - Generator version: 7.17.0
60
60
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
61
61
 
@@ -5,6 +5,7 @@ setup.py
5
5
  lunchmoney/__init__.py
6
6
  lunchmoney/api_client.py
7
7
  lunchmoney/api_response.py
8
+ lunchmoney/app.py
8
9
  lunchmoney/configuration.py
9
10
  lunchmoney/exceptions.py
10
11
  lunchmoney/py.typed
@@ -99,6 +100,7 @@ test/test_account_type_enum.py
99
100
  test/test_aligned_category_totals_object.py
100
101
  test/test_aligned_summary_category_object.py
101
102
  test/test_aligned_summary_response_object.py
103
+ test/test_app.py
102
104
  test/test_categories_api.py
103
105
  test/test_category_object.py
104
106
  test/test_child_category_object.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lunchmoney-python"
3
- version = "2.17.0"
3
+ version = "2.18.0"
4
4
  description = "Lunch Money API - v2"
5
5
  authors = [
6
6
  {name = "OpenAPI Generator Community",email = "devsupport@lunchmoney.app"},