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.
Files changed (106) hide show
  1. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/PKG-INFO +1 -1
  2. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/__init__.py +1 -1
  3. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/tui.py +13 -10
  4. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/PKG-INFO +1 -1
  5. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/pyproject.toml +1 -1
  6. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/tests/test_opensuse_compat.py +38 -0
  7. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/README.md +0 -0
  8. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/__main__.py +0 -0
  9. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/cli.py +0 -0
  10. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/__init__.py +0 -0
  11. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/config.py +0 -0
  12. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/constants.py +0 -0
  13. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/distro.py +0 -0
  14. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/github.py +0 -0
  15. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/logger.py +0 -0
  16. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/manifest.py +0 -0
  17. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/__init__.py +0 -0
  18. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/base.py +0 -0
  19. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mailpit/manifest.json +0 -0
  20. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mailpit/module.py +0 -0
  21. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mongodb/manifest.json +0 -0
  22. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/mongodb/module.py +0 -0
  23. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/postgres/manifest.json +0 -0
  24. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/postgres/module.py +0 -0
  25. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/redis/manifest.json +0 -0
  26. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/builtin/redis/module.py +0 -0
  27. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/modules/manager.py +0 -0
  28. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/common/utils.py +0 -0
  29. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/__init__.py +0 -0
  30. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/manager.py +0 -0
  31. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/packages.py +0 -0
  32. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/chroot/shell.py +0 -0
  33. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/cli.py +0 -0
  34. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/available.py +0 -0
  35. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/clean.py +0 -0
  36. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/ctl.py +0 -0
  37. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/current.py +0 -0
  38. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/db.py +0 -0
  39. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/doctor.py +0 -0
  40. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/grok.py +0 -0
  41. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/install.py +0 -0
  42. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/list.py +0 -0
  43. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/logs.py +0 -0
  44. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/mailpit.py +0 -0
  45. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/modules.py +0 -0
  46. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/mongodb.py +0 -0
  47. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/postgres.py +0 -0
  48. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/reload.py +0 -0
  49. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/restart.py +0 -0
  50. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/setup.py +0 -0
  51. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/start.py +0 -0
  52. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/status.py +0 -0
  53. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/stop.py +0 -0
  54. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/uninstall.py +0 -0
  55. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/update.py +0 -0
  56. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/upgrade.py +0 -0
  57. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/use.py +0 -0
  58. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/commands/vhost.py +0 -0
  59. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/builder.py +0 -0
  60. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/downloader.py +0 -0
  61. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/extensions.py +0 -0
  62. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/installer.py +0 -0
  63. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/resolver.py +0 -0
  64. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/php/templates.py +0 -0
  65. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/fpm.py +0 -0
  66. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/mailpit.py +0 -0
  67. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/nginx_helper.py +0 -0
  68. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/pma.py +0 -0
  69. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/process.py +0 -0
  70. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/services.py +0 -0
  71. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/sockets.py +0 -0
  72. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/linux/runtime/upgrade.py +0 -0
  73. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/main.py +0 -0
  74. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/tui.py +0 -0
  75. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/__init__.py +0 -0
  76. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/bin/shim.exe +0 -0
  77. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/cli.py +0 -0
  78. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/commands/__init__.py +0 -0
  79. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/__init__.py +0 -0
  80. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/db.py +0 -0
  81. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/elevate.py +0 -0
  82. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/ext.py +0 -0
  83. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/fcgi.py +0 -0
  84. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/grok.py +0 -0
  85. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/logs.py +0 -0
  86. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/mailpit.py +0 -0
  87. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/mkcert.py +0 -0
  88. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/paths.py +0 -0
  89. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/php.py +0 -0
  90. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/pma.py +0 -0
  91. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/redis_core.py +0 -0
  92. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/services.py +0 -0
  93. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/setup.py +0 -0
  94. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/shim.py +0 -0
  95. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/upgrade.py +0 -0
  96. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/core/vhost.py +0 -0
  97. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/templates/vhost.conf.tmpl +0 -0
  98. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/templates/vhost_ssl.conf.tmpl +0 -0
  99. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev/win/tui.py +0 -0
  100. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/SOURCES.txt +0 -0
  101. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/dependency_links.txt +0 -0
  102. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/entry_points.txt +0 -0
  103. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/requires.txt +0 -0
  104. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/ndev_stack.egg-info/top_level.txt +0 -0
  105. {ndev_stack-0.3.10 → ndev_stack-0.3.11}/setup.cfg +0 -0
  106. {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.10
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
@@ -1,7 +1,7 @@
1
1
  """
2
2
  ndev: Fast, cross-platform PHP developer environment for Windows and Linux.
3
3
  """
4
- __version__ = "0.3.10"
4
+ __version__ = "0.3.11"
5
5
 
6
6
  from . import common as common
7
7
  from .common.logger import logger as logger
@@ -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
- @work(exclusive=True)
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
- if event.select.id == "select-php-version" and event.value != Select.BLANK:
1440
- target_version = str(event.value)
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
- await self._switch_php_version(target_version)
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" and event.value != Select.BLANK:
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 == Select.BLANK:
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.10
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.10"
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