flet 0.86.0.dev1__tar.gz → 0.86.0.dev2__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 (319) hide show
  1. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/PKG-INFO +9 -9
  2. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/pyproject.toml +9 -9
  3. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/scrollable_control.py +18 -3
  4. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/session.py +4 -2
  5. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/flet_test_app.py +92 -10
  6. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/version.py +3 -1
  7. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/PKG-INFO +9 -9
  8. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/requires.txt +8 -8
  9. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/README.md +0 -0
  10. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/setup.cfg +0 -0
  11. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/__init__.py +0 -0
  12. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/app.py +0 -0
  13. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/__init__.py +0 -0
  14. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/authorization.py +0 -0
  15. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/authorization_service.py +0 -0
  16. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/group.py +0 -0
  17. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/oauth_provider.py +0 -0
  18. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/oauth_token.py +0 -0
  19. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/__init__.py +0 -0
  20. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
  21. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
  22. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/github_oauth_provider.py +0 -0
  23. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/google_oauth_provider.py +0 -0
  24. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/user.py +0 -0
  25. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/canvas/__init__.py +0 -0
  26. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/cli.py +0 -0
  27. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/__init__.py +0 -0
  28. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component.py +0 -0
  29. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component_decorator.py +0 -0
  30. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component_owned.py +0 -0
  31. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/__init__.py +0 -0
  32. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/hook.py +0 -0
  33. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_callback.py +0 -0
  34. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_context.py +0 -0
  35. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_dialog.py +0 -0
  36. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_effect.py +0 -0
  37. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_memo.py +0 -0
  38. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_ref.py +0 -0
  39. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_state.py +0 -0
  40. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/memo.py +0 -0
  41. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/observable.py +0 -0
  42. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/public_utils.py +0 -0
  43. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/router.py +0 -0
  44. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/utils.py +0 -0
  45. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/__init__.py +0 -0
  46. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/adaptive_control.py +0 -0
  47. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/alignment.py +0 -0
  48. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/animation.py +0 -0
  49. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/base_control.py +0 -0
  50. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/base_page.py +0 -0
  51. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/blur.py +0 -0
  52. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/border.py +0 -0
  53. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/border_radius.py +0 -0
  54. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/box.py +0 -0
  55. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/buttons.py +0 -0
  56. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/colors.py +0 -0
  57. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/context.py +0 -0
  58. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control.py +0 -0
  59. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control_event.py +0 -0
  60. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control_state.py +0 -0
  61. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/__init__.py +0 -0
  62. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/animated_switcher.py +0 -0
  63. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/autofill_group.py +0 -0
  64. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/__init__.py +0 -0
  65. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/arc.py +0 -0
  66. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/canvas.py +0 -0
  67. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/circle.py +0 -0
  68. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/color.py +0 -0
  69. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/fill.py +0 -0
  70. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/image.py +0 -0
  71. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/line.py +0 -0
  72. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/oval.py +0 -0
  73. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/path.py +0 -0
  74. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/points.py +0 -0
  75. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/rect.py +0 -0
  76. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/shadow.py +0 -0
  77. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/shape.py +0 -0
  78. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/text.py +0 -0
  79. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/column.py +0 -0
  80. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/dismissible.py +0 -0
  81. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/drag_target.py +0 -0
  82. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/draggable.py +0 -0
  83. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/flet_app.py +0 -0
  84. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/gesture_detector.py +0 -0
  85. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/grid_view.py +0 -0
  86. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/hero.py +0 -0
  87. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/icon.py +0 -0
  88. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/image.py +0 -0
  89. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/interactive_viewer.py +0 -0
  90. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/keyboard_listener.py +0 -0
  91. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/list_view.py +0 -0
  92. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/markdown.py +0 -0
  93. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/merge_semantics.py +0 -0
  94. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/page_view.py +0 -0
  95. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/pagelet.py +0 -0
  96. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/placeholder.py +0 -0
  97. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
  98. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/responsive_row.py +0 -0
  99. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/rotated_box.py +0 -0
  100. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/row.py +0 -0
  101. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/safe_area.py +0 -0
  102. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/screenshot.py +0 -0
  103. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/semantics.py +0 -0
  104. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/shader_mask.py +0 -0
  105. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/shimmer.py +0 -0
  106. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/stack.py +0 -0
  107. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/text.py +0 -0
  108. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/text_span.py +0 -0
  109. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/transparent_pointer.py +0 -0
  110. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/view.py +0 -0
  111. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/window.py +0 -0
  112. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/window_drag_area.py +0 -0
  113. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/__init__.py +0 -0
  114. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
  115. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
  116. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
  117. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
  118. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
  119. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
  120. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_button.py +0 -0
  121. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
  122. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
  123. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
  124. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
  125. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
  126. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
  127. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
  128. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
  129. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
  130. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
  131. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
  132. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
  133. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
  134. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
  135. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
  136. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
  137. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
  138. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
  139. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
  140. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
  141. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
  142. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/device_info.py +0 -0
  143. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/dialog_control.py +0 -0
  144. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/duration.py +0 -0
  145. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/embed_json_encoder.py +0 -0
  146. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/events.py +0 -0
  147. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/exceptions.py +0 -0
  148. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/geometry.py +0 -0
  149. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/gradients.py +0 -0
  150. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/icon_data.py +0 -0
  151. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/id_counter.py +0 -0
  152. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/keys.py +0 -0
  153. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/layout_control.py +0 -0
  154. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/margin.py +0 -0
  155. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/__init__.py +0 -0
  156. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/alert_dialog.py +0 -0
  157. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/app_bar.py +0 -0
  158. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/auto_complete.py +0 -0
  159. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/badge.py +0 -0
  160. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/banner.py +0 -0
  161. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/bottom_app_bar.py +0 -0
  162. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/bottom_sheet.py +0 -0
  163. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/button.py +0 -0
  164. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/card.py +0 -0
  165. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/checkbox.py +0 -0
  166. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/chip.py +0 -0
  167. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/circle_avatar.py +0 -0
  168. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/container.py +0 -0
  169. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/context_menu.py +0 -0
  170. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/datatable.py +0 -0
  171. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/date_picker.py +0 -0
  172. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/date_range_picker.py +0 -0
  173. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/divider.py +0 -0
  174. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/dropdown.py +0 -0
  175. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/dropdownm2.py +0 -0
  176. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/elevated_button.py +0 -0
  177. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/expansion_panel.py +0 -0
  178. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/expansion_tile.py +0 -0
  179. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/filled_button.py +0 -0
  180. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/filled_tonal_button.py +0 -0
  181. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/floating_action_button.py +0 -0
  182. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/form_field_control.py +0 -0
  183. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icon_button.py +0 -0
  184. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.json +0 -0
  185. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.py +0 -0
  186. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.pyi +0 -0
  187. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/list_tile.py +0 -0
  188. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/menu_bar.py +0 -0
  189. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/menu_item_button.py +0 -0
  190. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_bar.py +0 -0
  191. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_drawer.py +0 -0
  192. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_rail.py +0 -0
  193. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/outlined_button.py +0 -0
  194. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/popup_menu_button.py +0 -0
  195. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/progress_bar.py +0 -0
  196. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/progress_ring.py +0 -0
  197. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/radio.py +0 -0
  198. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/radio_group.py +0 -0
  199. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/range_slider.py +0 -0
  200. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/reorderable_list_view.py +0 -0
  201. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/search_bar.py +0 -0
  202. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/segmented_button.py +0 -0
  203. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/selection_area.py +0 -0
  204. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/slider.py +0 -0
  205. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/snack_bar.py +0 -0
  206. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/submenu_button.py +0 -0
  207. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/switch.py +0 -0
  208. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/tabs.py +0 -0
  209. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/text_button.py +0 -0
  210. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/textfield.py +0 -0
  211. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/time_picker.py +0 -0
  212. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/tooltip.py +0 -0
  213. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/vertical_divider.py +0 -0
  214. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/multi_view.py +0 -0
  215. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/object_patch.py +0 -0
  216. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/padding.py +0 -0
  217. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/page.py +0 -0
  218. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/painting.py +0 -0
  219. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/query_string.py +0 -0
  220. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/ref.py +0 -0
  221. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/__init__.py +0 -0
  222. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/accelerometer.py +0 -0
  223. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/barometer.py +0 -0
  224. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/battery.py +0 -0
  225. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/browser_context_menu.py +0 -0
  226. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/clipboard.py +0 -0
  227. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/connectivity.py +0 -0
  228. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/file_picker.py +0 -0
  229. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/gyroscope.py +0 -0
  230. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/haptic_feedback.py +0 -0
  231. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/magnetometer.py +0 -0
  232. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/screen_brightness.py +0 -0
  233. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/semantics_service.py +0 -0
  234. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/sensor_error_event.py +0 -0
  235. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/service.py +0 -0
  236. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/shake_detector.py +0 -0
  237. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/share.py +0 -0
  238. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/shared_preferences.py +0 -0
  239. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/storage_paths.py +0 -0
  240. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/url_launcher.py +0 -0
  241. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/user_accelerometer.py +0 -0
  242. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/wakelock.py +0 -0
  243. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/template_route.py +0 -0
  244. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/text_style.py +0 -0
  245. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/theme.py +0 -0
  246. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/transform.py +0 -0
  247. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/types.py +0 -0
  248. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/value_types.py +0 -0
  249. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/data_channel.py +0 -0
  250. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/fastapi/__init__.py +0 -0
  251. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/connection.py +0 -0
  252. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/flet_dart_bridge_server.py +0 -0
  253. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/flet_socket_server.py +0 -0
  254. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/protocol.py +0 -0
  255. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/pyodide_connection.py +0 -0
  256. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/session_store.py +0 -0
  257. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/__init__.py +0 -0
  258. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/pubsub_client.py +0 -0
  259. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/pubsub_hub.py +0 -0
  260. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/py.typed +0 -0
  261. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pytest_plugin.py +0 -0
  262. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/security/__init__.py +0 -0
  263. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/__init__.py +0 -0
  264. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/finder.py +0 -0
  265. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/remote_tester.py +0 -0
  266. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/tester.py +0 -0
  267. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/__init__.py +0 -0
  268. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/browser.py +0 -0
  269. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/classproperty.py +0 -0
  270. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/deprecated.py +0 -0
  271. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/deprecated_enum.py +0 -0
  272. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/files.py +0 -0
  273. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/from_dict.py +0 -0
  274. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/griffe_deprecations.py +0 -0
  275. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/hashing.py +0 -0
  276. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/json_utils.py +0 -0
  277. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/locks.py +0 -0
  278. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/network.py +0 -0
  279. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/object_model.py +0 -0
  280. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/once.py +0 -0
  281. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/pip.py +0 -0
  282. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/platform_utils.py +0 -0
  283. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/slugify.py +0 -0
  284. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/strings.py +0 -0
  285. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/typing_utils.py +0 -0
  286. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/validation.py +0 -0
  287. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/vector.py +0 -0
  288. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/SOURCES.txt +0 -0
  289. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/dependency_links.txt +0 -0
  290. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/entry_points.txt +0 -0
  291. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/top_level.txt +0 -0
  292. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_auth_lazy_imports.py +0 -0
  293. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_base_control.py +0 -0
  294. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_colors.py +0 -0
  295. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_diff.py +0 -0
  296. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_effects.py +0 -0
  297. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_renderer.py +0 -0
  298. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_dataclasses.py +0 -0
  299. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_datetime.py +0 -0
  300. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_deprecated.py +0 -0
  301. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_events.py +0 -0
  302. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_from_dict.py +0 -0
  303. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_griffe_deprecations.py +0 -0
  304. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_icons.py +0 -0
  305. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_frozen.py +0 -0
  306. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_in_place.py +0 -0
  307. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_memory_churn.py +0 -0
  308. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_performance.py +0 -0
  309. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_observable.py +0 -0
  310. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_patch_dataclass.py +0 -0
  311. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_modal.py +0 -0
  312. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_pop.py +0 -0
  313. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_recursive.py +0 -0
  314. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_session_disconnect_buffering.py +0 -0
  315. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_skip_double_update.py +0 -0
  316. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_use_dialog.py +0 -0
  317. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_validation.py +0 -0
  318. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_validation_benchmark.py +0 -0
  319. {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.86.0.dev1
3
+ Version: 0.86.0.dev2
4
4
  Summary: Flet for Python - easily build interactive multi-platform apps in Python
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://flet.dev/docs/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "cli"
13
- Requires-Dist: flet-web==0.86.0.dev1; extra == "web"
12
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
13
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "web"
14
14
  Requires-Dist: oauthlib>=3.2.2; platform_system != "Emscripten"
15
15
  Requires-Dist: httpx>=0.28.1; platform_system != "Emscripten"
16
16
  Requires-Dist: repath>=0.9.0
17
17
  Requires-Dist: msgpack>=1.1.0
18
18
  Requires-Dist: typing-extensions; python_version < "3.11"
19
19
  Provides-Extra: all
20
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "all"
21
- Requires-Dist: flet-web==0.86.0.dev1; extra == "all"
22
- Requires-Dist: flet-desktop==0.86.0.dev1; extra == "all"
20
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "all"
21
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "all"
22
+ Requires-Dist: flet-desktop==0.86.0.dev2; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "cli"
24
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.86.0.dev1; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.86.0.dev2; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.86.0.dev1; extra == "web"
28
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "web"
29
29
  Provides-Extra: test
30
30
  Requires-Dist: pytest>=7.2.0; extra == "test"
31
31
  Requires-Dist: pytest-asyncio>=1.1.0; extra == "test"
@@ -1,14 +1,14 @@
1
1
  [project]
2
2
  name = "flet"
3
- version = "0.86.0.dev1"
3
+ version = "0.86.0.dev2"
4
4
  description = "Flet for Python - easily build interactive multi-platform apps in Python"
5
5
  authors = [{name = "Appveyor Systems Inc.", email = "hello@flet.dev"}]
6
6
  license = "Apache-2.0"
7
7
  readme = "README.md"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
- "flet-cli==0.86.0.dev1; extra == 'cli'",
11
- "flet-web==0.86.0.dev1; extra == 'web'",
10
+ "flet-cli==0.86.0.dev2; extra == 'cli'",
11
+ "flet-web==0.86.0.dev2; extra == 'web'",
12
12
  "oauthlib >=3.2.2; platform_system != 'Emscripten'",
13
13
  "httpx >=0.28.1; platform_system != 'Emscripten'",
14
14
  "repath >=0.9.0",
@@ -23,15 +23,15 @@ Documentation = "https://flet.dev/docs/"
23
23
 
24
24
  [project.optional-dependencies]
25
25
  all = [
26
- "flet-cli==0.86.0.dev1",
27
- "flet-web==0.86.0.dev1",
28
- "flet-desktop==0.86.0.dev1",
26
+ "flet-cli==0.86.0.dev2",
27
+ "flet-web==0.86.0.dev2",
28
+ "flet-desktop==0.86.0.dev2",
29
29
  ]
30
- cli = ["flet-cli==0.86.0.dev1"]
30
+ cli = ["flet-cli==0.86.0.dev2"]
31
31
  desktop = [
32
- "flet-desktop==0.86.0.dev1",
32
+ "flet-desktop==0.86.0.dev2",
33
33
  ]
34
- web = ["flet-web==0.86.0.dev1"]
34
+ web = ["flet-web==0.86.0.dev2"]
35
35
  # Dependencies needed to run integration tests written with `flet.testing`
36
36
  # (the `flet test` command / the pytest plugin). Pillow/numpy/scikit-image
37
37
  # back screenshot and GIF comparison.
@@ -2,7 +2,7 @@ from dataclasses import dataclass
2
2
  from enum import Enum
3
3
  from typing import Optional, Union
4
4
 
5
- from flet.controls.animation import AnimationCurve
5
+ from flet.controls.animation import AnimationCurve, AnimationValue
6
6
  from flet.controls.base_control import control
7
7
  from flet.controls.control import Control
8
8
  from flet.controls.control_event import Event, EventHandler
@@ -351,13 +351,28 @@ class ScrollableControl(Control):
351
351
 
352
352
  auto_scroll: bool = False
353
353
  """
354
- Whether the scrollbar should automatically move its position to the end when \
355
- children updated.
354
+ Whether to automatically move the scroll position to the end when the content
355
+ changes.
356
+
357
+ This keeps the view pinned to the end as new children are added *and* as
358
+ existing content grows in place (e.g. text streamed into an existing child).
359
+ Pinning is suspended while the user has scrolled away from the end, and
360
+ resumes once they scroll back.
356
361
 
357
362
  Note:
358
363
  Must be `False` for :meth:`scroll_to` method to work.
359
364
  """
360
365
 
366
+ auto_scroll_animation: Optional[AnimationValue] = None
367
+ """
368
+ Animation used when :attr:`auto_scroll` moves the view to the end.
369
+
370
+ Accepts an :class:`~flet.Animation` (duration + curve), an `int` duration in
371
+ milliseconds, or `True`. Defaults to a 1 second `ease` animation; set a
372
+ duration of `0` for an instant jump (recommended when following fast,
373
+ token-by-token streaming so the view stays tightly pinned).
374
+ """
375
+
361
376
  scroll_interval: Number = 10
362
377
  """
363
378
  Throttling in milliseconds for :attr:`on_scroll` event.
@@ -247,8 +247,9 @@ class Session:
247
247
  for c in removed_controls:
248
248
  patch_logger.debug(" %s", c)
249
249
 
250
+ added_ids = {added_control._i for added_control in added_controls}
250
251
  for removed_control in removed_controls:
251
- if not any(added._i == removed_control._i for added in added_controls):
252
+ if removed_control._i not in added_ids:
252
253
  removed_control.will_unmount()
253
254
  self.__index.pop(removed_control._i, None)
254
255
 
@@ -264,9 +265,10 @@ class Session:
264
265
  for ac in added_controls:
265
266
  patch_logger.debug(" %s", ac)
266
267
 
268
+ removed_ids = {removed_control._i for removed_control in removed_controls}
267
269
  for added_control in added_controls:
268
270
  self.__index[added_control._i] = added_control
269
- if not any(removed._i == added_control._i for removed in removed_controls):
271
+ if added_control._i not in removed_ids:
270
272
  added_control.did_mount()
271
273
 
272
274
  def apply_patch(self, control_id: int, patch: dict[str, Any]):
@@ -175,6 +175,8 @@ class FletTestApp:
175
175
  self.__assets_dir = assets_dir or "assets"
176
176
  self.__tcp_port = tcp_port
177
177
  self.__flutter_process: Optional[asyncio.subprocess.Process] = None
178
+ self.__flutter_output = bytearray()
179
+ self.__flutter_output_task: Optional[asyncio.Task] = None
178
180
  self.__page = None
179
181
  self.__tester: Union[Tester, RemoteTester, None] = None
180
182
 
@@ -256,15 +258,14 @@ class FletTestApp:
256
258
  print("Started Flet app")
257
259
 
258
260
  # Stream the Flutter test process output to the console when verbose
259
- # (set by `flet test -v`) or when debug logging is on; otherwise hide it.
260
- stdout = asyncio.subprocess.DEVNULL
261
- stderr = asyncio.subprocess.DEVNULL
262
- if (
261
+ # (set by `flet test -v`) or when debug logging is on; otherwise
262
+ # capture it into a buffer so it can be dumped if the process fails.
263
+ verbose = (
263
264
  get_bool_env_var("FLET_TEST_VERBOSE")
264
265
  or logging.getLogger().getEffectiveLevel() == logging.DEBUG
265
- ):
266
- stdout = None
267
- stderr = None
266
+ )
267
+ stdout = None if verbose else asyncio.subprocess.PIPE
268
+ stderr = None if verbose else asyncio.subprocess.STDOUT
268
269
 
269
270
  # The resolved Flutter executable (full path, `flutter.bat` on Windows)
270
271
  # is passed by `flet test`; fall back to a bare "flutter" on PATH.
@@ -320,6 +321,11 @@ class FletTestApp:
320
321
  stderr=stderr,
321
322
  )
322
323
 
324
+ if self.__flutter_process.stdout is not None:
325
+ self.__flutter_output_task = asyncio.create_task(
326
+ self.__read_flutter_output(self.__flutter_process.stdout)
327
+ )
328
+
323
329
  print("Started Flutter test process.")
324
330
  print("Waiting for the Flutter app to connect...")
325
331
 
@@ -331,11 +337,54 @@ class FletTestApp:
331
337
  while not connected():
332
338
  await asyncio.sleep(0.2)
333
339
  if self.__flutter_process.returncode is not None:
340
+ self.__dump_flutter_output()
334
341
  raise RuntimeError(
335
342
  "Flutter process exited early with code "
336
343
  f"{self.__flutter_process.returncode}"
337
344
  )
338
345
 
346
+ async def __read_flutter_output(self, stream: asyncio.StreamReader):
347
+ # Read in chunks, not lines: the Flet client's debug output includes
348
+ # very long lines (e.g. screenshot bytes) that overflow StreamReader's
349
+ # per-line limit. Overlong lines are cut and only the output tail is
350
+ # kept to bound memory.
351
+ line = bytearray()
352
+ truncated = False
353
+ while True:
354
+ chunk = await stream.read(65536)
355
+ if not chunk:
356
+ break
357
+ for part in chunk.splitlines(keepends=True):
358
+ line.extend(part)
359
+ if line.endswith((b"\n", b"\r")):
360
+ self.__append_flutter_output_line(line, truncated)
361
+ line.clear()
362
+ truncated = False
363
+ elif len(line) > self.__flutter_output_line_limit:
364
+ del line[self.__flutter_output_line_limit :]
365
+ truncated = True
366
+ if line:
367
+ self.__append_flutter_output_line(line, truncated)
368
+
369
+ def __append_flutter_output_line(self, line: bytearray, truncated: bool):
370
+ if len(line) > self.__flutter_output_line_limit:
371
+ line = line[: self.__flutter_output_line_limit]
372
+ truncated = True
373
+ self.__flutter_output.extend(line.rstrip(b"\r\n"))
374
+ if truncated:
375
+ self.__flutter_output.extend(b" ...<truncated>")
376
+ self.__flutter_output.extend(b"\n")
377
+ if len(self.__flutter_output) > self.__flutter_output_limit:
378
+ del self.__flutter_output[: -self.__flutter_output_limit]
379
+
380
+ def __dump_flutter_output(self):
381
+ if not self.__flutter_output:
382
+ return
383
+ output = self.__flutter_output.decode(errors="replace")
384
+ print("---------- Flutter test process output (tail) ----------")
385
+ print(output)
386
+ print("---------- End of Flutter test process output ----------")
387
+
339
388
  def __flutter_test_target(self) -> str:
340
389
  # In device mode the driver (`integration_test/app_test.dart`) is
341
390
  # generated from the template; validate it exists and is non-empty so a
@@ -383,6 +432,12 @@ class FletTestApp:
383
432
  print("Force killing Flutter test process...")
384
433
  self.__flutter_process.kill()
385
434
 
435
+ if self.__flutter_output_task:
436
+ try:
437
+ await asyncio.wait_for(self.__flutter_output_task, timeout=5)
438
+ except asyncio.TimeoutError:
439
+ self.__flutter_output_task.cancel()
440
+
386
441
  # Stop the RemoteTester socket server (device mode).
387
442
  if isinstance(self.__tester, RemoteTester):
388
443
  await self.__tester.stop()
@@ -392,6 +447,7 @@ class FletTestApp:
392
447
  # `testWidgets` body even though our find/tap assertions passed). Surface
393
448
  # that as a test failure — otherwise the run is falsely green.
394
449
  if flutter_returncode is not None and flutter_returncode != 0:
450
+ self.__dump_flutter_output()
395
451
  raise RuntimeError(
396
452
  f"Flutter integration test process failed with exit code "
397
453
  f"{flutter_returncode}. See the Flutter test output above."
@@ -420,8 +476,10 @@ class FletTestApp:
420
476
  """
421
477
  controls = list(self.page.controls)
422
478
  self.page.controls = [
423
- scr := ft.Screenshot(
424
- ft.Column(controls, margin=margin, intrinsic_width=True)
479
+ self.__scrollable_screenshot_host(
480
+ scr := ft.Screenshot(
481
+ ft.Column(controls, margin=margin, intrinsic_width=True)
482
+ )
425
483
  )
426
484
  ] # type: ignore
427
485
  self.page.update()
@@ -470,7 +528,11 @@ class FletTestApp:
470
528
 
471
529
  # add control and take screenshot
472
530
  screenshot = ft.Screenshot(control, expand=expand_screenshot)
473
- self.page.add(screenshot)
531
+ self.page.add(
532
+ screenshot
533
+ if expand_screenshot
534
+ else self.__scrollable_screenshot_host(screenshot)
535
+ )
474
536
  await self.__pump_and_settle_with_timeout("assert_control_screenshot-add")
475
537
  for _ in range(0, pump_times):
476
538
  await self.tester.pump(duration=pump_duration)
@@ -480,6 +542,24 @@ class FletTestApp:
480
542
  similarity_threshold=similarity_threshold,
481
543
  )
482
544
 
545
+ def __scrollable_screenshot_host(
546
+ self, screenshot: ft.Screenshot
547
+ ) -> Union[ft.Screenshot, ft.Column]:
548
+ # A scrollable page cannot overflow; an expanded host inside it would
549
+ # be flex-in-unbounded-height and fail layout instead.
550
+ if self.page.scroll is not None:
551
+ return screenshot
552
+ # Host the screenshot in a scrollable column: content taller than the
553
+ # window then scrolls instead of overflowing the page (an overflow
554
+ # error fails the Flutter test process). The child sees the same
555
+ # unbounded-height constraints as in the page column, so captures are
556
+ # unaffected.
557
+ return ft.Column(
558
+ expand=True,
559
+ scroll=ft.ScrollMode.HIDDEN,
560
+ controls=[screenshot],
561
+ )
562
+
483
563
  async def __pump_and_settle_with_timeout(self, stage: str):
484
564
  try:
485
565
  await self.tester.pump_and_settle(timeout=self.__pump_and_settle_timeout)
@@ -849,3 +929,5 @@ class FletTestApp:
849
929
  return min(similarities), None
850
930
 
851
931
  __pump_and_settle_timeout = 10.0
932
+ __flutter_output_limit = 262144
933
+ __flutter_output_line_limit = 2048
@@ -16,7 +16,7 @@ __all__ = [
16
16
  ]
17
17
 
18
18
  # set by CI
19
- flet_version = "0.86.0.dev1"
19
+ flet_version = "0.86.0.dev2"
20
20
  """
21
21
  The Flet version in use.
22
22
 
@@ -54,6 +54,8 @@ def from_git() -> Optional[str]:
54
54
  capture_output=True,
55
55
  text=True,
56
56
  check=True,
57
+ # Prevent console-window-flashes per git invocation on Windows.
58
+ creationflags=sp.CREATE_NO_WINDOW if is_windows() else 0,
57
59
  )
58
60
  tag = result.stdout.strip()
59
61
  return tag[1:] if tag.startswith("v") else tag
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet
3
- Version: 0.86.0.dev1
3
+ Version: 0.86.0.dev2
4
4
  Summary: Flet for Python - easily build interactive multi-platform apps in Python
5
5
  Author-email: "Appveyor Systems Inc." <hello@flet.dev>
6
6
  License-Expression: Apache-2.0
@@ -9,23 +9,23 @@ Project-URL: Repository, https://github.com/flet-dev/flet
9
9
  Project-URL: Documentation, https://flet.dev/docs/
10
10
  Requires-Python: >=3.10
11
11
  Description-Content-Type: text/markdown
12
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "cli"
13
- Requires-Dist: flet-web==0.86.0.dev1; extra == "web"
12
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
13
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "web"
14
14
  Requires-Dist: oauthlib>=3.2.2; platform_system != "Emscripten"
15
15
  Requires-Dist: httpx>=0.28.1; platform_system != "Emscripten"
16
16
  Requires-Dist: repath>=0.9.0
17
17
  Requires-Dist: msgpack>=1.1.0
18
18
  Requires-Dist: typing-extensions; python_version < "3.11"
19
19
  Provides-Extra: all
20
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "all"
21
- Requires-Dist: flet-web==0.86.0.dev1; extra == "all"
22
- Requires-Dist: flet-desktop==0.86.0.dev1; extra == "all"
20
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "all"
21
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "all"
22
+ Requires-Dist: flet-desktop==0.86.0.dev2; extra == "all"
23
23
  Provides-Extra: cli
24
- Requires-Dist: flet-cli==0.86.0.dev1; extra == "cli"
24
+ Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
25
25
  Provides-Extra: desktop
26
- Requires-Dist: flet-desktop==0.86.0.dev1; extra == "desktop"
26
+ Requires-Dist: flet-desktop==0.86.0.dev2; extra == "desktop"
27
27
  Provides-Extra: web
28
- Requires-Dist: flet-web==0.86.0.dev1; extra == "web"
28
+ Requires-Dist: flet-web==0.86.0.dev2; extra == "web"
29
29
  Provides-Extra: test
30
30
  Requires-Dist: pytest>=7.2.0; extra == "test"
31
31
  Requires-Dist: pytest-asyncio>=1.1.0; extra == "test"
@@ -2,10 +2,10 @@ repath>=0.9.0
2
2
  msgpack>=1.1.0
3
3
 
4
4
  [:extra == "cli"]
5
- flet-cli==0.86.0.dev1
5
+ flet-cli==0.86.0.dev2
6
6
 
7
7
  [:extra == "web"]
8
- flet-web==0.86.0.dev1
8
+ flet-web==0.86.0.dev2
9
9
 
10
10
  [:platform_system != "Emscripten"]
11
11
  oauthlib>=3.2.2
@@ -15,15 +15,15 @@ httpx>=0.28.1
15
15
  typing-extensions
16
16
 
17
17
  [all]
18
- flet-cli==0.86.0.dev1
19
- flet-web==0.86.0.dev1
20
- flet-desktop==0.86.0.dev1
18
+ flet-cli==0.86.0.dev2
19
+ flet-web==0.86.0.dev2
20
+ flet-desktop==0.86.0.dev2
21
21
 
22
22
  [cli]
23
- flet-cli==0.86.0.dev1
23
+ flet-cli==0.86.0.dev2
24
24
 
25
25
  [desktop]
26
- flet-desktop==0.86.0.dev1
26
+ flet-desktop==0.86.0.dev2
27
27
 
28
28
  [test]
29
29
  pytest>=7.2.0
@@ -33,4 +33,4 @@ pillow>=10.3.0
33
33
  scikit-image>=0.25.2
34
34
 
35
35
  [web]
36
- flet-web==0.86.0.dev1
36
+ flet-web==0.86.0.dev2
File without changes
File without changes
File without changes
File without changes