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.
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/PKG-INFO +9 -9
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/pyproject.toml +9 -9
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/scrollable_control.py +18 -3
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/session.py +4 -2
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/flet_test_app.py +92 -10
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/version.py +3 -1
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/PKG-INFO +9 -9
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/requires.txt +8 -8
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/README.md +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/setup.cfg +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/app.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/authorization.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/authorization_service.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/group.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/oauth_provider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/oauth_token.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/auth0_oauth_provider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/azure_oauth_provider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/github_oauth_provider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/providers/google_oauth_provider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/auth/user.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/canvas/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/cli.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component_decorator.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/component_owned.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/hook.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_callback.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_context.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_dialog.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_effect.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_memo.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_ref.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/hooks/use_state.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/memo.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/observable.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/public_utils.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/router.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/components/utils.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/adaptive_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/alignment.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/animation.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/base_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/base_page.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/blur.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/border.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/border_radius.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/box.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/buttons.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/colors.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/context.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control_event.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/control_state.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/animated_switcher.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/autofill_group.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/arc.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/canvas.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/circle.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/color.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/fill.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/image.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/line.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/oval.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/path.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/points.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/rect.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/shadow.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/shape.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/canvas/text.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/column.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/dismissible.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/drag_target.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/draggable.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/flet_app.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/gesture_detector.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/grid_view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/hero.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/icon.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/image.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/interactive_viewer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/keyboard_listener.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/list_view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/markdown.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/merge_semantics.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/page_view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/pagelet.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/placeholder.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/reorderable_drag_handle.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/responsive_row.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/rotated_box.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/row.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/safe_area.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/screenshot.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/semantics.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/shader_mask.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/shimmer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/stack.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/text.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/text_span.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/transparent_pointer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/window.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/core/window_drag_area.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_action_sheet_action.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_activity_indicator.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_alert_dialog.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_app_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_bottom_sheet.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_checkbox.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_colors.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_context_menu_action.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_date_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_dialog_action.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_filled_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.json +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_icons.pyi +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_list_tile.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_navigation_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_radio.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_segmented_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_slider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_sliding_segmented_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_switch.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_textfield.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_timer_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/cupertino/cupertino_tinted_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/device_info.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/dialog_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/duration.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/embed_json_encoder.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/events.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/exceptions.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/geometry.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/gradients.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/icon_data.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/id_counter.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/keys.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/layout_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/margin.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/alert_dialog.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/app_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/auto_complete.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/badge.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/banner.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/bottom_app_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/bottom_sheet.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/card.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/checkbox.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/chip.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/circle_avatar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/container.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/context_menu.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/datatable.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/date_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/date_range_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/divider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/dropdown.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/dropdownm2.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/elevated_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/expansion_panel.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/expansion_tile.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/filled_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/filled_tonal_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/floating_action_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/form_field_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icon_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.json +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/icons.pyi +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/list_tile.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/menu_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/menu_item_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_drawer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/navigation_rail.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/outlined_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/popup_menu_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/progress_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/progress_ring.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/radio.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/radio_group.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/range_slider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/reorderable_list_view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/search_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/segmented_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/selection_area.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/slider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/snack_bar.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/submenu_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/switch.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/tabs.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/text_button.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/textfield.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/time_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/tooltip.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/material/vertical_divider.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/multi_view.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/object_patch.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/padding.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/page.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/painting.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/query_string.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/ref.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/accelerometer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/barometer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/battery.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/browser_context_menu.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/clipboard.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/connectivity.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/file_picker.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/gyroscope.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/haptic_feedback.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/magnetometer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/screen_brightness.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/semantics_service.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/sensor_error_event.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/service.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/shake_detector.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/share.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/shared_preferences.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/storage_paths.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/url_launcher.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/user_accelerometer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/services/wakelock.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/template_route.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/text_style.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/theme.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/transform.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/types.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/controls/value_types.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/data_channel.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/fastapi/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/connection.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/flet_dart_bridge_server.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/flet_socket_server.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/protocol.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/pyodide_connection.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/messaging/session_store.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/pubsub_client.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pubsub/pubsub_hub.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/py.typed +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/pytest_plugin.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/security/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/finder.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/remote_tester.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/testing/tester.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/__init__.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/browser.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/classproperty.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/deprecated.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/deprecated_enum.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/files.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/from_dict.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/griffe_deprecations.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/hashing.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/json_utils.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/locks.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/network.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/object_model.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/once.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/pip.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/platform_utils.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/slugify.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/strings.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/typing_utils.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/validation.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet/utils/vector.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/SOURCES.txt +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/dependency_links.txt +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/entry_points.txt +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/src/flet.egg-info/top_level.txt +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_auth_lazy_imports.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_base_control.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_colors.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_diff.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_effects.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_component_renderer.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_dataclasses.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_datetime.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_deprecated.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_events.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_from_dict.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_griffe_deprecations.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_icons.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_frozen.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_in_place.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_memory_churn.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_object_diff_performance.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_observable.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_patch_dataclass.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_modal.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_pop.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_router_recursive.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_session_disconnect_buffering.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_skip_double_update.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_use_dialog.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_validation.py +0 -0
- {flet-0.86.0.dev1 → flet-0.86.0.dev2}/tests/test_validation_benchmark.py +0 -0
- {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.
|
|
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.
|
|
13
|
-
Requires-Dist: flet-web==0.86.0.
|
|
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.
|
|
21
|
-
Requires-Dist: flet-web==0.86.0.
|
|
22
|
-
Requires-Dist: flet-desktop==0.86.0.
|
|
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.
|
|
24
|
+
Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==0.86.0.
|
|
26
|
+
Requires-Dist: flet-desktop==0.86.0.dev2; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==0.86.0.
|
|
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.
|
|
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.
|
|
11
|
-
"flet-web==0.86.0.
|
|
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.
|
|
27
|
-
"flet-web==0.86.0.
|
|
28
|
-
"flet-desktop==0.86.0.
|
|
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.
|
|
30
|
+
cli = ["flet-cli==0.86.0.dev2"]
|
|
31
31
|
desktop = [
|
|
32
|
-
"flet-desktop==0.86.0.
|
|
32
|
+
"flet-desktop==0.86.0.dev2",
|
|
33
33
|
]
|
|
34
|
-
web = ["flet-web==0.86.0.
|
|
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
|
|
355
|
-
|
|
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
|
|
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
|
|
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
|
|
260
|
-
|
|
261
|
-
|
|
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
|
-
|
|
267
|
-
|
|
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
|
-
|
|
424
|
-
ft.
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
13
|
-
Requires-Dist: flet-web==0.86.0.
|
|
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.
|
|
21
|
-
Requires-Dist: flet-web==0.86.0.
|
|
22
|
-
Requires-Dist: flet-desktop==0.86.0.
|
|
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.
|
|
24
|
+
Requires-Dist: flet-cli==0.86.0.dev2; extra == "cli"
|
|
25
25
|
Provides-Extra: desktop
|
|
26
|
-
Requires-Dist: flet-desktop==0.86.0.
|
|
26
|
+
Requires-Dist: flet-desktop==0.86.0.dev2; extra == "desktop"
|
|
27
27
|
Provides-Extra: web
|
|
28
|
-
Requires-Dist: flet-web==0.86.0.
|
|
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.
|
|
5
|
+
flet-cli==0.86.0.dev2
|
|
6
6
|
|
|
7
7
|
[:extra == "web"]
|
|
8
|
-
flet-web==0.86.0.
|
|
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.
|
|
19
|
-
flet-web==0.86.0.
|
|
20
|
-
flet-desktop==0.86.0.
|
|
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.
|
|
23
|
+
flet-cli==0.86.0.dev2
|
|
24
24
|
|
|
25
25
|
[desktop]
|
|
26
|
-
flet-desktop==0.86.0.
|
|
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.
|
|
36
|
+
flet-web==0.86.0.dev2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|