From 3ac84b1a3f541b47121b46a687b78826f8d348f9 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:37:48 -0700 Subject: [PATCH 01/12] docs(repo): simplify README with badges and one-paragraph overview --- README.md | 89 ++++++++++--------------------------------------------- 1 file changed, 15 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 4418c1b..31f005c 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,15 @@ -# PythonNative - -**PythonNative** is a cross-platform toolkit that allows you to create native Android and iOS apps using Python. Inspired by frameworks like React Native and NativeScript, PythonNative provides a Pythonic interface for building native UI elements, handling lifecycle events, and accessing platform-specific APIs. - -## Features - -- **Native UI Components**: Create and manage native buttons, labels, lists, and more, all from Python. -- **Cross-Platform**: Write once, run on both Android and iOS. -- **Lifecycle Management**: Handle app lifecycle events with ease. -- **Native API Access**: Access device features like Camera, Geolocation, and Notifications. -- **Powered by Proven Tools**: PythonNative integrates seamlessly with [Rubicon](https://beeware.org/project/projects/bridges/rubicon/) for iOS and [Chaquopy](https://chaquo.com/chaquopy/) for Android, ensuring robust native performance. - -## Quick Start - -### Installation - -First, install PythonNative via pip: - -```bash -pip install pythonnative -``` - -### Create Your First App - -Initialize a new PythonNative app: - -```bash -pn init my_app -``` - -Your app directory will look like this: - -```text -my_app/ -├── README.md -├── app -│ ├── __init__.py -│ ├── main_page.py -│ └── resources -├── pythonnative.json -├── requirements.txt -└── tests -``` - -### Writing Views - -In PythonNative, everything is a view. Here's a simple example of how to create a main page with a list view: - -```python -import pythonnative as pn - -class MainPage(pn.Page): - def __init__(self, native_instance): - super().__init__(native_instance) - - def on_create(self): - super().on_create() - stack_view = pn.StackView(self.native_instance) - list_data = ["item_{}".format(i) for i in range(100)] - list_view = pn.ListView(self.native_instance, list_data) - stack_view.add_view(list_view) - self.set_root_view(stack_view) -``` - -### Run the app - -```bash -pn run android -pn run ios -``` - -## Documentation - -For detailed guides and API references, visit the [PythonNative documentation](https://docs.pythonnative.com/). +## PythonNative + +[![CI](https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml) +[![Docs](https://github.com/pythonnative/pythonnative/actions/workflows/docs.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/docs.yml) +[![Release](https://github.com/pythonnative/pythonnative/actions/workflows/release.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/release.yml) +[![PyPI - Version](https://img.shields.io/pypi/v/pythonnative)](https://pypi.org/project/pythonnative/) +[![Python Versions](https://img.shields.io/pypi/pyversions/pythonnative)](https://pypi.org/project/pythonnative/) +[![License: MIT](https://img.shields.io/pypi/l/pythonnative)](LICENSE) +[![Docs Site](https://img.shields.io/website?url=https%3A%2F%2Fdocs.pythonnative.com&label=docs)](https://docs.pythonnative.com/) + +PythonNative is a cross‑platform toolkit for building native Android and iOS +apps in Python. It provides a Pythonic API for native UI components, +lifecycle events, and device capabilities, powered by Rubicon (iOS) and +Chaquopy (Android). For guides, API reference, and examples, see the +[docs](https://docs.pythonnative.com/). From 6962d3881bf091b3494fc2c964f7ea65a99ce606 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Wed, 29 Oct 2025 13:00:14 -0700 Subject: [PATCH 02/12] feat(components,core)!: add layout/styling APIs and fluent setters --- docs/api/component-properties.md | 52 +++++++++ docs/guides/styling.md | 93 ++++++++++++++++ examples/hello-world/app/main_page.py | 20 +--- mkdocs.yml | 2 + src/pythonnative/button.py | 12 ++- src/pythonnative/cli/pn.py | 15 ++- src/pythonnative/label.py | 71 +++++++++++- src/pythonnative/list_view.py | 6 +- src/pythonnative/scroll_view.py | 19 +++- src/pythonnative/stack_view.py | 141 +++++++++++++++++++++++- src/pythonnative/text_field.py | 69 +++++++++++- src/pythonnative/text_view.py | 69 +++++++++++- src/pythonnative/view.py | 150 +++++++++++++++++++++++++- 13 files changed, 683 insertions(+), 36 deletions(-) create mode 100644 docs/api/component-properties.md create mode 100644 docs/guides/styling.md diff --git a/docs/api/component-properties.md b/docs/api/component-properties.md new file mode 100644 index 0000000..2480b13 --- /dev/null +++ b/docs/api/component-properties.md @@ -0,0 +1,52 @@ +## Component Property Reference (v0.4.0) + +This page summarizes common properties and fluent setters added in v0.4.0. Unless noted, methods return `self` for chaining. + +### View (base) + +- `set_background_color(color)` + - Accepts ARGB int or `#RRGGBB` / `#AARRGGBB` string. + +- `set_padding(*, all=None, horizontal=None, vertical=None, left=None, top=None, right=None, bottom=None)` + - Android: applies padding in dp. + - iOS: currently a no-op for most views. + +- `set_margin(*, all=None, horizontal=None, vertical=None, left=None, top=None, right=None, bottom=None)` + - Android: applied when added to `StackView` (LinearLayout) as `LayoutParams` margins (dp). + - iOS: not currently applied. + +- `wrap_in_scroll()` → `ScrollView` + - Returns a `ScrollView` containing this view. + +### ScrollView + +- `ScrollView.wrap(view)` → `ScrollView` + - Class helper to wrap a single child. + +### StackView + +- `set_axis('vertical'|'horizontal')` +- `set_spacing(n)` + - Android: dp via divider drawable. + - iOS: `UIStackView.spacing` (points). +- `set_alignment('fill'|'center'|'leading'|'trailing'|'top'|'bottom')` + - Cross-axis alignment; top/bottom map appropriately for horizontal stacks. + +### Text components + +Applies to `Label`, `TextField`, `TextView`: + +- `set_text(text)` +- `set_text_color(color)` +- `set_text_size(size)` + +Platform notes: +- Android: `setTextColor(int)`, `setTextSize(sp)`. +- iOS: `setTextColor(UIColor)`, `UIFont.systemFont(ofSize:)`. + +### Button + +- `set_title(text)` +- `set_on_click(callback)` + + diff --git a/docs/guides/styling.md b/docs/guides/styling.md new file mode 100644 index 0000000..20de1b2 --- /dev/null +++ b/docs/guides/styling.md @@ -0,0 +1,93 @@ +## Styling + +This guide covers the lightweight styling APIs introduced in v0.4.0. + +The goal is to provide a small, predictable set of cross-platform styling hooks. Some features are Android-only today and will expand over time. + +### Colors + +- Use `set_background_color(color)` on any view. +- Color can be an ARGB int or a hex string like `#RRGGBB` or `#AARRGGBB`. + +```python +stack = pn.StackView().set_background_color("#FFF5F5F5") +``` + +### Padding and Margin + +- `set_padding(...)` is available on all views. + - Android: applies using `View.setPadding` with dp units. + - iOS: currently a no-op for most views; prefer container spacing (`StackView.set_spacing`) and layout. + +- `set_margin(...)` records margins on the child view. + - Android: applied automatically when added to a `StackView` (LinearLayout) via `LayoutParams.setMargins` (dp). + - iOS: not currently applied. + +`set_padding`/`set_margin` accept these parameters (integers): `all`, `horizontal`, `vertical`, `left`, `top`, `right`, `bottom`. Individual sides override group values. + +```python +pn.Label("Name").set_margin(bottom=8) +pn.TextField().set_padding(horizontal=12, vertical=8) +``` + +### Text styling + +Text components expose: +- `set_text(text) -> self` +- `set_text_color(color) -> self` (hex or ARGB int) +- `set_text_size(size) -> self` (sp on Android; pt on iOS via system font) + +Applies to `Label`, `TextField`, and `TextView`. + +```python +pn.Label("Hello").set_text_color("#FF3366").set_text_size(18) +``` + +### StackView layout + +`StackView` (Android LinearLayout / iOS UIStackView) adds configuration helpers: + +- `set_axis('vertical'|'horizontal') -> self` +- `set_spacing(n) -> self` (dp on Android; points on iOS) +- `set_alignment(value) -> self` + - Cross-axis alignment. Supported values: `fill`, `center`, `leading`/`top`, `trailing`/`bottom`. + +```python +form = ( + pn.StackView() + .set_axis('vertical') + .set_spacing(8) + .set_alignment('fill') + .set_padding(all=16) +) +form.add_view(pn.Label("Username").set_margin(bottom=4)) +form.add_view(pn.TextField().set_padding(horizontal=12, vertical=8)) +``` + +### Scroll helpers + +Wrap any view in a `ScrollView` using either approach: + +```python +scroll = pn.ScrollView.wrap(form) +# or +scroll = form.wrap_in_scroll() +``` + +Attach the scroll view as your page root: + +```python +self.set_root_view(scroll) +``` + +### Fluent setters + +Most setters now return `self` for chaining, e.g.: + +```python +pn.Button("Tap me").set_on_click(lambda: print("hi")).set_padding(all=8) +``` + +Note: Where platform limitations exist, the methods are no-ops and still return `self`. + + diff --git a/examples/hello-world/app/main_page.py b/examples/hello-world/app/main_page.py index 032ef3b..ad6f8e6 100644 --- a/examples/hello-world/app/main_page.py +++ b/examples/hello-world/app/main_page.py @@ -15,14 +15,9 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack = pn.StackView() - # Ensure vertical stacking - try: - stack.native_instance.setAxis_(1) # 1 = vertical - except Exception: - pass - stack.add_view(pn.Label("Hello from PythonNative Demo!")) - button = pn.Button("Go to Second Page") + stack = pn.StackView().set_axis("vertical").set_spacing(12).set_alignment("fill").set_padding(all=16) + stack.add_view(pn.Label("Hello from PythonNative Demo!").set_text_size(18)) + button = pn.Button("Go to Second Page").set_padding(vertical=10, horizontal=14) def on_next(): # Visual confirmation that tap worked (iOS only) @@ -37,14 +32,9 @@ def on_next(): button.set_on_click(on_next) # Make the button visually obvious - try: - if UIColor is not None: - button.native_instance.setBackgroundColor_(UIColor.systemBlueColor()) - button.native_instance.setTitleColor_forState_(UIColor.whiteColor(), 0) - except Exception: - pass + button.set_background_color("#FF1E88E5") stack.add_view(button) - self.set_root_view(stack) + self.set_root_view(stack.wrap_in_scroll()) def on_start(self): super().on_start() diff --git a/mkdocs.yml b/mkdocs.yml index 9a29ca4..7aeff94 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,8 +24,10 @@ nav: - Android: guides/android.md - iOS: guides/ios.md - Navigation: guides/navigation.md + - Styling: guides/styling.md - API Reference: - Package: api/pythonnative.md + - Component Properties: api/component-properties.md - Meta: - Roadmap: meta/roadmap.md - Contributing: meta/contributing.md diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 13e38b1..7adef43 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -43,13 +43,14 @@ def __init__(self, title: str = "") -> None: self.native_instance = self.native_class(context) self.set_title(title) - def set_title(self, title: str) -> None: + def set_title(self, title: str): self.native_instance.setText(title) + return self def get_title(self) -> str: return self.native_instance.getText().toString() - def set_on_click(self, callback: Callable[[], None]) -> None: + def set_on_click(self, callback: Callable[[], None]): class OnClickListener(dynamic_proxy(jclass("android.view.View").OnClickListener)): def __init__(self, callback): super().__init__() @@ -60,6 +61,7 @@ def onClick(self, view): listener = OnClickListener(callback) self.native_instance.setOnClickListener(listener) + return self else: # ======================================== @@ -93,13 +95,14 @@ def __init__(self, title: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_title(title) - def set_title(self, title: str) -> None: + def set_title(self, title: str): self.native_instance.setTitle_forState_(title, 0) + return self def get_title(self) -> str: return self.native_instance.titleForState_(0) - def set_on_click(self, callback: Callable[[], None]) -> None: + def set_on_click(self, callback: Callable[[], None]): # Create a handler object with an Objective-C method `onTap:` and attach the Python callback handler = _PNButtonHandler.new() # Keep strong references to the handler and callback @@ -107,3 +110,4 @@ def set_on_click(self, callback: Callable[[], None]) -> None: handler._callback = callback # UIControlEventTouchUpInside = 1 << 6 self.native_instance.addTarget_action_forControlEvents_(handler, SEL("onTap:"), 1 << 6) + return self diff --git a/src/pythonnative/cli/pn.py b/src/pythonnative/cli/pn.py index e053f8d..8281eae 100644 --- a/src/pythonnative/cli/pn.py +++ b/src/pythonnative/cli/pn.py @@ -55,12 +55,17 @@ def __init__(self, native_instance): def on_create(self): super().on_create() - stack = pn.StackView() - stack.add_view(pn.Label("Hello from PythonNative!")) - button = pn.Button("Tap me") - button.set_on_click(lambda: print("Button clicked")) + stack = ( + pn.StackView() + .set_axis("vertical") + .set_spacing(12) + .set_alignment("fill") + .set_padding(all=16) + ) + stack.add_view(pn.Label("Hello from PythonNative!").set_text_size(18)) + button = pn.Button("Tap me").set_on_click(lambda: print("Button clicked")) stack.add_view(button) - self.set_root_view(stack) + self.set_root_view(stack.wrap_in_scroll()) """ ) diff --git a/src/pythonnative/label.py b/src/pythonnative/label.py index c34eec2..a65ea05 100644 --- a/src/pythonnative/label.py +++ b/src/pythonnative/label.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from typing import Any from .utils import IS_ANDROID, get_android_context from .view import ViewBase @@ -21,6 +22,14 @@ def set_text(self, text: str) -> None: def get_text(self) -> str: pass + @abstractmethod + def set_text_color(self, color: Any) -> None: + pass + + @abstractmethod + def set_text_size(self, size: float) -> None: + pass + if IS_ANDROID: # ======================================== @@ -38,12 +47,37 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class(context) self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText(text) + return self def get_text(self) -> str: return self.native_instance.getText().toString() + def set_text_color(self, color: Any): + # Accept int ARGB or hex string + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + self.native_instance.setTextColor(color_int) + except Exception: + pass + return self + + def set_text_size(self, size_sp: float): + try: + self.native_instance.setTextSize(float(size_sp)) + except Exception: + pass + return self + else: # ======================================== # iOS class @@ -59,8 +93,41 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText_(text) + return self def get_text(self) -> str: return self.native_instance.text() + + def set_text_color(self, color: Any): + # Accept int ARGB or hex string + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + UIColor = ObjCClass("UIColor") + a = ((color_int >> 24) & 0xFF) / 255.0 + r = ((color_int >> 16) & 0xFF) / 255.0 + g = ((color_int >> 8) & 0xFF) / 255.0 + b = (color_int & 0xFF) / 255.0 + color_obj = UIColor.colorWithRed_green_blue_alpha_(r, g, b, a) + self.native_instance.setTextColor_(color_obj) + except Exception: + pass + return self + + def set_text_size(self, size: float): + try: + UIFont = ObjCClass("UIFont") + font = UIFont.systemFontOfSize_(float(size)) + self.native_instance.setFont_(font) + except Exception: + pass + return self diff --git a/src/pythonnative/list_view.py b/src/pythonnative/list_view.py index d2378d2..3fe2a1e 100644 --- a/src/pythonnative/list_view.py +++ b/src/pythonnative/list_view.py @@ -38,11 +38,12 @@ def __init__(self, context, data: list = []) -> None: self.native_instance = self.native_class(context) self.set_data(data) - def set_data(self, data: list) -> None: + def set_data(self, data: list): adapter = jclass("android.widget.ArrayAdapter")( self.context, jclass("android.R$layout").simple_list_item_1, data ) self.native_instance.setAdapter(adapter) + return self def get_data(self) -> list: adapter = self.native_instance.getAdapter() @@ -63,9 +64,10 @@ def __init__(self, data: list = []) -> None: self.native_instance = self.native_class.alloc().init() self.set_data(data) - def set_data(self, data: list) -> None: + def set_data(self, data: list): # Note: This is a simplified representation. Normally, you would need to create a UITableViewDataSource. self.native_instance.reloadData() + return self def get_data(self) -> list: # Note: This is a simplified representation. diff --git a/src/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py index 1c19d62..13c5591 100644 --- a/src/pythonnative/scroll_view.py +++ b/src/pythonnative/scroll_view.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Any, List -from .utils import IS_ANDROID +from .utils import IS_ANDROID, get_android_context from .view import ViewBase # ======================================== @@ -29,9 +29,10 @@ def add_view(self, view) -> None: from java import jclass class ScrollView(ScrollViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self) -> None: super().__init__() self.native_class = jclass("android.widget.ScrollView") + context = get_android_context() self.native_instance = self.native_class(context) def add_view(self, view): @@ -42,6 +43,13 @@ def add_view(self, view): else: raise Exception("ScrollView can host only one direct child") + @staticmethod + def wrap(view: Any): + """Return a new ScrollView containing the provided view as its only child.""" + sv = ScrollView() + sv.add_view(view) + return sv + else: # ======================================== # iOS class @@ -61,3 +69,10 @@ def add_view(self, view): # Ensure view is a subview of scrollview if view.native_instance not in self.native_instance.subviews: self.native_instance.addSubview_(view.native_instance) + + @staticmethod + def wrap(view: Any): + """Return a new ScrollView containing the provided view as its only child.""" + sv = ScrollView() + sv.add_view(view) + return sv diff --git a/src/pythonnative/stack_view.py b/src/pythonnative/stack_view.py index 3fc57b1..004ca7e 100644 --- a/src/pythonnative/stack_view.py +++ b/src/pythonnative/stack_view.py @@ -19,6 +19,18 @@ def __init__(self) -> None: def add_view(self, view) -> None: pass + @abstractmethod + def set_axis(self, axis: str): + pass + + @abstractmethod + def set_spacing(self, spacing): + pass + + @abstractmethod + def set_alignment(self, alignment: str): + pass + if IS_ANDROID: # ======================================== @@ -35,11 +47,99 @@ def __init__(self) -> None: context = get_android_context() self.native_instance = self.native_class(context) self.native_instance.setOrientation(self.native_class.VERTICAL) + # Cache context and current orientation for spacing/alignment helpers + self._context = context + self._axis = "vertical" def add_view(self, view): self.views.append(view) + # Apply margins if the child has any recorded (supported for LinearLayout) + try: + lp = view.native_instance.getLayoutParams() + except Exception: + lp = None + if lp is None: + # Create default LayoutParams (WRAP_CONTENT) + layout_params = jclass("android.widget.LinearLayout$LayoutParams")(-2, -2) + else: + layout_params = lp + margin = getattr(view, "_pn_margin", None) + if margin is not None: + left, top, right, bottom = margin + # Convert dp to px + density = self._context.getResources().getDisplayMetrics().density + lpx = int(left * density) + tpx = int(top * density) + rpx = int(right * density) + bpx = int(bottom * density) + try: + layout_params.setMargins(lpx, tpx, rpx, bpx) + except Exception: + pass + try: + view.native_instance.setLayoutParams(layout_params) + except Exception: + pass self.native_instance.addView(view.native_instance) + def set_axis(self, axis: str): + """Set stacking axis: 'vertical' or 'horizontal'. Returns self.""" + axis_l = (axis or "").lower() + if axis_l not in ("vertical", "horizontal"): + return self + orientation = self.native_class.VERTICAL if axis_l == "vertical" else self.native_class.HORIZONTAL + self.native_instance.setOrientation(orientation) + self._axis = axis_l + return self + + def set_spacing(self, spacing_dp: int): + """Set spacing between children in dp (Android: uses LinearLayout dividers). Returns self.""" + try: + density = self._context.getResources().getDisplayMetrics().density + px = max(0, int(spacing_dp * density)) + # Use a transparent GradientDrawable with specified size as divider + GradientDrawable = jclass("android.graphics.drawable.GradientDrawable") + drawable = GradientDrawable() + drawable.setColor(0x00000000) + if self._axis == "vertical": + drawable.setSize(1, px) + else: + drawable.setSize(px, 1) + self.native_instance.setShowDividers(self.native_class.SHOW_DIVIDER_MIDDLE) + self.native_instance.setDividerDrawable(drawable) + except Exception: + pass + return self + + def set_alignment(self, alignment: str): + """Set cross-axis alignment: 'fill', 'center', 'leading'/'top', 'trailing'/'bottom'. Returns self.""" + try: + Gravity = jclass("android.view.Gravity") + a = (alignment or "").lower() + if self._axis == "vertical": + # Cross-axis is horizontal + if a in ("fill",): + self.native_instance.setGravity(Gravity.FILL_HORIZONTAL) + elif a in ("center", "centre"): + self.native_instance.setGravity(Gravity.CENTER_HORIZONTAL) + elif a in ("leading", "start", "left"): + self.native_instance.setGravity(Gravity.START) + elif a in ("trailing", "end", "right"): + self.native_instance.setGravity(Gravity.END) + else: + # Cross-axis is vertical + if a in ("fill",): + self.native_instance.setGravity(Gravity.FILL_VERTICAL) + elif a in ("center", "centre"): + self.native_instance.setGravity(Gravity.CENTER_VERTICAL) + elif a in ("top",): + self.native_instance.setGravity(Gravity.TOP) + elif a in ("bottom",): + self.native_instance.setGravity(Gravity.BOTTOM) + except Exception: + pass + return self + else: # ======================================== # iOS class @@ -53,8 +153,47 @@ def __init__(self) -> None: super().__init__() self.native_class = ObjCClass("UIStackView") self.native_instance = self.native_class.alloc().initWithFrame_(((0, 0), (0, 0))) - self.native_instance.setAxis_(0) # Set axis to vertical + # Default to vertical axis + self.native_instance.setAxis_(1) def add_view(self, view): self.views.append(view) self.native_instance.addArrangedSubview_(view.native_instance) + + def set_axis(self, axis: str): + """Set stacking axis: 'vertical' or 'horizontal'. Returns self.""" + axis_l = (axis or "").lower() + value = 1 if axis_l == "vertical" else 0 + try: + self.native_instance.setAxis_(value) + except Exception: + pass + return self + + def set_spacing(self, spacing: float): + """Set spacing between arranged subviews. Returns self.""" + try: + self.native_instance.setSpacing_(float(spacing)) + except Exception: + pass + return self + + def set_alignment(self, alignment: str): + """Set cross-axis alignment: 'fill', 'center', 'leading'/'top', 'trailing'/'bottom'. Returns self.""" + a = (alignment or "").lower() + # UIStackViewAlignment: Fill=0, Leading/Top=1, Center=3, Trailing/Bottom=4 + mapping = { + "fill": 0, + "leading": 1, + "top": 1, + "center": 3, + "centre": 3, + "trailing": 4, + "bottom": 4, + } + value = mapping.get(a, 0) + try: + self.native_instance.setAlignment_(value) + except Exception: + pass + return self diff --git a/src/pythonnative/text_field.py b/src/pythonnative/text_field.py index fcf1288..f78ee90 100644 --- a/src/pythonnative/text_field.py +++ b/src/pythonnative/text_field.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from typing import Any from .utils import IS_ANDROID, get_android_context from .view import ViewBase @@ -21,6 +22,14 @@ def set_text(self, text: str) -> None: def get_text(self) -> str: pass + @abstractmethod + def set_text_color(self, color: Any) -> None: + pass + + @abstractmethod + def set_text_size(self, size: float) -> None: + pass + if IS_ANDROID: # ======================================== @@ -39,12 +48,36 @@ def __init__(self, text: str = "") -> None: self.native_instance.setSingleLine(True) self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText(text) + return self def get_text(self) -> str: return self.native_instance.getText().toString() + def set_text_color(self, color: Any): + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + self.native_instance.setTextColor(color_int) + except Exception: + pass + return self + + def set_text_size(self, size_sp: float): + try: + self.native_instance.setTextSize(float(size_sp)) + except Exception: + pass + return self + else: # ======================================== # iOS class @@ -60,8 +93,40 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText_(text) + return self def get_text(self) -> str: return self.native_instance.text() + + def set_text_color(self, color: Any): + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + UIColor = ObjCClass("UIColor") + a = ((color_int >> 24) & 0xFF) / 255.0 + r = ((color_int >> 16) & 0xFF) / 255.0 + g = ((color_int >> 8) & 0xFF) / 255.0 + b = (color_int & 0xFF) / 255.0 + color_obj = UIColor.colorWithRed_green_blue_alpha_(r, g, b, a) + self.native_instance.setTextColor_(color_obj) + except Exception: + pass + return self + + def set_text_size(self, size: float): + try: + UIFont = ObjCClass("UIFont") + font = UIFont.systemFontOfSize_(float(size)) + self.native_instance.setFont_(font) + except Exception: + pass + return self diff --git a/src/pythonnative/text_view.py b/src/pythonnative/text_view.py index 8e9154d..6c0d4ec 100644 --- a/src/pythonnative/text_view.py +++ b/src/pythonnative/text_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from typing import Any from .utils import IS_ANDROID, get_android_context from .view import ViewBase @@ -21,6 +22,14 @@ def set_text(self, text: str) -> None: def get_text(self) -> str: pass + @abstractmethod + def set_text_color(self, color: Any) -> None: + pass + + @abstractmethod + def set_text_size(self, size: float) -> None: + pass + if IS_ANDROID: # ======================================== @@ -42,12 +51,36 @@ def __init__(self, text: str = "") -> None: # self.native_instance.movementMethod = ScrollingMovementMethod() self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText(text) + return self def get_text(self) -> str: return self.native_instance.getText().toString() + def set_text_color(self, color: Any): + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + self.native_instance.setTextColor(color_int) + except Exception: + pass + return self + + def set_text_size(self, size_sp: float): + try: + self.native_instance.setTextSize(float(size_sp)) + except Exception: + pass + return self + else: # ======================================== # iOS class @@ -63,8 +96,40 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str) -> None: + def set_text(self, text: str): self.native_instance.setText_(text) + return self def get_text(self) -> str: return self.native_instance.text() + + def set_text_color(self, color: Any): + if isinstance(color, str): + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + try: + UIColor = ObjCClass("UIColor") + a = ((color_int >> 24) & 0xFF) / 255.0 + r = ((color_int >> 16) & 0xFF) / 255.0 + g = ((color_int >> 8) & 0xFF) / 255.0 + b = (color_int & 0xFF) / 255.0 + color_obj = UIColor.colorWithRed_green_blue_alpha_(r, g, b, a) + self.native_instance.setTextColor_(color_obj) + except Exception: + pass + return self + + def set_text_size(self, size: float): + try: + UIFont = ObjCClass("UIFont") + font = UIFont.systemFontOfSize_(float(size)) + self.native_instance.setFont_(font) + except Exception: + pass + return self diff --git a/src/pythonnative/view.py b/src/pythonnative/view.py index 4afbbfe..bf6356f 100644 --- a/src/pythonnative/view.py +++ b/src/pythonnative/view.py @@ -1,5 +1,5 @@ from abc import ABC -from typing import Any +from typing import Any, Optional, Tuple # ======================================== # Base class @@ -11,6 +11,154 @@ def __init__(self) -> None: # Native bridge handles return types dynamically; these attributes are set at runtime. self.native_instance: Any = None self.native_class: Any = None + # Record margins for parents that can apply them (Android LinearLayout) + self._pn_margin: Optional[Tuple[int, int, int, int]] = None + + # ======================================== + # Lightweight style helpers + # ======================================== + + def set_background_color(self, color: Any): + """Set background color. Accepts platform color int or CSS-like hex string. Returns self.""" + try: + from .utils import IS_ANDROID + + if isinstance(color, str): + # Support formats: #RRGGBB or #AARRGGBB + c = color.strip() + if c.startswith("#"): + c = c[1:] + if len(c) == 6: + c = "FF" + c + color_int = int(c, 16) + else: + color_int = int(color) + + if IS_ANDROID: + # Android expects ARGB int + self.native_instance.setBackgroundColor(color_int) + else: + # iOS expects a UIColor + from rubicon.objc import ObjCClass + + UIColor = ObjCClass("UIColor") + a = ((color_int >> 24) & 0xFF) / 255.0 + r = ((color_int >> 16) & 0xFF) / 255.0 + g = ((color_int >> 8) & 0xFF) / 255.0 + b = (color_int & 0xFF) / 255.0 + try: + color_obj = UIColor.colorWithRed_green_blue_alpha_(r, g, b, a) + except Exception: + color_obj = UIColor.blackColor() + try: + self.native_instance.setBackgroundColor_(color_obj) + except Exception: + try: + # Some UIKit classes expose 'backgroundColor' property + self.native_instance.setBackgroundColor_(color_obj) + except Exception: + pass + except Exception: + pass + return self + + def set_padding( + self, + left: Optional[int] = None, + top: Optional[int] = None, + right: Optional[int] = None, + bottom: Optional[int] = None, + all: Optional[int] = None, + horizontal: Optional[int] = None, + vertical: Optional[int] = None, + ): + """Set padding (dp on Android; best-effort on iOS where supported). Returns self. + + When provided, 'all' applies to all sides; 'horizontal' applies to left and right; + 'vertical' applies to top and bottom; individual overrides take precedence. + """ + try: + from .utils import IS_ANDROID, get_android_context + + left_value = left + top_value = top + right_value = right + bottom_value = bottom + if all is not None: + left_value = top_value = right_value = bottom_value = all + if horizontal is not None: + left_value = horizontal if left_value is None else left_value + right_value = horizontal if right_value is None else right_value + if vertical is not None: + top_value = vertical if top_value is None else top_value + bottom_value = vertical if bottom_value is None else bottom_value + left_value = left_value or 0 + top_value = top_value or 0 + right_value = right_value or 0 + bottom_value = bottom_value or 0 + + if IS_ANDROID: + density = get_android_context().getResources().getDisplayMetrics().density + lpx = int(left_value * density) + tpx = int(top_value * density) + rpx = int(right_value * density) + bpx = int(bottom_value * density) + self.native_instance.setPadding(lpx, tpx, rpx, bpx) + else: + # Best-effort: many UIKit views don't have direct padding; leave to containers (e.g. UIStackView) + # No-op by default. + pass + except Exception: + pass + return self + + def set_margin( + self, + left: Optional[int] = None, + top: Optional[int] = None, + right: Optional[int] = None, + bottom: Optional[int] = None, + all: Optional[int] = None, + horizontal: Optional[int] = None, + vertical: Optional[int] = None, + ): + """Record margins for this view (applied where supported). Returns self. + + Currently applied automatically when added to Android LinearLayout (StackView). + """ + try: + left_value = left + top_value = top + right_value = right + bottom_value = bottom + if all is not None: + left_value = top_value = right_value = bottom_value = all + if horizontal is not None: + left_value = horizontal if left_value is None else left_value + right_value = horizontal if right_value is None else right_value + if vertical is not None: + top_value = vertical if top_value is None else top_value + bottom_value = vertical if bottom_value is None else bottom_value + left_value = int(left_value or 0) + top_value = int(top_value or 0) + right_value = int(right_value or 0) + bottom_value = int(bottom_value or 0) + self._pn_margin = (left_value, top_value, right_value, bottom_value) + except Exception: + pass + return self + + def wrap_in_scroll(self): + """Return a ScrollView containing this view as its only child. Returns the ScrollView.""" + try: + # Local import to avoid circulars + from .scroll_view import ScrollView + + sv = ScrollView() + sv.add_view(self) + return sv + except Exception: + return None # @abstractmethod # def add_view(self, view): From 86e4ffc9e51810997006055434783416784c182f Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Wed, 29 Oct 2025 13:44:32 -0700 Subject: [PATCH 03/12] refactor(core,components,examples): add annotations; tighten mypy --- examples/hello-world/app/main_page.py | 24 +++++++++-------- examples/hello-world/app/second_page.py | 24 +++++++++-------- examples/hello-world/app/third_page.py | 6 +++-- mypy.ini | 2 ++ src/pythonnative/button.py | 20 +++++++------- src/pythonnative/date_picker.py | 4 ++- src/pythonnative/label.py | 18 ++++++------- src/pythonnative/list_view.py | 9 ++++--- .../material_activity_indicator_view.py | 4 ++- src/pythonnative/material_button.py | 4 ++- src/pythonnative/material_progress_view.py | 4 ++- src/pythonnative/material_search_bar.py | 4 ++- src/pythonnative/material_switch.py | 4 ++- src/pythonnative/material_time_picker.py | 4 ++- src/pythonnative/page.py | 12 ++++----- src/pythonnative/picker_view.py | 4 ++- src/pythonnative/scroll_view.py | 10 +++---- src/pythonnative/search_bar.py | 4 ++- src/pythonnative/stack_view.py | 26 +++++++++---------- src/pythonnative/text_field.py | 18 ++++++------- src/pythonnative/text_view.py | 18 ++++++------- src/pythonnative/time_picker.py | 4 ++- src/pythonnative/view.py | 8 +++--- tests/test_cli.py | 7 ++--- tests/test_smoke.py | 2 +- 25 files changed, 137 insertions(+), 107 deletions(-) diff --git a/examples/hello-world/app/main_page.py b/examples/hello-world/app/main_page.py index ad6f8e6..2646880 100644 --- a/examples/hello-world/app/main_page.py +++ b/examples/hello-world/app/main_page.py @@ -1,3 +1,5 @@ +from typing import Any + import pythonnative as pn try: @@ -10,16 +12,16 @@ class MainPage(pn.Page): - def __init__(self, native_instance): + def __init__(self, native_instance: Any) -> None: super().__init__(native_instance) - def on_create(self): + def on_create(self) -> None: super().on_create() stack = pn.StackView().set_axis("vertical").set_spacing(12).set_alignment("fill").set_padding(all=16) stack.add_view(pn.Label("Hello from PythonNative Demo!").set_text_size(18)) button = pn.Button("Go to Second Page").set_padding(vertical=10, horizontal=14) - def on_next(): + def on_next() -> None: # Visual confirmation that tap worked (iOS only) try: if UIColor is not None: @@ -36,26 +38,26 @@ def on_next(): stack.add_view(button) self.set_root_view(stack.wrap_in_scroll()) - def on_start(self): + def on_start(self) -> None: super().on_start() - def on_resume(self): + def on_resume(self) -> None: super().on_resume() - def on_pause(self): + def on_pause(self) -> None: super().on_pause() - def on_stop(self): + def on_stop(self) -> None: super().on_stop() - def on_destroy(self): + def on_destroy(self) -> None: super().on_destroy() - def on_restart(self): + def on_restart(self) -> None: super().on_restart() - def on_save_instance_state(self): + def on_save_instance_state(self) -> None: super().on_save_instance_state() - def on_restore_instance_state(self): + def on_restore_instance_state(self) -> None: super().on_restore_instance_state() diff --git a/examples/hello-world/app/second_page.py b/examples/hello-world/app/second_page.py index 99af521..3515527 100644 --- a/examples/hello-world/app/second_page.py +++ b/examples/hello-world/app/second_page.py @@ -1,3 +1,5 @@ +from typing import Any + import pythonnative as pn try: @@ -10,10 +12,10 @@ class SecondPage(pn.Page): - def __init__(self, native_instance): + def __init__(self, native_instance: Any) -> None: super().__init__(native_instance) - def on_create(self): + def on_create(self) -> None: super().on_create() stack_view = pn.StackView() # Read args passed from MainPage @@ -30,7 +32,7 @@ def on_create(self): except Exception: pass - def on_next(): + def on_next() -> None: # Visual confirmation that tap worked (iOS only) try: if UIColor is not None: @@ -47,26 +49,26 @@ def on_next(): stack_view.add_view(back_btn) self.set_root_view(stack_view) - def on_start(self): + def on_start(self) -> None: super().on_start() - def on_resume(self): + def on_resume(self) -> None: super().on_resume() - def on_pause(self): + def on_pause(self) -> None: super().on_pause() - def on_stop(self): + def on_stop(self) -> None: super().on_stop() - def on_destroy(self): + def on_destroy(self) -> None: super().on_destroy() - def on_restart(self): + def on_restart(self) -> None: super().on_restart() - def on_save_instance_state(self): + def on_save_instance_state(self) -> None: super().on_save_instance_state() - def on_restore_instance_state(self): + def on_restore_instance_state(self) -> None: super().on_restore_instance_state() diff --git a/examples/hello-world/app/third_page.py b/examples/hello-world/app/third_page.py index 6c06594..97b003f 100644 --- a/examples/hello-world/app/third_page.py +++ b/examples/hello-world/app/third_page.py @@ -1,3 +1,5 @@ +from typing import Any + import pythonnative as pn try: @@ -10,10 +12,10 @@ class ThirdPage(pn.Page): - def __init__(self, native_instance): + def __init__(self, native_instance: Any) -> None: super().__init__(native_instance) - def on_create(self): + def on_create(self) -> None: super().on_create() stack = pn.StackView() stack.add_view(pn.Label("This is the Third Page")) diff --git a/mypy.ini b/mypy.ini index ec0b8ad..333ddb6 100644 --- a/mypy.ini +++ b/mypy.ini @@ -8,6 +8,8 @@ strict_optional = False pretty = True files = src, tests, examples exclude = (^build/|^examples/.*/build/) +disallow_untyped_defs = True +disallow_incomplete_defs = True [mypy-pythonnative.*] implicit_reexport = True diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 7adef43..7c714a4 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Callable, Optional +from typing import Any, Callable, Optional from .utils import IS_ANDROID, get_android_context from .view import ViewBase @@ -15,7 +15,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_title(self, title: str) -> None: + def set_title(self, title: str) -> "ButtonBase": pass @abstractmethod @@ -23,7 +23,7 @@ def get_title(self) -> str: pass @abstractmethod - def set_on_click(self, callback: Callable[[], None]) -> None: + def set_on_click(self, callback: Callable[[], None]) -> "ButtonBase": pass @@ -43,20 +43,20 @@ def __init__(self, title: str = "") -> None: self.native_instance = self.native_class(context) self.set_title(title) - def set_title(self, title: str): + def set_title(self, title: str) -> "Button": self.native_instance.setText(title) return self def get_title(self) -> str: return self.native_instance.getText().toString() - def set_on_click(self, callback: Callable[[], None]): + def set_on_click(self, callback: Callable[[], None]) -> "Button": class OnClickListener(dynamic_proxy(jclass("android.view.View").OnClickListener)): - def __init__(self, callback): + def __init__(self, callback: Callable[[], None]) -> None: super().__init__() self.callback = callback - def onClick(self, view): + def onClick(self, view: Any) -> None: self.callback() listener = OnClickListener(callback) @@ -79,7 +79,7 @@ class _PNButtonHandler(NSObject): # type: ignore[valid-type] _callback: Optional[Callable[[], None]] = None @objc_method - def onTap_(self, sender) -> None: + def onTap_(self, sender: Any) -> None: try: callback = self._callback if callback is not None: @@ -95,14 +95,14 @@ def __init__(self, title: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_title(title) - def set_title(self, title: str): + def set_title(self, title: str) -> "Button": self.native_instance.setTitle_forState_(title, 0) return self def get_title(self) -> str: return self.native_instance.titleForState_(0) - def set_on_click(self, callback: Callable[[], None]): + def set_on_click(self, callback: Callable[[], None]) -> "Button": # Create a handler object with an Objective-C method `onTap:` and attach the Python callback handler = _PNButtonHandler.new() # Keep strong references to the handler and callback diff --git a/src/pythonnative/date_picker.py b/src/pythonnative/date_picker.py index cb86006..7d161bd 100644 --- a/src/pythonnative/date_picker.py +++ b/src/pythonnative/date_picker.py @@ -28,10 +28,12 @@ def get_date(self) -> tuple: # https://developer.android.com/reference/android/widget/DatePicker # ======================================== + from typing import Any + from java import jclass class DatePicker(DatePickerBase, ViewBase): - def __init__(self, context, year: int = 0, month: int = 0, day: int = 0) -> None: + def __init__(self, context: Any, year: int = 0, month: int = 0, day: int = 0) -> None: super().__init__() self.native_class = jclass("android.widget.DatePicker") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/label.py b/src/pythonnative/label.py index a65ea05..d998b7d 100644 --- a/src/pythonnative/label.py +++ b/src/pythonnative/label.py @@ -15,7 +15,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_text(self, text: str) -> None: + def set_text(self, text: str) -> "LabelBase": pass @abstractmethod @@ -23,11 +23,11 @@ def get_text(self) -> str: pass @abstractmethod - def set_text_color(self, color: Any) -> None: + def set_text_color(self, color: Any) -> "LabelBase": pass @abstractmethod - def set_text_size(self, size: float) -> None: + def set_text_size(self, size: float) -> "LabelBase": pass @@ -47,14 +47,14 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class(context) self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "Label": self.native_instance.setText(text) return self def get_text(self) -> str: return self.native_instance.getText().toString() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "Label": # Accept int ARGB or hex string if isinstance(color, str): c = color.strip() @@ -71,7 +71,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size_sp: float): + def set_text_size(self, size_sp: float) -> "Label": try: self.native_instance.setTextSize(float(size_sp)) except Exception: @@ -93,14 +93,14 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "Label": self.native_instance.setText_(text) return self def get_text(self) -> str: return self.native_instance.text() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "Label": # Accept int ARGB or hex string if isinstance(color, str): c = color.strip() @@ -123,7 +123,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size: float): + def set_text_size(self, size: float) -> "Label": try: UIFont = ObjCClass("UIFont") font = UIFont.systemFontOfSize_(float(size)) diff --git a/src/pythonnative/list_view.py b/src/pythonnative/list_view.py index 3fe2a1e..c4433e4 100644 --- a/src/pythonnative/list_view.py +++ b/src/pythonnative/list_view.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from typing import Any from .utils import IS_ANDROID from .view import ViewBase @@ -14,7 +15,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_data(self, data: list) -> None: + def set_data(self, data: list) -> "ListViewBase": pass @abstractmethod @@ -31,14 +32,14 @@ def get_data(self) -> list: from java import jclass class ListView(ListViewBase, ViewBase): - def __init__(self, context, data: list = []) -> None: + def __init__(self, context: Any, data: list = []) -> None: super().__init__() self.context = context self.native_class = jclass("android.widget.ListView") self.native_instance = self.native_class(context) self.set_data(data) - def set_data(self, data: list): + def set_data(self, data: list) -> "ListView": adapter = jclass("android.widget.ArrayAdapter")( self.context, jclass("android.R$layout").simple_list_item_1, data ) @@ -64,7 +65,7 @@ def __init__(self, data: list = []) -> None: self.native_instance = self.native_class.alloc().init() self.set_data(data) - def set_data(self, data: list): + def set_data(self, data: list) -> "ListView": # Note: This is a simplified representation. Normally, you would need to create a UITableViewDataSource. self.native_instance.reloadData() return self diff --git a/src/pythonnative/material_activity_indicator_view.py b/src/pythonnative/material_activity_indicator_view.py index a568ced..b619960 100644 --- a/src/pythonnative/material_activity_indicator_view.py +++ b/src/pythonnative/material_activity_indicator_view.py @@ -28,10 +28,12 @@ def stop_animating(self) -> None: # https://developer.android.com/reference/com/google/android/material/progressindicator/CircularProgressIndicator # ======================================== + from typing import Any + from java import jclass class MaterialActivityIndicatorView(MaterialActivityIndicatorViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self, context: Any) -> None: super().__init__() self.native_class = jclass("com.google.android.material.progressindicator.CircularProgressIndicator") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/material_button.py b/src/pythonnative/material_button.py index 1db600a..65a317b 100644 --- a/src/pythonnative/material_button.py +++ b/src/pythonnative/material_button.py @@ -28,10 +28,12 @@ def get_title(self) -> str: # https://developer.android.com/reference/com/google/android/material/button/MaterialButton # ======================================== + from typing import Any + from java import jclass class MaterialButton(MaterialButtonBase, ViewBase): - def __init__(self, context, title: str = "") -> None: + def __init__(self, context: Any, title: str = "") -> None: super().__init__() self.native_class = jclass("com.google.android.material.button.MaterialButton") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/material_progress_view.py b/src/pythonnative/material_progress_view.py index 23ca565..afc69c6 100644 --- a/src/pythonnative/material_progress_view.py +++ b/src/pythonnative/material_progress_view.py @@ -28,10 +28,12 @@ def get_progress(self) -> float: # https://developer.android.com/reference/com/google/android/material/progressindicator/LinearProgressIndicator # ======================================== + from typing import Any + from java import jclass class MaterialProgressView(MaterialProgressViewBase, ViewBase): - def __init__(self, context) -> None: + def __init__(self, context: Any) -> None: super().__init__() self.native_class = jclass("com.google.android.material.progressindicator.LinearProgressIndicator") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/material_search_bar.py b/src/pythonnative/material_search_bar.py index 0693323..9be2e6f 100644 --- a/src/pythonnative/material_search_bar.py +++ b/src/pythonnative/material_search_bar.py @@ -28,10 +28,12 @@ def get_query(self) -> str: # https://developer.android.com/reference/com/google/android/material/search/SearchBar # ======================================== + from typing import Any + from java import jclass class MaterialSearchBar(MaterialSearchBarBase, ViewBase): - def __init__(self, context, query: str = "") -> None: + def __init__(self, context: Any, query: str = "") -> None: super().__init__() self.native_class = jclass("com.google.android.material.search.SearchBar") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/material_switch.py b/src/pythonnative/material_switch.py index 21003b5..9ad31fe 100644 --- a/src/pythonnative/material_switch.py +++ b/src/pythonnative/material_switch.py @@ -28,10 +28,12 @@ def is_on(self) -> bool: # https://developer.android.com/reference/com/google/android/material/materialswitch/MaterialSwitch # ======================================== + from typing import Any + from java import jclass class MaterialSwitch(MaterialSwitchBase, ViewBase): - def __init__(self, context, value: bool = False) -> None: + def __init__(self, context: Any, value: bool = False) -> None: super().__init__() self.native_class = jclass("com.google.android.material.switch.MaterialSwitch") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/material_time_picker.py b/src/pythonnative/material_time_picker.py index 03d7303..7ca3965 100644 --- a/src/pythonnative/material_time_picker.py +++ b/src/pythonnative/material_time_picker.py @@ -28,10 +28,12 @@ def get_time(self) -> tuple: # https://developer.android.com/reference/com/google/android/material/timepicker/MaterialTimePicker # ======================================== + from typing import Any + from java import jclass class MaterialTimePicker(MaterialTimePickerBase, ViewBase): - def __init__(self, context, hour: int = 0, minute: int = 0) -> None: + def __init__(self, context: Any, hour: int = 0, minute: int = 0) -> None: super().__init__() self.native_class = jclass("com.google.android.material.timepicker.MaterialTimePicker") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/page.py b/src/pythonnative/page.py index e5734e6..77e283c 100644 --- a/src/pythonnative/page.py +++ b/src/pythonnative/page.py @@ -47,7 +47,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_root_view(self, view) -> None: + def set_root_view(self, view: Any) -> None: pass @abstractmethod @@ -104,7 +104,7 @@ def get_args(self) -> dict: return getattr(self, "_args", {}) # Back-compat: navigate_to delegates to push - def navigate_to(self, page) -> None: + def navigate_to(self, page: Any) -> None: self.push(page) pass @@ -118,7 +118,7 @@ def navigate_to(self, page) -> None: from java import jclass class Page(PageBase, ViewBase): - def __init__(self, native_instance) -> None: + def __init__(self, native_instance: Any) -> None: super().__init__() self.native_class = jclass("android.app.Activity") self.native_instance = native_instance @@ -127,7 +127,7 @@ def __init__(self, native_instance) -> None: set_android_context(native_instance) self._args: dict = {} - def set_root_view(self, view) -> None: + def set_root_view(self, view: Any) -> None: # In fragment-based navigation, attach child view to the current fragment container. try: from .utils import get_android_fragment_container @@ -264,7 +264,7 @@ def forward_lifecycle(native_addr: int, event: str) -> None: pass class Page(PageBase, ViewBase): - def __init__(self, native_instance) -> None: + def __init__(self, native_instance: Any) -> None: super().__init__() self.native_class = ObjCClass("UIViewController") # If Swift passed us an integer pointer, wrap it as an ObjCInstance. @@ -280,7 +280,7 @@ def __init__(self, native_instance) -> None: if self.native_instance is not None: _ios_register_page(self.native_instance, self) - def set_root_view(self, view) -> None: + def set_root_view(self, view: Any) -> None: # UIViewController.view is a property; access without calling. root_view = self.native_instance.view # Size the root child to fill the controller's view and enable autoresizing diff --git a/src/pythonnative/picker_view.py b/src/pythonnative/picker_view.py index fc7ca98..07a5c64 100644 --- a/src/pythonnative/picker_view.py +++ b/src/pythonnative/picker_view.py @@ -28,10 +28,12 @@ def get_selected(self) -> int: # https://developer.android.com/reference/android/widget/Spinner # ======================================== + from typing import Any + from java import jclass class PickerView(PickerViewBase, ViewBase): - def __init__(self, context, index: int = 0) -> None: + def __init__(self, context: Any, index: int = 0) -> None: super().__init__() self.native_class = jclass("android.widget.Spinner") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py index 13c5591..57593c1 100644 --- a/src/pythonnative/scroll_view.py +++ b/src/pythonnative/scroll_view.py @@ -16,7 +16,7 @@ def __init__(self) -> None: self.views: List[Any] = [] @abstractmethod - def add_view(self, view) -> None: + def add_view(self, view: Any) -> None: pass @@ -35,7 +35,7 @@ def __init__(self) -> None: context = get_android_context() self.native_instance = self.native_class(context) - def add_view(self, view): + def add_view(self, view: Any) -> None: self.views.append(view) # In Android, ScrollView can host only one direct child if len(self.views) == 1: @@ -44,7 +44,7 @@ def add_view(self, view): raise Exception("ScrollView can host only one direct child") @staticmethod - def wrap(view: Any): + def wrap(view: Any) -> "ScrollView": """Return a new ScrollView containing the provided view as its only child.""" sv = ScrollView() sv.add_view(view) @@ -64,14 +64,14 @@ def __init__(self) -> None: self.native_class = ObjCClass("UIScrollView") self.native_instance = self.native_class.alloc().initWithFrame_(((0, 0), (0, 0))) - def add_view(self, view): + def add_view(self, view: Any) -> None: self.views.append(view) # Ensure view is a subview of scrollview if view.native_instance not in self.native_instance.subviews: self.native_instance.addSubview_(view.native_instance) @staticmethod - def wrap(view: Any): + def wrap(view: Any) -> "ScrollView": """Return a new ScrollView containing the provided view as its only child.""" sv = ScrollView() sv.add_view(view) diff --git a/src/pythonnative/search_bar.py b/src/pythonnative/search_bar.py index 72609ff..257c401 100644 --- a/src/pythonnative/search_bar.py +++ b/src/pythonnative/search_bar.py @@ -28,10 +28,12 @@ def get_query(self) -> str: # https://developer.android.com/reference/android/widget/SearchView # ======================================== + from typing import Any + from java import jclass class SearchBar(SearchBarBase, ViewBase): - def __init__(self, context, query: str = "") -> None: + def __init__(self, context: Any, query: str = "") -> None: super().__init__() self.native_class = jclass("android.widget.SearchView") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/stack_view.py b/src/pythonnative/stack_view.py index 004ca7e..cb2273c 100644 --- a/src/pythonnative/stack_view.py +++ b/src/pythonnative/stack_view.py @@ -16,19 +16,19 @@ def __init__(self) -> None: self.views: List[Any] = [] @abstractmethod - def add_view(self, view) -> None: + def add_view(self, view: Any) -> None: pass @abstractmethod - def set_axis(self, axis: str): + def set_axis(self, axis: str) -> "StackViewBase": pass @abstractmethod - def set_spacing(self, spacing): + def set_spacing(self, spacing: float) -> "StackViewBase": pass @abstractmethod - def set_alignment(self, alignment: str): + def set_alignment(self, alignment: str) -> "StackViewBase": pass @@ -51,7 +51,7 @@ def __init__(self) -> None: self._context = context self._axis = "vertical" - def add_view(self, view): + def add_view(self, view: Any) -> None: self.views.append(view) # Apply margins if the child has any recorded (supported for LinearLayout) try: @@ -82,7 +82,7 @@ def add_view(self, view): pass self.native_instance.addView(view.native_instance) - def set_axis(self, axis: str): + def set_axis(self, axis: str) -> "StackView": """Set stacking axis: 'vertical' or 'horizontal'. Returns self.""" axis_l = (axis or "").lower() if axis_l not in ("vertical", "horizontal"): @@ -92,11 +92,11 @@ def set_axis(self, axis: str): self._axis = axis_l return self - def set_spacing(self, spacing_dp: int): + def set_spacing(self, spacing: float) -> "StackView": """Set spacing between children in dp (Android: uses LinearLayout dividers). Returns self.""" try: density = self._context.getResources().getDisplayMetrics().density - px = max(0, int(spacing_dp * density)) + px = max(0, int(spacing * density)) # Use a transparent GradientDrawable with specified size as divider GradientDrawable = jclass("android.graphics.drawable.GradientDrawable") drawable = GradientDrawable() @@ -111,7 +111,7 @@ def set_spacing(self, spacing_dp: int): pass return self - def set_alignment(self, alignment: str): + def set_alignment(self, alignment: str) -> "StackView": """Set cross-axis alignment: 'fill', 'center', 'leading'/'top', 'trailing'/'bottom'. Returns self.""" try: Gravity = jclass("android.view.Gravity") @@ -156,11 +156,11 @@ def __init__(self) -> None: # Default to vertical axis self.native_instance.setAxis_(1) - def add_view(self, view): + def add_view(self, view: Any) -> None: self.views.append(view) self.native_instance.addArrangedSubview_(view.native_instance) - def set_axis(self, axis: str): + def set_axis(self, axis: str) -> "StackView": """Set stacking axis: 'vertical' or 'horizontal'. Returns self.""" axis_l = (axis or "").lower() value = 1 if axis_l == "vertical" else 0 @@ -170,7 +170,7 @@ def set_axis(self, axis: str): pass return self - def set_spacing(self, spacing: float): + def set_spacing(self, spacing: float) -> "StackView": """Set spacing between arranged subviews. Returns self.""" try: self.native_instance.setSpacing_(float(spacing)) @@ -178,7 +178,7 @@ def set_spacing(self, spacing: float): pass return self - def set_alignment(self, alignment: str): + def set_alignment(self, alignment: str) -> "StackView": """Set cross-axis alignment: 'fill', 'center', 'leading'/'top', 'trailing'/'bottom'. Returns self.""" a = (alignment or "").lower() # UIStackViewAlignment: Fill=0, Leading/Top=1, Center=3, Trailing/Bottom=4 diff --git a/src/pythonnative/text_field.py b/src/pythonnative/text_field.py index f78ee90..d6d1de1 100644 --- a/src/pythonnative/text_field.py +++ b/src/pythonnative/text_field.py @@ -15,7 +15,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_text(self, text: str) -> None: + def set_text(self, text: str) -> "TextFieldBase": pass @abstractmethod @@ -23,11 +23,11 @@ def get_text(self) -> str: pass @abstractmethod - def set_text_color(self, color: Any) -> None: + def set_text_color(self, color: Any) -> "TextFieldBase": pass @abstractmethod - def set_text_size(self, size: float) -> None: + def set_text_size(self, size: float) -> "TextFieldBase": pass @@ -48,14 +48,14 @@ def __init__(self, text: str = "") -> None: self.native_instance.setSingleLine(True) self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "TextField": self.native_instance.setText(text) return self def get_text(self) -> str: return self.native_instance.getText().toString() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "TextField": if isinstance(color, str): c = color.strip() if c.startswith("#"): @@ -71,7 +71,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size_sp: float): + def set_text_size(self, size_sp: float) -> "TextField": try: self.native_instance.setTextSize(float(size_sp)) except Exception: @@ -93,14 +93,14 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "TextField": self.native_instance.setText_(text) return self def get_text(self) -> str: return self.native_instance.text() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "TextField": if isinstance(color, str): c = color.strip() if c.startswith("#"): @@ -122,7 +122,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size: float): + def set_text_size(self, size: float) -> "TextField": try: UIFont = ObjCClass("UIFont") font = UIFont.systemFontOfSize_(float(size)) diff --git a/src/pythonnative/text_view.py b/src/pythonnative/text_view.py index 6c0d4ec..1e997bf 100644 --- a/src/pythonnative/text_view.py +++ b/src/pythonnative/text_view.py @@ -15,7 +15,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_text(self, text: str) -> None: + def set_text(self, text: str) -> "TextViewBase": pass @abstractmethod @@ -23,11 +23,11 @@ def get_text(self) -> str: pass @abstractmethod - def set_text_color(self, color: Any) -> None: + def set_text_color(self, color: Any) -> "TextViewBase": pass @abstractmethod - def set_text_size(self, size: float) -> None: + def set_text_size(self, size: float) -> "TextViewBase": pass @@ -51,14 +51,14 @@ def __init__(self, text: str = "") -> None: # self.native_instance.movementMethod = ScrollingMovementMethod() self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "TextView": self.native_instance.setText(text) return self def get_text(self) -> str: return self.native_instance.getText().toString() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "TextView": if isinstance(color, str): c = color.strip() if c.startswith("#"): @@ -74,7 +74,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size_sp: float): + def set_text_size(self, size_sp: float) -> "TextView": try: self.native_instance.setTextSize(float(size_sp)) except Exception: @@ -96,14 +96,14 @@ def __init__(self, text: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_text(text) - def set_text(self, text: str): + def set_text(self, text: str) -> "TextView": self.native_instance.setText_(text) return self def get_text(self) -> str: return self.native_instance.text() - def set_text_color(self, color: Any): + def set_text_color(self, color: Any) -> "TextView": if isinstance(color, str): c = color.strip() if c.startswith("#"): @@ -125,7 +125,7 @@ def set_text_color(self, color: Any): pass return self - def set_text_size(self, size: float): + def set_text_size(self, size: float) -> "TextView": try: UIFont = ObjCClass("UIFont") font = UIFont.systemFontOfSize_(float(size)) diff --git a/src/pythonnative/time_picker.py b/src/pythonnative/time_picker.py index b12a395..4088f7c 100644 --- a/src/pythonnative/time_picker.py +++ b/src/pythonnative/time_picker.py @@ -28,10 +28,12 @@ def get_time(self) -> tuple: # https://developer.android.com/reference/android/widget/TimePicker # ======================================== + from typing import Any + from java import jclass class TimePicker(TimePickerBase, ViewBase): - def __init__(self, context, hour: int = 0, minute: int = 0) -> None: + def __init__(self, context: Any, hour: int = 0, minute: int = 0) -> None: super().__init__() self.native_class = jclass("android.widget.TimePicker") self.native_instance = self.native_class(context) diff --git a/src/pythonnative/view.py b/src/pythonnative/view.py index bf6356f..abef7f6 100644 --- a/src/pythonnative/view.py +++ b/src/pythonnative/view.py @@ -18,7 +18,7 @@ def __init__(self) -> None: # Lightweight style helpers # ======================================== - def set_background_color(self, color: Any): + def set_background_color(self, color: Any) -> "ViewBase": """Set background color. Accepts platform color int or CSS-like hex string. Returns self.""" try: from .utils import IS_ANDROID @@ -71,7 +71,7 @@ def set_padding( all: Optional[int] = None, horizontal: Optional[int] = None, vertical: Optional[int] = None, - ): + ) -> "ViewBase": """Set padding (dp on Android; best-effort on iOS where supported). Returns self. When provided, 'all' applies to all sides; 'horizontal' applies to left and right; @@ -121,7 +121,7 @@ def set_margin( all: Optional[int] = None, horizontal: Optional[int] = None, vertical: Optional[int] = None, - ): + ) -> "ViewBase": """Record margins for this view (applied where supported). Returns self. Currently applied automatically when added to Android LinearLayout (StackView). @@ -148,7 +148,7 @@ def set_margin( pass return self - def wrap_in_scroll(self): + def wrap_in_scroll(self) -> Any: """Return a ScrollView containing this view as its only child. Returns the ScrollView.""" try: # Local import to avoid circulars diff --git a/tests/test_cli.py b/tests/test_cli.py index f9b0eaf..4a1eac9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -3,14 +3,15 @@ import subprocess import sys import tempfile +from typing import List -def run_pn(args, cwd): +def run_pn(args: List[str], cwd: str) -> subprocess.CompletedProcess[str]: cmd = [sys.executable, "-m", "pythonnative.cli.pn"] + args return subprocess.run(cmd, cwd=cwd, check=False, capture_output=True, text=True) -def test_cli_init_and_clean(): +def test_cli_init_and_clean() -> None: tmpdir = tempfile.mkdtemp(prefix="pn_cli_test_") try: # init @@ -40,7 +41,7 @@ def test_cli_init_and_clean(): shutil.rmtree(tmpdir, ignore_errors=True) -def test_cli_run_prepare_only_android_and_ios(): +def test_cli_run_prepare_only_android_and_ios() -> None: tmpdir = tempfile.mkdtemp(prefix="pn_cli_test_") try: # init to create app scaffold diff --git a/tests/test_smoke.py b/tests/test_smoke.py index f5c04c4..d346c62 100644 --- a/tests/test_smoke.py +++ b/tests/test_smoke.py @@ -1,2 +1,2 @@ -def test_pytest_workflow_smoke(): +def test_pytest_workflow_smoke() -> None: assert 2 + 2 == 4 From d236d899690a4033effdcab4862a556a742fa6d1 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Wed, 29 Oct 2025 13:55:18 -0700 Subject: [PATCH 04/12] feat(components): standardize fluent setters and align base signatures --- src/pythonnative/date_picker.py | 8 +++++--- src/pythonnative/image_view.py | 8 +++++--- src/pythonnative/material_button.py | 8 +++++--- src/pythonnative/material_date_picker.py | 8 +++++--- src/pythonnative/material_progress_view.py | 8 +++++--- src/pythonnative/material_search_bar.py | 8 +++++--- src/pythonnative/material_switch.py | 8 +++++--- src/pythonnative/material_time_picker.py | 8 +++++--- src/pythonnative/picker_view.py | 8 +++++--- src/pythonnative/progress_view.py | 8 +++++--- src/pythonnative/search_bar.py | 8 +++++--- src/pythonnative/switch.py | 8 +++++--- src/pythonnative/time_picker.py | 8 +++++--- src/pythonnative/web_view.py | 8 +++++--- 14 files changed, 70 insertions(+), 42 deletions(-) diff --git a/src/pythonnative/date_picker.py b/src/pythonnative/date_picker.py index 7d161bd..f357e03 100644 --- a/src/pythonnative/date_picker.py +++ b/src/pythonnative/date_picker.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "DatePickerBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, year: int = 0, month: int = 0, day: int = 0) -> self.native_instance = self.native_class(context) self.set_date(year, month, day) - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "DatePicker": self.native_instance.updateDate(year, month, day) + return self def get_date(self) -> tuple: year = self.native_instance.getYear() @@ -65,9 +66,10 @@ def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: self.native_instance = self.native_class.alloc().init() self.set_date(year, month, day) - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "DatePicker": date = datetime(year, month, day) self.native_instance.setDate_(date) + return self def get_date(self) -> tuple: date = self.native_instance.date() diff --git a/src/pythonnative/image_view.py b/src/pythonnative/image_view.py index 78cb1ff..c3b3d1a 100644 --- a/src/pythonnative/image_view.py +++ b/src/pythonnative/image_view.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_image(self, image: str) -> None: + def set_image(self, image: str) -> "ImageViewBase": pass @abstractmethod @@ -40,9 +40,10 @@ def __init__(self, image: str = "") -> None: if image: self.set_image(image) - def set_image(self, image: str) -> None: + def set_image(self, image: str) -> "ImageView": bitmap = BitmapFactory.decodeFile(image) self.native_instance.setImageBitmap(bitmap) + return self def get_image(self) -> str: # Please note that this is a simplistic representation, getting image from ImageView @@ -66,10 +67,11 @@ def __init__(self, image: str = "") -> None: if image: self.set_image(image) - def set_image(self, image: str) -> None: + def set_image(self, image: str) -> "ImageView": ns_str = NSString.alloc().initWithUTF8String_(image) ui_image = UIImage.imageNamed_(ns_str) self.native_instance.setImage_(ui_image) + return self def get_image(self) -> str: # Similar to Android, getting the image from UIImageView isn't straightforward. diff --git a/src/pythonnative/material_button.py b/src/pythonnative/material_button.py index 65a317b..5816e30 100644 --- a/src/pythonnative/material_button.py +++ b/src/pythonnative/material_button.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_title(self, title: str) -> None: + def set_title(self, title: str) -> "MaterialButtonBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, title: str = "") -> None: self.native_instance = self.native_class(context) self.set_title(title) - def set_title(self, title: str) -> None: + def set_title(self, title: str) -> "MaterialButton": self.native_instance.setText(title) + return self def get_title(self) -> str: return self.native_instance.getText().toString() @@ -60,8 +61,9 @@ def __init__(self, title: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_title(title) - def set_title(self, title: str) -> None: + def set_title(self, title: str) -> "MaterialButton": self.native_instance.setTitle_forState_(title, 0) + return self def get_title(self) -> str: return self.native_instance.titleForState_(0) diff --git a/src/pythonnative/material_date_picker.py b/src/pythonnative/material_date_picker.py index 0eadeec..f39ba3e 100644 --- a/src/pythonnative/material_date_picker.py +++ b/src/pythonnative/material_date_picker.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "MaterialDatePickerBase": pass @abstractmethod @@ -38,7 +38,7 @@ def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: self.set_date(year, month, day) self.native_instance = self.builder.build() - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "MaterialDatePicker": # MaterialDatePicker uses milliseconds since epoch to set date from java.util import Calendar @@ -46,6 +46,7 @@ def set_date(self, year: int, month: int, day: int) -> None: cal.set(year, month, day) milliseconds = cal.getTimeInMillis() self.builder.setSelection(milliseconds) + return self def get_date(self) -> tuple: # Convert selection (milliseconds since epoch) back to a date @@ -76,9 +77,10 @@ def __init__(self, year: int = 0, month: int = 0, day: int = 0) -> None: self.native_instance = self.native_class.alloc().init() self.set_date(year, month, day) - def set_date(self, year: int, month: int, day: int) -> None: + def set_date(self, year: int, month: int, day: int) -> "MaterialDatePicker": date = datetime(year, month, day) self.native_instance.setDate_(date) + return self def get_date(self) -> tuple: date = self.native_instance.date() diff --git a/src/pythonnative/material_progress_view.py b/src/pythonnative/material_progress_view.py index afc69c6..2b76275 100644 --- a/src/pythonnative/material_progress_view.py +++ b/src/pythonnative/material_progress_view.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "MaterialProgressViewBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any) -> None: self.native_instance = self.native_class(context) self.native_instance.setIndeterminate(False) - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "MaterialProgressView": self.native_instance.setProgress(int(progress * 100)) + return self def get_progress(self) -> float: return self.native_instance.getProgress() / 100.0 @@ -61,8 +62,9 @@ def __init__(self) -> None: 0 ) # 0: UIProgressViewStyleDefault - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "MaterialProgressView": self.native_instance.setProgress_animated_(progress, False) + return self def get_progress(self) -> float: return self.native_instance.progress() diff --git a/src/pythonnative/material_search_bar.py b/src/pythonnative/material_search_bar.py index 9be2e6f..950161c 100644 --- a/src/pythonnative/material_search_bar.py +++ b/src/pythonnative/material_search_bar.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "MaterialSearchBarBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, query: str = "") -> None: self.native_instance = self.native_class(context) self.set_query(query) - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "MaterialSearchBar": self.native_instance.setQuery(query, False) + return self def get_query(self) -> str: return self.native_instance.getQuery().toString() @@ -60,8 +61,9 @@ def __init__(self, query: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_query(query) - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "MaterialSearchBar": self.native_instance.set_searchText_(query) + return self def get_query(self) -> str: return self.native_instance.searchText() diff --git a/src/pythonnative/material_switch.py b/src/pythonnative/material_switch.py index 9ad31fe..20e9bab 100644 --- a/src/pythonnative/material_switch.py +++ b/src/pythonnative/material_switch.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "MaterialSwitchBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, value: bool = False) -> None: self.native_instance = self.native_class(context) self.set_on(value) - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "MaterialSwitch": self.native_instance.setChecked(value) + return self def is_on(self) -> bool: return self.native_instance.isChecked() @@ -60,8 +61,9 @@ def __init__(self, value: bool = False) -> None: self.native_instance = self.native_class.alloc().init() self.set_on(value) - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "MaterialSwitch": self.native_instance.setOn_animated_(value, False) + return self def is_on(self) -> bool: return self.native_instance.isOn() diff --git a/src/pythonnative/material_time_picker.py b/src/pythonnative/material_time_picker.py index 7ca3965..5829ca7 100644 --- a/src/pythonnative/material_time_picker.py +++ b/src/pythonnative/material_time_picker.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "MaterialTimePickerBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, hour: int = 0, minute: int = 0) -> None: self.native_instance = self.native_class(context) self.set_time(hour, minute) - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "MaterialTimePicker": self.native_instance.setTime(hour, minute) + return self def get_time(self) -> tuple: hour = self.native_instance.getHour() @@ -65,9 +66,10 @@ def __init__(self, hour: int = 0, minute: int = 0) -> None: self.native_instance.setDatePickerMode_(1) # Setting mode to Time self.set_time(hour, minute) - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "MaterialTimePicker": t = time(hour, minute) self.native_instance.setTime_(t) + return self def get_time(self) -> tuple: t = self.native_instance.time() diff --git a/src/pythonnative/picker_view.py b/src/pythonnative/picker_view.py index 07a5c64..7f1ae15 100644 --- a/src/pythonnative/picker_view.py +++ b/src/pythonnative/picker_view.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_selected(self, index: int) -> None: + def set_selected(self, index: int) -> "PickerViewBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, index: int = 0) -> None: self.native_instance = self.native_class(context) self.set_selected(index) - def set_selected(self, index: int) -> None: + def set_selected(self, index: int) -> "PickerView": self.native_instance.setSelection(index) + return self def get_selected(self) -> int: return self.native_instance.getSelectedItemPosition() @@ -60,8 +61,9 @@ def __init__(self, index: int = 0) -> None: self.native_instance = self.native_class.alloc().init() self.set_selected(index) - def set_selected(self, index: int) -> None: + def set_selected(self, index: int) -> "PickerView": self.native_instance.selectRow_inComponent_animated_(index, 0, False) + return self def get_selected(self) -> int: return self.native_instance.selectedRowInComponent_(0) diff --git a/src/pythonnative/progress_view.py b/src/pythonnative/progress_view.py index c1a08b3..5587170 100644 --- a/src/pythonnative/progress_view.py +++ b/src/pythonnative/progress_view.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "ProgressViewBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self) -> None: self.native_instance = self.native_class(context, None, jclass("android.R$attr").progressBarStyleHorizontal) self.native_instance.setIndeterminate(False) - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "ProgressView": self.native_instance.setProgress(int(progress * 100)) + return self def get_progress(self) -> float: return self.native_instance.getProgress() / 100.0 @@ -61,8 +62,9 @@ def __init__(self) -> None: 0 ) # 0: UIProgressViewStyleDefault - def set_progress(self, progress: float) -> None: + def set_progress(self, progress: float) -> "ProgressView": self.native_instance.setProgress_animated_(progress, False) + return self def get_progress(self) -> float: return self.native_instance.progress() diff --git a/src/pythonnative/search_bar.py b/src/pythonnative/search_bar.py index 257c401..ae33da1 100644 --- a/src/pythonnative/search_bar.py +++ b/src/pythonnative/search_bar.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "SearchBarBase": pass @abstractmethod @@ -39,8 +39,9 @@ def __init__(self, context: Any, query: str = "") -> None: self.native_instance = self.native_class(context) self.set_query(query) - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "SearchBar": self.native_instance.setQuery(query, False) + return self def get_query(self) -> str: return self.native_instance.getQuery().toString() @@ -60,8 +61,9 @@ def __init__(self, query: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.set_query(query) - def set_query(self, query: str) -> None: + def set_query(self, query: str) -> "SearchBar": self.native_instance.set_text_(query) + return self def get_query(self) -> str: return self.native_instance.text() diff --git a/src/pythonnative/switch.py b/src/pythonnative/switch.py index bdd38bc..55d95ba 100644 --- a/src/pythonnative/switch.py +++ b/src/pythonnative/switch.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "SwitchBase": pass @abstractmethod @@ -38,8 +38,9 @@ def __init__(self, value: bool = False) -> None: self.native_instance = self.native_class(context) self.set_on(value) - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "Switch": self.native_instance.setChecked(value) + return self def is_on(self) -> bool: return self.native_instance.isChecked() @@ -59,8 +60,9 @@ def __init__(self, value: bool = False) -> None: self.native_instance = self.native_class.alloc().init() self.set_on(value) - def set_on(self, value: bool) -> None: + def set_on(self, value: bool) -> "Switch": self.native_instance.setOn_animated_(value, False) + return self def is_on(self) -> bool: return self.native_instance.isOn() diff --git a/src/pythonnative/time_picker.py b/src/pythonnative/time_picker.py index 4088f7c..d9085b9 100644 --- a/src/pythonnative/time_picker.py +++ b/src/pythonnative/time_picker.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "TimePickerBase": pass @abstractmethod @@ -39,9 +39,10 @@ def __init__(self, context: Any, hour: int = 0, minute: int = 0) -> None: self.native_instance = self.native_class(context) self.set_time(hour, minute) - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "TimePicker": self.native_instance.setHour(hour) self.native_instance.setMinute(minute) + return self def get_time(self) -> tuple: hour = self.native_instance.getHour() @@ -66,9 +67,10 @@ def __init__(self, hour: int = 0, minute: int = 0) -> None: self.native_instance.setDatePickerMode_(1) # Setting mode to Time self.set_time(hour, minute) - def set_time(self, hour: int, minute: int) -> None: + def set_time(self, hour: int, minute: int) -> "TimePicker": t = time(hour, minute) self.native_instance.setTime_(t) + return self def get_time(self) -> tuple: t = self.native_instance.time() diff --git a/src/pythonnative/web_view.py b/src/pythonnative/web_view.py index ee3a16e..b72d51b 100644 --- a/src/pythonnative/web_view.py +++ b/src/pythonnative/web_view.py @@ -14,7 +14,7 @@ def __init__(self) -> None: super().__init__() @abstractmethod - def load_url(self, url: str) -> None: + def load_url(self, url: str) -> "WebViewBase": pass @@ -34,8 +34,9 @@ def __init__(self, url: str = "") -> None: self.native_instance = self.native_class(context) self.load_url(url) - def load_url(self, url: str) -> None: + def load_url(self, url: str) -> "WebView": self.native_instance.loadUrl(url) + return self else: # ======================================== @@ -52,7 +53,8 @@ def __init__(self, url: str = "") -> None: self.native_instance = self.native_class.alloc().init() self.load_url(url) - def load_url(self, url: str) -> None: + def load_url(self, url: str) -> "WebView": ns_url = NSURL.URLWithString_(url) request = NSURLRequest.requestWithURL_(ns_url) self.native_instance.loadRequest_(request) + return self From 593fee4fcf66678cb026de58115f959633d859b4 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Wed, 29 Oct 2025 14:18:14 -0700 Subject: [PATCH 05/12] refactor(components): declare abstract static wrap in ScrollViewBase --- src/pythonnative/scroll_view.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py index 57593c1..a079610 100644 --- a/src/pythonnative/scroll_view.py +++ b/src/pythonnative/scroll_view.py @@ -19,6 +19,12 @@ def __init__(self) -> None: def add_view(self, view: Any) -> None: pass + @staticmethod + @abstractmethod + def wrap(view: Any) -> "ScrollViewBase": + """Return a new ScrollView containing the provided view as its only child.""" + pass + if IS_ANDROID: # ======================================== From d7ac93be202161a5c8328816a5c6ff8a96dde1d5 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:45:23 -0700 Subject: [PATCH 06/12] fix(components,templates): restore hello-world on iOS and Android --- src/pythonnative/button.py | 2 +- src/pythonnative/scroll_view.py | 21 +++++++++++++++++-- .../android_template/app/build.gradle | 4 ++-- .../app/src/main/res/navigation/nav_graph.xml | 2 +- .../templates/android_template/build.gradle | 6 +++--- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/pythonnative/button.py b/src/pythonnative/button.py index 7c714a4..9d96904 100644 --- a/src/pythonnative/button.py +++ b/src/pythonnative/button.py @@ -79,7 +79,7 @@ class _PNButtonHandler(NSObject): # type: ignore[valid-type] _callback: Optional[Callable[[], None]] = None @objc_method - def onTap_(self, sender: Any) -> None: + def onTap_(self, sender: object) -> None: try: callback = self._callback if callback is not None: diff --git a/src/pythonnative/scroll_view.py b/src/pythonnative/scroll_view.py index a079610..b532cfe 100644 --- a/src/pythonnative/scroll_view.py +++ b/src/pythonnative/scroll_view.py @@ -72,9 +72,26 @@ def __init__(self) -> None: def add_view(self, view: Any) -> None: self.views.append(view) - # Ensure view is a subview of scrollview - if view.native_instance not in self.native_instance.subviews: + # Add as subview and size child to fill scroll view by default so content is visible + try: self.native_instance.addSubview_(view.native_instance) + except Exception: + pass + # Default layout: if the child has no size yet, size it to fill the scroll view + # and enable flexible width/height. If the child is already sized explicitly, + # leave it unchanged. + try: + frame = getattr(view.native_instance, "frame") + size = getattr(frame, "size", None) + width = getattr(size, "width", 0) if size is not None else 0 + height = getattr(size, "height", 0) if size is not None else 0 + if width <= 0 or height <= 0: + bounds = self.native_instance.bounds + view.native_instance.setFrame_(bounds) + # UIViewAutoresizingFlexibleWidth (2) | UIViewAutoresizingFlexibleHeight (16) + view.native_instance.setAutoresizingMask_(2 | 16) + except Exception: + pass @staticmethod def wrap(view: Any) -> "ScrollView": diff --git a/src/pythonnative/templates/android_template/app/build.gradle b/src/pythonnative/templates/android_template/app/build.gradle index 2fb8251..f23ab96 100644 --- a/src/pythonnative/templates/android_template/app/build.gradle +++ b/src/pythonnative/templates/android_template/app/build.gradle @@ -6,12 +6,12 @@ plugins { android { namespace 'com.pythonnative.android_template' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "com.pythonnative.android_template" minSdk 24 - targetSdk 33 + targetSdk 34 versionCode 1 versionName "1.0" diff --git a/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml b/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml index cbf90d7..182bed8 100644 --- a/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +++ b/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml @@ -16,7 +16,7 @@ + app:nullable="true" /> diff --git a/src/pythonnative/templates/android_template/build.gradle b/src/pythonnative/templates/android_template/build.gradle index ff78675..3d20b92 100644 --- a/src/pythonnative/templates/android_template/build.gradle +++ b/src/pythonnative/templates/android_template/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.0.2' apply false - id 'com.android.library' version '8.0.2' apply false - id 'org.jetbrains.kotlin.android' version '1.8.20' apply false + id 'com.android.application' version '8.2.2' apply false + id 'com.android.library' version '8.2.2' apply false + id 'org.jetbrains.kotlin.android' version '1.9.22' apply false id 'com.chaquo.python' version '14.0.2' apply false } \ No newline at end of file diff --git a/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties b/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties index f53bdea..bfe5fe7 100644 --- a/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +++ b/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Jun 19 11:09:16 PDT 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 0711683f5b56751027bb1a5a63ee2d9afcd4b620 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Thu, 5 Mar 2026 00:35:16 -0800 Subject: [PATCH 07/12] ci(workflows): add semantic-release pipeline and PR commit linting --- .commitlintrc.yml | 30 ++++++++++++++++ .github/workflows/pr-lint.yml | 46 ++++++++++++++++++++++++ .github/workflows/release.yml | 66 +++++++++++++++++++++++++++++------ CONTRIBUTING.md | 26 ++++++++++---- pyproject.toml | 27 ++++++++++++++ 5 files changed, 179 insertions(+), 16 deletions(-) create mode 100644 .commitlintrc.yml create mode 100644 .github/workflows/pr-lint.yml diff --git a/.commitlintrc.yml b/.commitlintrc.yml new file mode 100644 index 0000000..455e892 --- /dev/null +++ b/.commitlintrc.yml @@ -0,0 +1,30 @@ +extends: + - '@commitlint/config-conventional' + +rules: + type-enum: + - 2 + - always + - - build + - chore + - ci + - docs + - feat + - fix + - perf + - refactor + - revert + - style + - test + scope-case: + - 0 + subject-case: + - 0 + header-max-length: + - 1 + - always + - 100 + body-max-line-length: + - 0 + footer-max-line-length: + - 0 diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml new file mode 100644 index 0000000..f616d1a --- /dev/null +++ b/.github/workflows/pr-lint.yml @@ -0,0 +1,46 @@ +name: PR Lint + +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +permissions: + pull-requests: read + +jobs: + pr-title: + name: PR title (Conventional Commits) + runs-on: ubuntu-latest + steps: + - name: Validate PR title + uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + build + chore + ci + docs + feat + fix + perf + refactor + revert + style + test + requireScope: false + subjectPattern: ^[a-z].+[^.]$ + subjectPatternError: | + Subject "{subject}" must start with a lowercase letter and must not + end with a period. + Example: "feat(cli): add init subcommand" + + commits: + name: Commit messages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: wagoid/commitlint-github-action@v6 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 07450cc..38c8bfe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,31 +1,77 @@ -name: Release to PyPI +name: Release on: push: - tags: - - 'v*.*.*' + branches: [main] + workflow_dispatch: + +# ┌─────────────────────────────────────────────────────────────────┐ +# │ DRAFT_RELEASE │ +# │ │ +# │ "true" → GitHub Releases are created as drafts and PyPI │ +# │ publishing is skipped (burn-in / review period). │ +# │ "false" → GitHub Releases are published immediately and the │ +# │ package is uploaded to PyPI. │ +# │ │ +# │ Flip to "false" once you have verified the release output. │ +# └─────────────────────────────────────────────────────────────────┘ +env: + DRAFT_RELEASE: "true" jobs: - build-and-publish: + release: + name: Semantic Release runs-on: ubuntu-latest + if: >- + github.event_name == 'workflow_dispatch' || + !startsWith(github.event.head_commit.message, 'chore(release):') + concurrency: + group: release + cancel-in-progress: false permissions: - contents: read + contents: write id-token: write + steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' + + - name: Install build tools + run: python -m pip install -U pip build + + - name: Python Semantic Release + id: release + uses: python-semantic-release/python-semantic-release@v9 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Build package + if: steps.release.outputs.released == 'true' + run: python -m build - - name: Build sdist and wheel + - name: Create GitHub Release + if: steps.release.outputs.released == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - python -m pip install -U pip build - python -m build + if [ "$DRAFT_RELEASE" = "true" ]; then + DRAFT_FLAG="--draft" + fi + gh release create "${{ steps.release.outputs.tag }}" \ + ${DRAFT_FLAG:-} \ + --title "${{ steps.release.outputs.tag }}" \ + --generate-notes \ + dist/* - - name: Publish package to PyPI + - name: Publish to PyPI + if: steps.release.outputs.released == 'true' && env.DRAFT_RELEASE != 'true' uses: pypa/gh-action-pypi-publish@release/v1 with: skip-existing: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e0298c8..fe5b6ab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -205,19 +205,26 @@ Co-authored-by: Name ## Pull request checklist +- PR title: Conventional Commits format (CI-enforced by `pr-lint.yml`). - Tests: added/updated; `pytest` passes. - Lint/format: `ruff check .`, `black` pass. -- Docs: update `README.md` and any Django docs pages if behavior changes. +- Docs: update `README.md` if behavior changes. - Templates: update `templates/` if generator output changes. - No generated artifacts committed. ## Versioning and releases -- The library version is tracked in `pyproject.toml` (`project.version`). Use SemVer. -- Workflow: - - Contributors: branch off `main` (or `dev` if used) and open PRs. - - Maintainer (release): bump version, tag, and publish to PyPI. - - Tag on `main`: `git tag -a vX.Y.Z -m "Release vX.Y.Z" && git push --tags`. +- The version is tracked in `pyproject.toml` (`project.version`) and mirrored in `src/pythonnative/__init__.py` as `__version__`. Both files are updated automatically by [python-semantic-release](https://python-semantic-release.readthedocs.io/). +- **Automated release pipeline** (on every merge to `main`): + 1. `python-semantic-release` scans Conventional Commit messages since the last tag. + 2. It determines the next SemVer bump: `feat` → **minor**, `fix`/`perf` → **patch**, `BREAKING CHANGE` → **major** (minor while version < 1.0). + 3. Version files are updated, `CHANGELOG.md` is generated, and a tagged release commit (`chore(release): vX.Y.Z`) is pushed. + 4. A GitHub Release is created with auto-generated release notes and the built sdist/wheel attached. + 5. When drafts are disabled, the package is also published to PyPI via Trusted Publishing. +- **Draft / published toggle**: the `DRAFT_RELEASE` variable at the top of `.github/workflows/release.yml` controls release mode. Set to `"true"` (the default) for draft GitHub Releases with PyPI publishing skipped; flip to `"false"` to publish releases and upload to PyPI immediately. +- Commit types that trigger a release: `feat` (minor), `fix` and `perf` (patch), `BREAKING CHANGE` (major). All other types (`build`, `chore`, `ci`, `docs`, `refactor`, `revert`, `style`, `test`) are recorded in the changelog but do **not** trigger a release on their own. +- Tag format: `v`-prefixed (e.g., `v0.4.0`). +- Manual version bumps are no longer needed — just merge PRs with valid Conventional Commit titles. For ad-hoc runs, use the workflow's **Run workflow** button (`workflow_dispatch`). ### Branch naming (suggested) @@ -249,6 +256,13 @@ release/v0.2.0 hotfix/cli-regression ``` +### CI + +- **CI** (`ci.yml`): runs formatter, linter, type checker, and tests on every push and PR. +- **PR Lint** (`pr-lint.yml`): validates the PR title against Conventional Commits format (protects squash merges) and checks individual commit messages via commitlint (protects rebase merges). Recommended: add the **PR title** job as a required status check in branch-protection settings. +- **Release** (`release.yml`): runs on merge to `main`; computes version, generates changelog, tags, creates GitHub Release, and (when `DRAFT_RELEASE` is `"false"`) publishes to PyPI. +- **Docs** (`docs.yml`): deploys documentation to GitHub Pages on push to `main`. + ## Security and provenance - Avoid bundling secrets or credentials in templates or code. diff --git a/pyproject.toml b/pyproject.toml index 0cdbd85..5c99353 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -88,3 +88,30 @@ ignore = [] [tool.black] line-length = 120 target-version = ['py39'] + +# ── Semantic Release ──────────────────────────────────────────────── + +[tool.semantic_release] +version_toml = ["pyproject.toml:project.version"] +version_variables = ["src/pythonnative/__init__.py:__version__"] +commit_message = "chore(release): v{version}" +tag_format = "v{version}" +major_on_zero = false + +[tool.semantic_release.branches.main] +match = "main" +prerelease = false + +[tool.semantic_release.changelog] +changelog_file = "CHANGELOG.md" +exclude_commit_patterns = [ + "^chore\\(release\\):", +] + +[tool.semantic_release.commit_parser_options] +allowed_tags = [ + "build", "chore", "ci", "docs", "feat", "fix", + "perf", "refactor", "revert", "style", "test", +] +minor_tags = ["feat"] +patch_tags = ["fix", "perf"] From 1cd5393e7bf20d5350052cfaa81fd511dc4ca3ca Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Thu, 5 Mar 2026 03:16:31 -0800 Subject: [PATCH 08/12] ci(workflows): fix duplicate release, and use changelog for release notes --- .github/workflows/release.yml | 58 +++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 38c8bfe..470fdf4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,17 +3,19 @@ name: Release on: push: branches: [main] + release: + types: [published] workflow_dispatch: # ┌─────────────────────────────────────────────────────────────────┐ # │ DRAFT_RELEASE │ # │ │ -# │ "true" → GitHub Releases are created as drafts and PyPI │ -# │ publishing is skipped (burn-in / review period). │ -# │ "false" → GitHub Releases are published immediately and the │ -# │ package is uploaded to PyPI. │ +# │ "true" → GitHub Releases are created as drafts; review them │ +# │ on GitHub, then click "Publish" to trigger PyPI. │ +# │ "false" → GitHub Releases are published immediately, which │ +# │ automatically triggers the PyPI publish job. │ # │ │ -# │ Flip to "false" once you have verified the release output. │ +# │ Flip to "false" once you are comfortable with the pipeline. │ # └─────────────────────────────────────────────────────────────────┘ env: DRAFT_RELEASE: "true" @@ -22,9 +24,7 @@ jobs: release: name: Semantic Release runs-on: ubuntu-latest - if: >- - github.event_name == 'workflow_dispatch' || - !startsWith(github.event.head_commit.message, 'chore(release):') + if: github.event_name != 'release' concurrency: group: release cancel-in-progress: false @@ -51,11 +51,21 @@ jobs: uses: python-semantic-release/python-semantic-release@v9 with: github_token: ${{ secrets.GITHUB_TOKEN }} + vcs_release: "false" - name: Build package if: steps.release.outputs.released == 'true' run: python -m build + - name: Extract changelog for this release + if: steps.release.outputs.released == 'true' + id: changelog + run: | + TAG="${{ steps.release.outputs.tag }}" + VER="${TAG#v}" + # Extract the section between this version's header and the next + awk "/^## v${VER//./\\.} /{found=1; next} /^## v[0-9]/{if(found) exit} found" CHANGELOG.md > /tmp/release_notes.md + - name: Create GitHub Release if: steps.release.outputs.released == 'true' env: @@ -67,11 +77,39 @@ jobs: gh release create "${{ steps.release.outputs.tag }}" \ ${DRAFT_FLAG:-} \ --title "${{ steps.release.outputs.tag }}" \ - --generate-notes \ + --notes-file /tmp/release_notes.md \ dist/* - - name: Publish to PyPI + - name: Publish to PyPI (non-draft) if: steps.release.outputs.released == 'true' && env.DRAFT_RELEASE != 'true' uses: pypa/gh-action-pypi-publish@release/v1 with: skip-existing: true + + pypi-publish: + name: Publish to PyPI + runs-on: ubuntu-latest + if: github.event_name == 'release' && github.event.action == 'published' + permissions: + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.release.tag_name }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install build tools + run: python -m pip install -U pip build + + - name: Build package + run: python -m build + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip-existing: true From 11d50a75dff850a3855a299f38f5885cf15cefc6 Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Thu, 5 Mar 2026 03:24:57 -0800 Subject: [PATCH 09/12] ci(workflows): append detailed changes link to release notes --- .github/workflows/release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 470fdf4..137ffb9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,6 +65,12 @@ jobs: VER="${TAG#v}" # Extract the section between this version's header and the next awk "/^## v${VER//./\\.} /{found=1; next} /^## v[0-9]/{if(found) exit} found" CHANGELOG.md > /tmp/release_notes.md + PREV_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]' | sed -n '2p') + if [ -n "$PREV_TAG" ]; then + REPO="${{ github.repository }}" + printf '\n---\n\n**Detailed Changes**: [%s...%s](https://github.com/%s/compare/%s...%s)\n' \ + "$PREV_TAG" "$TAG" "$REPO" "$PREV_TAG" "$TAG" >> /tmp/release_notes.md + fi - name: Create GitHub Release if: steps.release.outputs.released == 'true' From 2766f244f84d359e1ae74a4b029e0701fad4b0be Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Thu, 5 Mar 2026 03:32:00 -0800 Subject: [PATCH 10/12] ci(workflows): simplify release pipeline to use python-semantic-release defaults --- .github/workflows/release.yml | 76 +---------------------------------- 1 file changed, 1 insertion(+), 75 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 137ffb9..20ac529 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,28 +3,12 @@ name: Release on: push: branches: [main] - release: - types: [published] workflow_dispatch: -# ┌─────────────────────────────────────────────────────────────────┐ -# │ DRAFT_RELEASE │ -# │ │ -# │ "true" → GitHub Releases are created as drafts; review them │ -# │ on GitHub, then click "Publish" to trigger PyPI. │ -# │ "false" → GitHub Releases are published immediately, which │ -# │ automatically triggers the PyPI publish job. │ -# │ │ -# │ Flip to "false" once you are comfortable with the pipeline. │ -# └─────────────────────────────────────────────────────────────────┘ -env: - DRAFT_RELEASE: "true" - jobs: release: name: Semantic Release runs-on: ubuntu-latest - if: github.event_name != 'release' concurrency: group: release cancel-in-progress: false @@ -51,71 +35,13 @@ jobs: uses: python-semantic-release/python-semantic-release@v9 with: github_token: ${{ secrets.GITHUB_TOKEN }} - vcs_release: "false" - name: Build package if: steps.release.outputs.released == 'true' run: python -m build - - name: Extract changelog for this release - if: steps.release.outputs.released == 'true' - id: changelog - run: | - TAG="${{ steps.release.outputs.tag }}" - VER="${TAG#v}" - # Extract the section between this version's header and the next - awk "/^## v${VER//./\\.} /{found=1; next} /^## v[0-9]/{if(found) exit} found" CHANGELOG.md > /tmp/release_notes.md - PREV_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]' | sed -n '2p') - if [ -n "$PREV_TAG" ]; then - REPO="${{ github.repository }}" - printf '\n---\n\n**Detailed Changes**: [%s...%s](https://github.com/%s/compare/%s...%s)\n' \ - "$PREV_TAG" "$TAG" "$REPO" "$PREV_TAG" "$TAG" >> /tmp/release_notes.md - fi - - - name: Create GitHub Release - if: steps.release.outputs.released == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - if [ "$DRAFT_RELEASE" = "true" ]; then - DRAFT_FLAG="--draft" - fi - gh release create "${{ steps.release.outputs.tag }}" \ - ${DRAFT_FLAG:-} \ - --title "${{ steps.release.outputs.tag }}" \ - --notes-file /tmp/release_notes.md \ - dist/* - - - name: Publish to PyPI (non-draft) - if: steps.release.outputs.released == 'true' && env.DRAFT_RELEASE != 'true' - uses: pypa/gh-action-pypi-publish@release/v1 - with: - skip-existing: true - - pypi-publish: - name: Publish to PyPI - runs-on: ubuntu-latest - if: github.event_name == 'release' && github.event.action == 'published' - permissions: - id-token: write - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.release.tag_name }} - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - name: Install build tools - run: python -m pip install -U pip build - - - name: Build package - run: python -m build - - name: Publish to PyPI + if: steps.release.outputs.released == 'true' uses: pypa/gh-action-pypi-publish@release/v1 with: skip-existing: true From 7c083f4e38367c6cd4163e0be8c78da1fdf8d3da Mon Sep 17 00:00:00 2001 From: Owen Carey <37121709+owenthcarey@users.noreply.github.com> Date: Tue, 17 Mar 2026 20:37:14 -0700 Subject: [PATCH 11/12] docs(repo): rewrite README with banner, structured sections, and badges --- .gitignore | 3 ++ LICENSE | 2 +- README.md | 95 ++++++++++++++++++++++++++++++++++------- docs/assets/banner.jpg | Bin 0 -> 217297 bytes 4 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 docs/assets/banner.jpg diff --git a/.gitignore b/.gitignore index c5de671..4f1c160 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,6 @@ cython_debug/ # Metadata *_metadata.json + +# macOS +.DS_Store diff --git a/LICENSE b/LICENSE index 18fff31..ad12cea 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 PythonNative +Copyright (c) 2026 Owen Carey Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 31f005c..28f1672 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,80 @@ -## PythonNative - -[![CI](https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/ci.yml) -[![Docs](https://github.com/pythonnative/pythonnative/actions/workflows/docs.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/docs.yml) -[![Release](https://github.com/pythonnative/pythonnative/actions/workflows/release.yml/badge.svg)](https://github.com/pythonnative/pythonnative/actions/workflows/release.yml) -[![PyPI - Version](https://img.shields.io/pypi/v/pythonnative)](https://pypi.org/project/pythonnative/) -[![Python Versions](https://img.shields.io/pypi/pyversions/pythonnative)](https://pypi.org/project/pythonnative/) -[![License: MIT](https://img.shields.io/pypi/l/pythonnative)](LICENSE) -[![Docs Site](https://img.shields.io/website?url=https%3A%2F%2Fdocs.pythonnative.com&label=docs)](https://docs.pythonnative.com/) - -PythonNative is a cross‑platform toolkit for building native Android and iOS -apps in Python. It provides a Pythonic API for native UI components, -lifecycle events, and device capabilities, powered by Rubicon (iOS) and -Chaquopy (Android). For guides, API reference, and examples, see the -[docs](https://docs.pythonnative.com/). +

+ PythonNative +

+ +

+ Build native Android and iOS apps in Python. +

+ +

+ CI + Release + PyPI Version + Python Versions + License: MIT + Docs +

+ +

+ Documentation · + Getting Started · + Examples · + Contributing +

+ +--- + +## Overview + +PythonNative is a cross-platform toolkit for building native Android and iOS apps in Python. It provides a Pythonic API for native UI components, lifecycle events, and device capabilities, powered by Chaquopy on Android and rubicon-objc on iOS. Write your app once in Python and run it on both platforms with genuinely native interfaces. + +## Features + +- **Cross-platform native UI:** Build Android and iOS apps from a single Python codebase with truly native rendering. +- **Direct native bindings:** Python calls platform APIs directly through Chaquopy and rubicon-objc, with no JavaScript bridge. +- **Unified component API:** Components like `Page`, `StackView`, `Label`, `Button`, and `WebView` share a consistent interface across platforms. +- **CLI scaffolding:** `pn init` creates a ready-to-run project structure; `pn run android` and `pn run ios` build and launch your app. +- **Page lifecycle:** Hooks for `on_create`, `on_start`, `on_resume`, `on_pause`, `on_stop`, and `on_destroy`, with state save and restore. +- **Navigation:** Push and pop screens with argument passing for multi-page apps. +- **Rich component set:** Core views (Label, Button, TextField, ImageView, WebView, Switch, DatePicker, and more) plus Material Design variants. +- **Bundled templates:** Android Gradle and iOS Xcode templates are included, so scaffolding requires no network access. + +## Quick Start + +### Installation + +```bash +pip install pythonnative +``` + +### Usage + +```python +import pythonnative as pn + + +class MainPage(pn.Page): + def __init__(self, native_instance): + super().__init__(native_instance) + + def on_create(self): + super().on_create() + stack = pn.StackView() + stack.add_view(pn.Label("Hello from PythonNative!")) + button = pn.Button("Tap me") + button.set_on_click(lambda: print("Button tapped")) + stack.add_view(button) + self.set_root_view(stack) +``` + +## Documentation + +Visit [docs.pythonnative.com](https://docs.pythonnative.com/) for the full documentation, including getting started guides, platform-specific instructions for Android and iOS, API reference, and working examples. + +## Contributing + +Contributions are welcome. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, coding standards, and guidelines for submitting pull requests. + +## License + +[MIT](LICENSE) diff --git a/docs/assets/banner.jpg b/docs/assets/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7c4c0477c6f669e85980679ed5147f469cccdbf GIT binary patch literal 217297 zcmb5VcQ~8x8#bO05nJrth)}ymj2dl>5JhcGj0!^Sq7+rFy+;zGMytf$L{VwA)M%_$ zteP!~qOH=U`}529J%0bZf4)zi0cHSJ7MA~=%mc(c*&u9eAP^fTJ3AP{&B@Kp#mU9R!z;kg!wco*;^G(KhYAV_ z3k!4eiHeB`i3tb^3;pjRKvw1)5E};@8;1}N7mv{Y^YPyx019Dg0HauePyh=Q$O;Ai zHv*7h#tC8t{x9DD|6m0GSwL)Hb_fS2bKILB0AytWF{5T@=Kz5r06rjqg%t#41Iuc% z3z!Hxct=2l;7KG7EmOzpt|4JLpU7k~Lj<91=0u@x9?4&Oc8oMfyZCmCD(E<;6xPg& z5mJZeYQ;}SMW+>)JowC9LYjF+mj5dRW(3Ry{}%#t*peA7GXz!;1jNR|_P<;Be}cv4NaSc zi|0LgR14~TQi1_V-WE#F$|KWd!L=CMuv$-6OqZZt7Ux-ooNzV{t$=FEz$wNsfj z@~oVrg=ezQjHrqjYVluBlxQa8Ta_JvHAit0JX_D2K(~88+WmMk+VU#sMB)m&8~LZ& z)JK{735{pJCjabK68M6+0gQy=Yf=3WTBeBGw2&mCmrqi)S)RP6CW4(i4VY#)&GZOJ z#{5+NtYvmFa~%5Ioeey$ZkB#P%mPM1BB%l^wh-3)S1#Rsc~|4^Q^^jy3ki|!Z}8_n z9jn#fH(6{h+*X==RR8W!Pj36s=yo7D*g10>5wZYqPiusRDg1z;=@k@$wPqI*J{8)R zO)%|*`K!oGJIAteT|QiCem%u)@blqc{@l&YYZCd9ujxDb-~F4$4(_RTJn9X&I*mUJ z_;bm&VV|eR?fu%5{{X%fPZw&0_Ew&TJb81CcacwLDRNmVq1k5Zf5neh%%-AbEf<3c00{IF_ie1+(l3s{I5M!4v zw9&g@$HTNX>en3Zlp*JBEAuWP<=#mLZ<6xeEP1k>=A1d9_+z%_qskB=_>Nv?D|tml zD_%_b&yLh3KcR%`e~Y&452M{VuiJidC>1^^QH5Zah|e!yu)<0HUsQ4kM;95wAdgF9YZi(pKBmgd0~VMsy_G0giUZKs;^+83UeDr2oxs?lxZtRC6NCX+ zXNI*3RLV(5>C2x(olApB1tdy*$3S84Ygq$Ik5o<*F+P(u@WD-5&>anTz6s_JR3&n* zRs+UXs`%+Lmb)h~b1Q=?FbxFb%Lc>;B#Na1b-D7KQE#ZlF>RYB`Fdp5<@@Rxe`C}y zf4?7dDJ$}drJvK|x{PV@m>>w2;qQw+>nm~6T1rjNE+~j5W=p6HRJ3fl4xa5>w`t`F zZLclk=I>v?X+mWg5TM8r(iug8uBBUA!UK;$d`t;aRA1PP(aG+K%Ly*Hjd)Jg2WN zf-f|+^WpD^`=|JXll1kCw3W3Sap=zrI3x?^t5TKn6GKm14$1@4o=X=&+~xT4!8~27 z z==Jmk{H2>WY5{aA-uw9Ex=gkHzvgy5uQ&g!J3mZ4-3l@rJ97}Z^5^#E<{1vT2lUlD zamBC9cb7f4UUB{?rrsS6r{W!_qPAYBz~#@dDWQjOP|Y&iw_d_QvWa#Q(n1U{aJb(J zB3NEJ^cYYM#cgeET5%Nnh3#*nq}ByZLA%Q!lgcIvrv13u)jWaoaINJ6J(0*mkj>{w z;vm9xX#BE+H1K(~85W-2J>U=rkOjDm)a1(`o5}@Ozw2%pV7Ue*-gp0>-Ec-EOT(|RNuZHx6kDr0kaLb}0Y(;!RiPre3uzi4Q zP9WiDCc^jDcB*)u$R`It4Iwe!D~d+|&yd{+Uw1@YSZ(~wEr6dtD6ztK35E$Ea_n=s za1N)*OYm=oB1UCI5-F)fvekd`ZC9kGU;c8WJc2Q2hM29yQUXcaUjsn*`w@aku6z}lO0grJX zK*|oHGJq^9KG-5L3uza3`$KHtTdngWyp?|ot@=`tGzmMN#@*(IwkhG1pSwy*M6bOu z-ju&l!0Ri1yoVJPyZ_R8*1o8JjI`J_U6TVi

X)$oT+zgsx+_!Y#@Kwj+w5YQv(* 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 Vqd+34D`9vpH%M~%V8H*@{|`ntU0nbG literal 0 HcmV?d00001 From e00f10ef85e741fd882f9bf22dcde42eacc53fe5 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 18 Mar 2026 05:46:36 +0000 Subject: [PATCH 12/12] chore(release): v0.4.0 --- CHANGELOG.md | 163 +++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- src/pythonnative/__init__.py | 2 +- 3 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..430eac1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,163 @@ +# CHANGELOG + + +## v0.4.0 (2026-03-18) + +### Bug Fixes + +- **components,templates**: Restore hello-world on iOS and Android + ([`d7ac93b`](https://github.com/pythonnative/pythonnative/commit/d7ac93be202161a5c8328816a5c6ff8a96dde1d5)) + +### Continuous Integration + +- **workflows**: Add semantic-release pipeline and PR commit linting + ([`0711683`](https://github.com/pythonnative/pythonnative/commit/0711683f5b56751027bb1a5a63ee2d9afcd4b620)) + +- **workflows**: Append detailed changes link to release notes + ([`11d50a7`](https://github.com/pythonnative/pythonnative/commit/11d50a75dff850a3855a299f38f5885cf15cefc6)) + +- **workflows**: Fix duplicate release, and use changelog for release notes + ([`1cd5393`](https://github.com/pythonnative/pythonnative/commit/1cd5393e7bf20d5350052cfaa81fd511dc4ca3ca)) + +- **workflows**: Simplify release pipeline to use python-semantic-release defaults + ([`2766f24`](https://github.com/pythonnative/pythonnative/commit/2766f244f84d359e1ae74a4b029e0701fad4b0be)) + +### Documentation + +- **repo**: Rewrite README with banner, structured sections, and badges + ([`7c083f4`](https://github.com/pythonnative/pythonnative/commit/7c083f4e38367c6cd4163e0be8c78da1fdf8d3da)) + +- **repo**: Simplify README with badges and one-paragraph overview + ([`3ac84b1`](https://github.com/pythonnative/pythonnative/commit/3ac84b1a3f541b47121b46a687b78826f8d348f9)) + +### Features + +- **components**: Standardize fluent setters and align base signatures + ([`d236d89`](https://github.com/pythonnative/pythonnative/commit/d236d899690a4033effdcab4862a556a742fa6d1)) + +- **components,core**: Add layout/styling APIs and fluent setters + ([`6962d38`](https://github.com/pythonnative/pythonnative/commit/6962d3881bf091b3494fc2c964f7ea65a99ce606)) + +### Refactoring + +- **components**: Declare abstract static wrap in ScrollViewBase + ([`593fee4`](https://github.com/pythonnative/pythonnative/commit/593fee4fcf66678cb026de58115f959633d859b4)) + +- **core,components,examples**: Add annotations; tighten mypy + ([`86e4ffc`](https://github.com/pythonnative/pythonnative/commit/86e4ffc9e51810997006055434783416784c182f)) + + +## v0.3.0 (2025-10-22) + +### Build System + +- **repo**: Remove invalid PyPI classifier + ([`c8552e1`](https://github.com/pythonnative/pythonnative/commit/c8552e137e0176c0f5c61193e786429e2e93ac7c)) + +### Chores + +- **experiments**: Remove experiments directory + ([`caf6993`](https://github.com/pythonnative/pythonnative/commit/caf69936e085a3f487123ebcb3a6d807fefcc66c)) + +- **repo,core,mkdocs**: Bump version to 0.3.0 + ([`64d7c1c`](https://github.com/pythonnative/pythonnative/commit/64d7c1cfb448797305efc7f4014e56584f92fc1a)) + +### Documentation + +- **mkdocs**: Add Architecture page + ([`6d61ffc`](https://github.com/pythonnative/pythonnative/commit/6d61ffc64ca5db8ae688d09a748ddda2a1bc0af6)) + +### Features + +- **core,templates**: Add push/pop navigation and lifecycle wiring + ([`06ea22d`](https://github.com/pythonnative/pythonnative/commit/06ea22d215a1700685a7ca8070ca2189895ed25c)) + +- **templates,core**: Adopt Fragment-based Android navigation + ([`7a3a695`](https://github.com/pythonnative/pythonnative/commit/7a3a695477ece3cf76afd00f203523990f8789df)) + + +## v0.2.0 (2025-10-14) + +### Build System + +- **templates,cli**: Ship template dirs with package; drop zip artifacts + ([`7725b14`](https://github.com/pythonnative/pythonnative/commit/7725b1462c42d89f27fb4d3d733e73177c55d8ac)) + +### Chores + +- Clean up + ([`6c7a882`](https://github.com/pythonnative/pythonnative/commit/6c7a882895691903457a0a94d33192b6018c77fd)) + +- **core,components,cli**: Align lint, typing, and tests with CI + ([`30037d1`](https://github.com/pythonnative/pythonnative/commit/30037d17ad397952a88e3dfeb8bd003ced7319d8)) + +- **experiments**: Remove unused experiment directories + ([`db06fd1`](https://github.com/pythonnative/pythonnative/commit/db06fd101789392deee8c37263a61ee4d7106853)) + +- **repo,ci,docs**: Rename demo to examples/hello-world and update refs + ([`6d5b78e`](https://github.com/pythonnative/pythonnative/commit/6d5b78ea7dce66b5031b952928aed8d4a713fae8)) + +- **repo,core,mkdocs**: Bump version to 0.2.0 + ([`d3f8d31`](https://github.com/pythonnative/pythonnative/commit/d3f8d31942c3ca5d1657024e3a5cb332787afcd8)) + +- **templates**: Scrub DEVELOPMENT_TEAM from iOS template + ([`64ab266`](https://github.com/pythonnative/pythonnative/commit/64ab2666fe09f036934d3922ab55e8e599df3c35)) + +### Continuous Integration + +- **workflows,mkdocs**: Set CNAME to docs.pythonnative.com for docs deploy + ([`401a076`](https://github.com/pythonnative/pythonnative/commit/401a076dcb1fe0c19771f4a19141ee8da28c80e2)) + +### Documentation + +- **mkdocs**: Add roadmap and link in nav + ([`16ede97`](https://github.com/pythonnative/pythonnative/commit/16ede972d41b549853962c7056b65558c9ebd2f5)) + +- **mkdocs**: Update Getting Started, Hello World, Components, and platform guides + ([`f3a03b0`](https://github.com/pythonnative/pythonnative/commit/f3a03b01986365063535a2f336793cc6f21836db)) + +- **repo**: Add CONTRIBUTING.md + ([`f61cb85`](https://github.com/pythonnative/pythonnative/commit/f61cb85301c7bff57299b4c814319e9262f0f5ef)) + +### Features + +- Update README + ([`e839585`](https://github.com/pythonnative/pythonnative/commit/e8395855acf5d38a0e5987475900f4eeb1eee313)) + +- **cli,mkdocs,tests**: Add pn init/run/clean; use bundled templates + ([`9c61757`](https://github.com/pythonnative/pythonnative/commit/9c61757713fe60b5e98756f552681a782f397f3a)) + +- **cli,templates**: Auto-select iOS sim; guard PythonKit + ([`7b7c59c`](https://github.com/pythonnative/pythonnative/commit/7b7c59c262f2510a5fb46e455c13a2fc56086845)) + +- **cli,templates**: Bundle offline templates; add run --prepare-only + ([`d9dd821`](https://github.com/pythonnative/pythonnative/commit/d9dd821bc18289f1f1a367e737cfe7d5bfaf6ee3)) + +- **cli,templates**: Dev-first templates; stage in-repo lib for pn run + ([`b3dd731`](https://github.com/pythonnative/pythonnative/commit/b3dd731bd5efcca8e1a47f8f888fc6123854a40c)) + +- **cli,templates,core**: Bootstrap entrypoint; pn run shows Hello UI + ([`2805e1d`](https://github.com/pythonnative/pythonnative/commit/2805e1d5c6a58eb718b94ba0ce57c1078a08d578)) + +- **cli,templates,core**: Fetch iOS Python runtime and bootstrap PythonKit + ([`bcc0916`](https://github.com/pythonnative/pythonnative/commit/bcc0916a5b7427874ab7a5971a6a9941c4222c77)) + +- **components,utils**: Unify constructors; set Android context + ([`4c06b67`](https://github.com/pythonnative/pythonnative/commit/4c06b67214ea7fc4530a0d39b7105cfb62d20cf5)) + +- **repo,mkdocs,workflows**: Migrate to src layout; add pyproject and docs scaffold + ([`f273922`](https://github.com/pythonnative/pythonnative/commit/f273922e8a0494df7ba2cd59a3ad2ef54f918d3e)) + +### Refactoring + +- **cli**: Make pn.py typing py3.9-compatible and wrap long lines + ([`b38da78`](https://github.com/pythonnative/pythonnative/commit/b38da78dac52e42968efa6f4115b6b84de65b3b5)) + +- **components,core**: Align component names with docs + ([`a326ceb`](https://github.com/pythonnative/pythonnative/commit/a326ceb23c2cfaba409f11451a1c0000f0afbf5e)) + + +## v0.1.0 (2025-10-14) + + +## v0.0.1 (2025-10-14) diff --git a/pyproject.toml b/pyproject.toml index 5c99353..95432b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pythonnative" -version = "0.3.0" +version = "0.4.0" description = "Cross-platform native UI toolkit for Android and iOS" authors = [ { name = "Owen Carey" } diff --git a/src/pythonnative/__init__.py b/src/pythonnative/__init__.py index 1e2530d..a185962 100644 --- a/src/pythonnative/__init__.py +++ b/src/pythonnative/__init__.py @@ -1,7 +1,7 @@ from importlib import import_module from typing import Any, Dict -__version__ = "0.3.0" +__version__ = "0.4.0" __all__ = [ "ActivityIndicatorView",