ndev-stack 0.3.10__tar.gz → 0.3.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/PKG-INFO +1 -1
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/__init__.py +1 -1
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/tui.py +13 -10
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/PKG-INFO +1 -1
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/pyproject.toml +1 -1
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/tests/test_opensuse_compat.py +38 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/README.md +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/__main__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/cli.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/config.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/constants.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/distro.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/github.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/logger.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/manifest.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/base.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mailpit/manifest.json +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mailpit/module.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mongodb/manifest.json +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mongodb/module.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/postgres/manifest.json +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/postgres/module.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/redis/manifest.json +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/redis/module.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/manager.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/utils.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/manager.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/packages.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/shell.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/cli.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/available.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/clean.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/ctl.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/current.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/db.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/doctor.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/grok.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/install.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/list.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/logs.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/mailpit.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/modules.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/mongodb.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/postgres.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/reload.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/restart.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/setup.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/start.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/status.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/stop.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/uninstall.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/update.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/upgrade.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/use.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/vhost.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/builder.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/downloader.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/extensions.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/installer.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/resolver.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/templates.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/fpm.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/mailpit.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/nginx_helper.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/pma.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/process.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/services.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/sockets.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/upgrade.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/main.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/tui.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/bin/shim.exe +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/cli.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/commands/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/__init__.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/db.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/elevate.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/ext.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/fcgi.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/grok.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/logs.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/mailpit.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/mkcert.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/paths.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/php.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/pma.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/redis_core.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/services.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/setup.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/shim.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/upgrade.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/vhost.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/templates/vhost.conf.tmpl +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/templates/vhost_ssl.conf.tmpl +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/tui.py +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/SOURCES.txt +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/dependency_links.txt +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/entry_points.txt +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/requires.txt +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/top_level.txt +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/setup.cfg +0 -0
- {ndev_stack-0.3.10 → ndev_stack-0.3.11}/tests/test_shim.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ndev-stack
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.11
|
|
4
4
|
Summary: Cross-platform developer stack manager for PHP, FastCGI/PHP-FPM, MariaDB, Redis, PostgreSQL, MongoDB, Nginx, SSL, and Mailpit on Linux and Windows
|
|
5
5
|
Author-email: Ankit Karan <ankit.karan99@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/ankitkaran99/ndev
|
|
@@ -361,7 +361,7 @@ class CreateVhostModal(ModalScreen[Optional[dict]]):
|
|
|
361
361
|
if not root and domain:
|
|
362
362
|
root = str(Path.home() / "Sites" / domain)
|
|
363
363
|
php_val = self.query_one("#select-vhost-php", Select).value
|
|
364
|
-
php_ver = str(php_val) if (php_val is not None and php_val != Select.BLANK) else self.default_php
|
|
364
|
+
php_ver = str(php_val) if (php_val is not None and php_val != Select.BLANK and php_val != getattr(Select, "NULL", None)) else self.default_php
|
|
365
365
|
ssl = self.query_one("#chk-vhost-ssl", Checkbox).value
|
|
366
366
|
|
|
367
367
|
if not domain:
|
|
@@ -474,7 +474,7 @@ class InstallPhpModal(ModalScreen[Optional[dict]]):
|
|
|
474
474
|
if event.button.id == "btn-modal-install":
|
|
475
475
|
custom = self.query_one("#input-custom-ver", Input).value.strip()
|
|
476
476
|
sel_val = self.query_one("#select-php-ver", Select).value
|
|
477
|
-
selected = str(sel_val) if (sel_val is not None and sel_val != Select.BLANK) else "8.4.25"
|
|
477
|
+
selected = str(sel_val) if (sel_val is not None and sel_val != Select.BLANK and sel_val != getattr(Select, "NULL", None)) else "8.4.25"
|
|
478
478
|
version = custom if custom else selected
|
|
479
479
|
|
|
480
480
|
self.dismiss({
|
|
@@ -1430,19 +1430,22 @@ class NdevDashboard(App):
|
|
|
1430
1430
|
self.log_message(f"[bold red]✗ Failed to install {key}: {e}[/bold red]")
|
|
1431
1431
|
self.notify(f"Installation failed: {e}", severity="error")
|
|
1432
1432
|
|
|
1433
|
-
|
|
1434
|
-
async def on_select_changed(self, event: Select.Changed) -> None:
|
|
1433
|
+
def on_select_changed(self, event: Select.Changed) -> None:
|
|
1435
1434
|
"""Handle PHP version switcher or log selector dropdown changes."""
|
|
1436
1435
|
if self._updating_selects:
|
|
1437
1436
|
return
|
|
1438
1437
|
|
|
1439
|
-
|
|
1440
|
-
|
|
1438
|
+
val = event.value
|
|
1439
|
+
if val in (Select.BLANK, getattr(Select, "NULL", None), None) or not isinstance(val, str):
|
|
1440
|
+
return
|
|
1441
|
+
|
|
1442
|
+
if event.select.id == "select-php-version":
|
|
1443
|
+
target_version = val.strip()
|
|
1441
1444
|
curr = CURRENT_LINK.resolve().name if (CURRENT_LINK.exists() or CURRENT_LINK.is_symlink()) else None
|
|
1442
|
-
if target_version != curr:
|
|
1443
|
-
|
|
1445
|
+
if target_version and target_version != curr and (PHP_DIR / target_version).exists():
|
|
1446
|
+
self._switch_php_version(target_version)
|
|
1444
1447
|
|
|
1445
|
-
elif event.select.id == "select-log-file"
|
|
1448
|
+
elif event.select.id == "select-log-file":
|
|
1446
1449
|
self._handle_tail_log()
|
|
1447
1450
|
|
|
1448
1451
|
def _handle_tail_log(self) -> None:
|
|
@@ -1450,7 +1453,7 @@ class NdevDashboard(App):
|
|
|
1450
1453
|
self.query_one(TabbedContent).active = "tab-logs"
|
|
1451
1454
|
log_select = self.query_one("#select-log-file", Select)
|
|
1452
1455
|
log_name = log_select.value
|
|
1453
|
-
if not log_name or log_name
|
|
1456
|
+
if not log_name or log_name in (Select.BLANK, getattr(Select, "NULL", None)):
|
|
1454
1457
|
if self._available_logs:
|
|
1455
1458
|
first_key = sorted(self._available_logs.keys())[0]
|
|
1456
1459
|
self._updating_selects = True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ndev-stack
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.11
|
|
4
4
|
Summary: Cross-platform developer stack manager for PHP, FastCGI/PHP-FPM, MariaDB, Redis, PostgreSQL, MongoDB, Nginx, SSL, and Mailpit on Linux and Windows
|
|
5
5
|
Author-email: Ankit Karan <ankit.karan99@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/ankitkaran99/ndev
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ndev-stack"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.11"
|
|
8
8
|
description = "Cross-platform developer stack manager for PHP, FastCGI/PHP-FPM, MariaDB, Redis, PostgreSQL, MongoDB, Nginx, SSL, and Mailpit on Linux and Windows"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -443,5 +443,43 @@ class TestPhpDevelPackagesAndBuilder(unittest.TestCase):
|
|
|
443
443
|
self.assertEqual(resolve_installed_version("7.4"), "7.4")
|
|
444
444
|
|
|
445
445
|
|
|
446
|
+
class TestTuiSelectEventHandling(unittest.TestCase):
|
|
447
|
+
def test_on_select_changed_handles_null_and_blank(self):
|
|
448
|
+
from ndev.linux.tui import NdevDashboard
|
|
449
|
+
from textual.widgets import Select
|
|
450
|
+
|
|
451
|
+
app = NdevDashboard()
|
|
452
|
+
app._switch_php_version = MagicMock()
|
|
453
|
+
|
|
454
|
+
# Mock Select.Changed with Select.NULL
|
|
455
|
+
mock_event_null = MagicMock()
|
|
456
|
+
mock_event_null.select.id = "select-php-version"
|
|
457
|
+
mock_event_null.value = getattr(Select, "NULL", None)
|
|
458
|
+
|
|
459
|
+
app.on_select_changed(mock_event_null)
|
|
460
|
+
app._switch_php_version.assert_not_called()
|
|
461
|
+
|
|
462
|
+
# Mock Select.Changed with Select.BLANK
|
|
463
|
+
mock_event_blank = MagicMock()
|
|
464
|
+
mock_event_blank.select.id = "select-php-version"
|
|
465
|
+
mock_event_blank.value = Select.BLANK
|
|
466
|
+
|
|
467
|
+
app.on_select_changed(mock_event_blank)
|
|
468
|
+
app._switch_php_version.assert_not_called()
|
|
469
|
+
|
|
470
|
+
# Mock Select.Changed with valid version
|
|
471
|
+
mock_event_valid = MagicMock()
|
|
472
|
+
mock_event_valid.select.id = "select-php-version"
|
|
473
|
+
mock_event_valid.value = "8.4.27"
|
|
474
|
+
|
|
475
|
+
with patch("ndev.linux.tui.PHP_DIR") as mock_php_dir:
|
|
476
|
+
mock_php_dir.__truediv__.return_value.exists.return_value = True
|
|
477
|
+
with patch("ndev.linux.tui.CURRENT_LINK") as mock_link:
|
|
478
|
+
mock_link.resolve.return_value.name = "8.2.35"
|
|
479
|
+
mock_link.exists.return_value = True
|
|
480
|
+
app.on_select_changed(mock_event_valid)
|
|
481
|
+
app._switch_php_version.assert_called_once_with("8.4.27")
|
|
482
|
+
|
|
483
|
+
|
|
446
484
|
if __name__ == "__main__":
|
|
447
485
|
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|