Optimized package search with bisect-based index#42
Merged
ericbsd merged 15 commits intoghostbsd:masterfrom Jun 12, 2025
xcrsz:master
Merged
Optimized package search with bisect-based index#42ericbsd merged 15 commits intoghostbsd:masterfrom xcrsz:master
ericbsd merged 15 commits intoghostbsd:masterfrom
xcrsz:master
Conversation
Reviewer's GuideThis PR introduces a dataclass-based Package model and a bisect-driven PkgSearchIndex for logarithmic-time exact and prefix lookups, integrates that index into PkgInfo (replacing its previous linear search), and updates the MainWindow UI to wire live search to the new index and show version/install status. Sequence Diagram for Optimized Package SearchsequenceDiagram
actor User
participant MW as MainWindow
participant PI as PkgInfo
participant PSI as PkgSearchIndex
User->>+MW: Types in search_entry
MW->>MW: on_search_entry_changed(entry)
MW->>PI: search(text)
activate PI
PI->>PSI: search_prefix(text)
activate PSI
PSI-->>PI: List~Package~
deactivate PSI
PI-->>MW: List~Package~
deactivate PI
MW->>MW: display_packages(packages)
MW-->>-User: Updates package_list
Sequence Diagram for Application Initialization and Package IndexingsequenceDiagram
participant UserOrSystem as User/System
participant MW as MainWindow
participant PI as PkgInfo
participant PSI as PkgSearchIndex
UserOrSystem->>+MW: Create MainWindow
MW->>+PI: Create PkgInfo()
PI->>PI: load_installed()
PI->>PI: load_available()
PI->>+PSI: Create PkgSearchIndex(pkg.available)
PSI-->>-PI: PkgSearchIndex instance created
PI-->>-MW: PkgInfo instance created
MW->>MW: display_packages(pkg.available)
MW-->>-UserOrSystem: Displays packages
Class Diagram of New and Modified Software ComponentsclassDiagram
class Package {
+name: str
+description: str
+version: str
+installed: bool
}
class PkgSearchIndex {
-key: str
-sorted_packages: List~Package~
-sorted_keys: List~str~
+__init__(packages: List~Package~, key: str)
+search_exact(value: str) : Optional~Package~
+search_prefix(prefix: str) : List~Package~
}
class PkgInfo {
+available: List~Package~
-installed_names: set~str~
-index: PkgSearchIndex
+__init__()
+load_installed()
+load_available()
+search(prefix: str) : List~Package~
+get_installed() : List~Package~
}
class MainWindow {
-pkg: PkgInfo
-search_entry: Gtk.Entry
-package_list: Gtk.ListBox
+__init__()
+on_search_entry_changed(entry: Gtk.Entry)
+display_packages(packages: List~Package~)
}
MainWindow "1" *-- "1" PkgInfo : owns
PkgInfo "1" *-- "1" PkgSearchIndex : owns
PkgInfo "1" *-- "0..*" Package : creates and owns
PkgSearchIndex "1" o-- "0..*" Package : aggregates/references
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey @xcrsz - I've reviewed your changes - here's some feedback:
Blocking issues:
returnshould never appear inside a class init function. This will cause a runtime error. (link)
General comments:
- PkgSearchIndex.search_prefix’s next_prefix logic is brittle—consider using bisect_right on prefix + '\uffff' (or another high‐sentinel) instead of manually bumping the last character to compute the end bound.
- Normalize both stored package names and the search prefix to lowercase (or use a casefold) so searches become case-insensitive and more user-friendly.
- PkgInfo.search returns an empty list when the index is None, which clears the UI if indexing fails; consider falling back to returning the full available list instead of an empty result.
Here's what I looked at during the review
- 🟡 General issues: 4 issues found
- 🔴 Security: 1 blocking issue
- 🟢 Testing: all looks good
- 🟢 Documentation: all looks good
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Contributor
Author
|
All Sourcery-AI conversation have been resolved. |
ericbsd
requested changes
May 31, 2025
ericbsd
reviewed
May 31, 2025
Member
ericbsd
left a comment
There was a problem hiding this comment.
Files should not be CamelCase. It should be snack_case. Like main_window.py.
- Moved imports (gi, Gtk) to top of main_window.py to fix C0413 (wrong-import-position). - Removed trailing whitespace in main_window.py to fix C0303. - Added pylint: disable=no-member for Gtk.Window methods to fix E1101 false positives. - Added reset method to MainWindow to fix R0903 (too-few-public-methods). - Included gi.require_version to fix W0611 (unused-import). - Removed PkgDataProvider import to avoid E0401 and E0611 errors. - Updated main_window.py to maintain GTK application functionality.
- Fixed KeyError in update_search by adding validation for empty package names and using safe dictionary access with get(). - Added error handling for KeyError and TypeError in package search processing. - Suppressed E1101 (no-member) for GTK methods with pylint directives to fix false positives. - Ensured imports are correctly placed to resolve C0413 (wrong-import-position). - Removed trailing whitespace to fix C0303. - Fixed W0611 (unused-import) by ensuring gi is used via gi.require_version. - Created software_station_pkg.py with mock data to resolve E0401 and E0611 if needed. - Preserved all Software Station functionality, including package management and UI.
- Replaced bcrypt with crypt.crypt for SHA-512 ($6$) password hashing to match GhostBSD’s hash format. This is a reverted change. - Updated Confirmation.confirm_passwd to verify passwords against /etc/master.passwd hashes. - Added debug logging to trace password verification issues. - Retained KeyError fix in update_search, NameError fix for gettext, and pylint improvements. - Removed py311-bcrypt dependency, using standard library crypt. - Added docstrings to address pylint C0116 warnings. - Preserved Software Station functionality, including package management and UI.
- Removed main_window.py, which duplicated software-station’s GTK window setup, main loop, and destroy signal handling. - No functional loss, as main_window.py was a minimal prototype.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary by Sourcery
Optimize package search by building a bisect-based index for fast lookups and update the UI to show package versions and install status
New Features:
Enhancements: