macversiontracker 0.8.1__py3-none-any.whl

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 (60) hide show
  1. macversiontracker-0.8.1.dist-info/METADATA +744 -0
  2. macversiontracker-0.8.1.dist-info/RECORD +60 -0
  3. macversiontracker-0.8.1.dist-info/WHEEL +5 -0
  4. macversiontracker-0.8.1.dist-info/entry_points.txt +4 -0
  5. macversiontracker-0.8.1.dist-info/licenses/LICENSE +21 -0
  6. macversiontracker-0.8.1.dist-info/top_level.txt +1 -0
  7. versiontracker/__init__.py +89 -0
  8. versiontracker/__main__.py +253 -0
  9. versiontracker/advanced_cache.py +873 -0
  10. versiontracker/ai/__init__.py +886 -0
  11. versiontracker/analytics.py +1017 -0
  12. versiontracker/app_finder.py +1505 -0
  13. versiontracker/apps/__init__.py +377 -0
  14. versiontracker/apps/cache.py +159 -0
  15. versiontracker/apps/finder.py +273 -0
  16. versiontracker/apps/matcher.py +227 -0
  17. versiontracker/async_homebrew.py +401 -0
  18. versiontracker/async_homebrew_prototype.py +384 -0
  19. versiontracker/async_network.py +346 -0
  20. versiontracker/benchmarks.py +709 -0
  21. versiontracker/cache.py +123 -0
  22. versiontracker/cli.py +286 -0
  23. versiontracker/commands/__init__.py +83 -0
  24. versiontracker/commands/list_apps.py +49 -0
  25. versiontracker/commands/recommendations.py +83 -0
  26. versiontracker/config.py +933 -0
  27. versiontracker/deprecation.py +209 -0
  28. versiontracker/enhanced_matching.py +469 -0
  29. versiontracker/error_codes.py +283 -0
  30. versiontracker/exceptions.py +342 -0
  31. versiontracker/export.py +265 -0
  32. versiontracker/handlers/__init__.py +78 -0
  33. versiontracker/handlers/app_handlers.py +171 -0
  34. versiontracker/handlers/auto_update_handlers.py +325 -0
  35. versiontracker/handlers/brew_handlers.py +465 -0
  36. versiontracker/handlers/config_handlers.py +46 -0
  37. versiontracker/handlers/enhanced_auto_update_handlers.py +619 -0
  38. versiontracker/handlers/export_handlers.py +74 -0
  39. versiontracker/handlers/filter_handlers.py +175 -0
  40. versiontracker/handlers/macos_handlers.py +241 -0
  41. versiontracker/handlers/outdated_handlers.py +527 -0
  42. versiontracker/handlers/setup_handlers.py +114 -0
  43. versiontracker/handlers/ui_handlers.py +77 -0
  44. versiontracker/handlers/utils_handlers.py +157 -0
  45. versiontracker/homebrew.py +653 -0
  46. versiontracker/macos_integration.py +386 -0
  47. versiontracker/menubar_app.py +210 -0
  48. versiontracker/ml/__init__.py +718 -0
  49. versiontracker/plugins/__init__.py +485 -0
  50. versiontracker/plugins/example_plugins.py +484 -0
  51. versiontracker/profiling.py +315 -0
  52. versiontracker/py.typed +0 -0
  53. versiontracker/ui.py +577 -0
  54. versiontracker/utils.py +865 -0
  55. versiontracker/version/__init__.py +489 -0
  56. versiontracker/version/comparator.py +755 -0
  57. versiontracker/version/models.py +52 -0
  58. versiontracker/version/parser.py +253 -0
  59. versiontracker/version.py +213 -0
  60. versiontracker/version_legacy.py +2098 -0
@@ -0,0 +1,744 @@
1
+ Metadata-Version: 2.4
2
+ Name: macversiontracker
3
+ Version: 0.8.1
4
+ Summary: A command-line tool for tracking and managing applications installed outside of the Mac App Store
5
+ Author-email: docdyhr <thomas@dyhr.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/docdyhr/versiontracker
8
+ Project-URL: Bug Tracker, https://github.com/docdyhr/versiontracker/issues
9
+ Project-URL: Documentation, https://github.com/docdyhr/versiontracker
10
+ Project-URL: Source Code, https://github.com/docdyhr/versiontracker
11
+ Project-URL: Changelog, https://github.com/docdyhr/versiontracker/blob/master/CHANGELOG.md
12
+ Project-URL: PyPI, https://pypi.org/project/macversiontracker/
13
+ Keywords: macos,homebrew,version,tracking,updates,cask
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Environment :: Console
16
+ Classifier: Intended Audience :: System Administrators
17
+ Classifier: Intended Audience :: End Users/Desktop
18
+ Classifier: Operating System :: MacOS :: MacOS X
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: System :: Software Distribution
23
+ Classifier: Topic :: System :: Systems Administration
24
+ Classifier: Topic :: Utilities
25
+ Requires-Python: >=3.12
26
+ Description-Content-Type: text/markdown
27
+ License-File: LICENSE
28
+ Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: tqdm>=4.65
30
+ Requires-Dist: psutil>=5.9
31
+ Requires-Dist: tabulate>=0.9.0
32
+ Requires-Dist: aiohttp>=3.8.0
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7.4; extra == "dev"
35
+ Requires-Dist: pytest-cov>=7.0; extra == "dev"
36
+ Requires-Dist: pytest-timeout>=2.1; extra == "dev"
37
+ Requires-Dist: pytest-mock>=3.11; extra == "dev"
38
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
39
+ Requires-Dist: black>=23.7; extra == "dev"
40
+ Requires-Dist: ruff>=0.1; extra == "dev"
41
+ Requires-Dist: mypy>=1.5; extra == "dev"
42
+ Requires-Dist: types-PyYAML>=6.0; extra == "dev"
43
+ Requires-Dist: build>=0.10; extra == "dev"
44
+ Requires-Dist: wheel>=0.41; extra == "dev"
45
+ Requires-Dist: twine>=4.0; extra == "dev"
46
+ Provides-Extra: test
47
+ Requires-Dist: pytest>=7.4; extra == "test"
48
+ Requires-Dist: pytest-cov>=7.0; extra == "test"
49
+ Requires-Dist: pytest-timeout>=2.1; extra == "test"
50
+ Requires-Dist: pytest-mock>=3.11; extra == "test"
51
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
52
+ Provides-Extra: security
53
+ Requires-Dist: bandit[toml]>=1.7; extra == "security"
54
+ Requires-Dist: pip-audit>=2.6; extra == "security"
55
+ Requires-Dist: safety>=2.3; extra == "security"
56
+ Provides-Extra: fuzzy
57
+ Requires-Dist: rapidfuzz>=3.0; extra == "fuzzy"
58
+ Provides-Extra: ml
59
+ Requires-Dist: numpy>=1.24.0; extra == "ml"
60
+ Requires-Dist: scikit-learn>=1.3.0; extra == "ml"
61
+ Dynamic: license-file
62
+
63
+ # Versiontracker Update tool for macOS
64
+
65
+ ![Logo](assets/images/logo.png)
66
+
67
+ <div align="center">
68
+
69
+ ## 🚀 Production-Ready macOS Application Manager
70
+
71
+ [![Project Grade](https://img.shields.io/badge/Grade-A-brightgreen?style=for-the-badge&logo=gradle&logoColor=white)](PROJECT_REVIEW.md)
72
+ [![Production Ready](https://img.shields.io/badge/Status-Production%20Ready-success?style=for-the-badge&logo=checkmarx&logoColor=white)](PROJECT_REVIEW.md)
73
+
74
+ </div>
75
+
76
+ ---
77
+
78
+ ### 🏗️ Build & CI/CD Pipeline
79
+
80
+ [![CI Pipeline](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/ci.yml?branch=master&label=CI%20Pipeline&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/ci.yml)
81
+ [![Lint](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/lint.yml?branch=master&label=Lint&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/lint.yml)
82
+ [![Security](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/security.yml?branch=master&label=Security&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/security.yml)
83
+ [![CodeQL](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/codeql-analysis.yml?branch=master&label=CodeQL&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/codeql-analysis.yml)
84
+ [![Coverage](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/coverage.yml?branch=master&label=Coverage&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/coverage.yml)
85
+ [![Performance](https://img.shields.io/github/actions/workflow/status/docdyhr/versiontracker/performance.yml?branch=master&label=Performance&logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/performance.yml)
86
+ [![Release](https://img.shields.io/github/v/release/docdyhr/versiontracker?logo=github&logoColor=white&label=Release)](https://github.com/docdyhr/versiontracker/releases/latest)
87
+
88
+ ### 🔒 Security & Quality
89
+
90
+ [![Code Coverage](https://img.shields.io/codecov/c/github/docdyhr/versiontracker/master?logo=codecov&logoColor=white&label=Codecov)](https://codecov.io/gh/docdyhr/versiontracker)
91
+ [![Test Coverage](https://img.shields.io/badge/Coverage-70%2B%25-brightgreen?logo=pytest&logoColor=white)](https://github.com/docdyhr/versiontracker)
92
+ [![Tests Passing](https://img.shields.io/badge/Tests-1,136%20Passing-success?logo=pytest&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/ci.yml)
93
+ [![Security: Bandit](https://img.shields.io/badge/Bandit-Passing-success?logo=python&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/security.yml)
94
+ [![Security: pip-audit](https://img.shields.io/badge/pip--audit-No%20Vulnerabilities-success?logo=python&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/security.yml)
95
+ [![Security: Safety](https://img.shields.io/badge/Safety-No%20Vulnerabilities-success?logo=python&logoColor=white)](https://github.com/docdyhr/versiontracker/actions/workflows/security.yml)
96
+
97
+ ### 🎨 Code Standards
98
+
99
+ [![Code style: ruff](https://img.shields.io/badge/Code%20Style-Ruff-000000.svg?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff)
100
+ [![Type Checked: mypy](https://img.shields.io/badge/Type%20Checked-MyPy-blue.svg?logo=python&logoColor=white)](http://mypy-lang.org/)
101
+ [![Complexity](https://img.shields.io/badge/Complexity-%3C%2015-brightgreen?logo=codeclimate&logoColor=white)](PROJECT_REVIEW.md)
102
+ [![Line Length](https://img.shields.io/badge/Line%20Length-120-blue?logo=prettier&logoColor=white)](.ruff.toml)
103
+ [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](.pre-commit-config.yaml)
104
+
105
+ ### 📊 Repository Stats
106
+
107
+ [![GitHub issues](https://img.shields.io/github/issues/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/issues)
108
+ [![GitHub pull requests](https://img.shields.io/github/issues-pr/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/pulls)
109
+ [![GitHub forks](https://img.shields.io/github/forks/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/network)
110
+ [![GitHub stars](https://img.shields.io/github/stars/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/stargazers)
111
+ [![Last Commit](https://img.shields.io/github/last-commit/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/commits/master)
112
+ [![Contributors](https://img.shields.io/github/contributors/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker/graphs/contributors)
113
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?logo=opensourceinitiative&logoColor=white)](https://opensource.org/licenses/MIT)
114
+
115
+ ### 💻 Platform & Environment
116
+
117
+ [![macOS](https://img.shields.io/badge/Platform-macOS-blue.svg?logo=apple&logoColor=white)](https://www.apple.com/macos/)
118
+ [![Python 3.12+](https://img.shields.io/badge/Python-3.12%2B-blue.svg?logo=python&logoColor=white)](https://www.python.org/downloads/)
119
+ [![Homebrew Compatible](https://img.shields.io/badge/Homebrew-Compatible-orange.svg?logo=homebrew&logoColor=white)](https://brew.sh/)
120
+ [![CLI Tool](https://img.shields.io/badge/Type-CLI-brightgreen?logo=terminal&logoColor=white)](https://github.com/docdyhr/versiontracker)
121
+ [![Code Size](https://img.shields.io/github/languages/code-size/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker)
122
+ [![Repo Size](https://img.shields.io/github/repo-size/docdyhr/versiontracker?logo=github&logoColor=white)](https://github.com/docdyhr/versiontracker)
123
+
124
+ ---
125
+
126
+ * Name: Versiontracker
127
+ * Version: 0.8.1
128
+ * Programming language: Python 3.12+
129
+ * Author: thomas
130
+ * Purpose: CLI versiontracker and update tool for macOS
131
+ * Release date: 21. Feb 2022 (Updated: January 2026)
132
+ * Code Quality: **70%+ test coverage with 1,230+ passing tests**,
133
+ **all previously identified high & medium complexity issues resolved**,
134
+ **AI/ML capabilities and advanced analytics platform**
135
+
136
+ ## Quick Start
137
+
138
+ ```bash
139
+ # Install from PyPI
140
+ pip install macversiontracker
141
+
142
+ # List applications not from the App Store
143
+ versiontracker --apps
144
+
145
+ # Get Homebrew recommendations for your apps
146
+ versiontracker --recommend
147
+
148
+ # Check for outdated applications
149
+ versiontracker --check-outdated
150
+
151
+ # Show help
152
+ versiontracker --help
153
+ ```
154
+
155
+ ## Overview
156
+
157
+ Versiontracker is a command-line tool for macOS that helps you manage applications
158
+ installed outside of the App Store. Recently undergone complete technical debt cleanup
159
+ with **70%+ test coverage** and **all high & medium-priority complexity issues resolved**.
160
+
161
+ It identifies applications that aren't managed through Apple's official channels and suggests which ones can be managed
162
+ using Homebrew casks, making it easier to keep your applications up to date.
163
+
164
+ ## Features
165
+
166
+ * List applications in `/Applications/` not updated by the App Store
167
+ * List all currently installed Homebrew casks
168
+ * Recommend which applications could be managed through Homebrew
169
+ * Check for outdated applications by comparing with latest Homebrew versions
170
+ * Identify applications that need updating and show version differences
171
+ * Export results in machine-readable formats (JSON and CSV)
172
+ * YAML configuration file support for persistent settings
173
+ * **Enhanced fuzzy matching** with alias recognition and advanced normalization for accurate application identification
174
+ * **Asynchronous network operations** for improved performance and reliability
175
+ * **Advanced multi-tier caching system** with automatic expiration and compression
176
+ * **Performance profiling and monitoring** with detailed timing and memory usage metrics
177
+ * **macOS system integration** with scheduled checks, native notifications, and menubar access
178
+ * Parallel processing for faster operation
179
+ * Configurable blocklist to exclude specific applications (legacy: --blacklist still accepted with deprecation warning)
180
+ * Support for scanning additional application directories
181
+ * Secure command execution
182
+ * Color-coded console output for better readability
183
+ * Smart progress indicators with system resource monitoring
184
+ * Adaptive rate limiting based on CPU and memory usage
185
+ * Support for saving and loading query filters
186
+ * **Auto-updates detection** for Homebrew casks with filtering options
187
+
188
+ ## Requirements
189
+
190
+ * **macOS**: 10.15 Catalina or later (tested through macOS Sequoia)
191
+ * **Python 3.12 or later** (3.13 compatible)
192
+ * **Homebrew**: Optional, but required for cask recommendations and update checks
193
+
194
+ ## Installation
195
+
196
+ ### With PyPI (Recommended)
197
+
198
+ ```bash
199
+ pip install macversiontracker
200
+ ```
201
+
202
+ ### With Homebrew
203
+
204
+ ```bash
205
+ brew tap docdyhr/versiontracker
206
+ brew install versiontracker
207
+ ```
208
+
209
+ ### With PyPI
210
+
211
+ ```bash
212
+ pip install macversiontracker
213
+ ```
214
+
215
+ ### Option 1: Clone the repository and install
216
+
217
+ ```shell
218
+ # Clone the repository
219
+ git clone https://github.com/docdyhr/versiontracker.git
220
+ cd versiontracker
221
+
222
+ # Install requirements
223
+ python3 -m pip install -r requirements.txt --user
224
+
225
+ # Install the package (optional)
226
+ python3 -m pip install -e . --user
227
+ ```
228
+
229
+ ### Option 2: Set up a virtual environment
230
+
231
+ ```shell
232
+ # Clone the repository
233
+ git clone https://github.com/docdyhr/versiontracker.git
234
+ cd versiontracker
235
+
236
+ # Create and activate a virtual environment
237
+ python3 -m venv .venv
238
+ source .venv/bin/activate
239
+
240
+ # Install requirements
241
+ pip install -r requirements.txt
242
+
243
+ # Install the package (optional)
244
+ pip install -e .
245
+ ```
246
+
247
+ ## Usage
248
+
249
+ Versiontracker provides a simple command-line interface with several options:
250
+
251
+ ```bash
252
+ usage: versiontracker [-h] [-D DEBUG] [--rate-limit RATE_LIMIT]
253
+ [--max-workers MAX_WORKERS] [--no-progress]
254
+ [--blacklist BLACKLIST] [--additional-dirs ADDITIONAL_DIRS]
255
+ [--similarity SIMILARITY] [--export {json,csv}]
256
+ [--output-file OUTPUT_FILE] [-a | -b | -r | -o | -V]
257
+ [--generate-config] [--config-path CONFIG_PATH]
258
+
259
+ optional arguments:
260
+ -h, --help show this help message and exit
261
+ -D DEBUG, --debug DEBUG
262
+ turn on DEBUG mode
263
+
264
+ Performance options:
265
+ --rate-limit RATE_LIMIT
266
+ API rate limit in seconds (default: 3)
267
+ --max-workers MAX_WORKERS
268
+ Maximum number of worker threads (default: 10)
269
+ --no-progress Disable progress bars
270
+
271
+ Filtering options:
272
+ --blacklist BLACKLIST
273
+ Comma-separated list of applications to ignore
274
+ --additional-dirs ADDITIONAL_DIRS
275
+ Colon-separated list of additional directories to scan for applications
276
+ --similarity SIMILARITY
277
+ Similarity threshold for matching (0-100, default: 75)
278
+ --no-enhanced-matching
279
+ Disable enhanced fuzzy matching (use basic matching instead)
280
+ --exclude-auto-updates
281
+ Exclude applications that have auto-updates enabled in Homebrew
282
+ --only-auto-updates Only show applications that have auto-updates enabled in Homebrew
283
+
284
+ Export options:
285
+ --export {json,csv} Export results in specified format (json or csv)
286
+ --output-file OUTPUT_FILE
287
+ Specify the output file for export (default: print to stdout)
288
+
289
+ Configuration options:
290
+ --generate-config Generate a default configuration file at ~/.config/versiontracker/config.yaml
291
+ --config-path CONFIG_PATH
292
+ Specify an alternative path for the configuration file (can be used both for
293
+ generating a config file with --generate-config and for using a custom config
294
+ file location when running the application)
295
+
296
+ -a, --apps return Apps in Applications/ that is not updated by App Store
297
+ -b, --brews return installable brews
298
+ -r, --recommend return recommendations for brew
299
+ -o, --outdated check for outdated applications compared to Homebrew versions
300
+ -V, --version show program's version number and exit
301
+ ```
302
+
303
+ ## Usage Examples
304
+
305
+ ### List all applications not updated by App Store
306
+
307
+ ```shell
308
+ python3 versiontracker-cli.py --apps
309
+ ```
310
+
311
+ Or if installed:
312
+
313
+ ```shell
314
+ versiontracker --apps
315
+ ```
316
+
317
+ ### List all installed Homebrew casks
318
+
319
+ ```shell
320
+ python3 versiontracker-cli.py --brews
321
+ ```
322
+
323
+ ### Get recommendations for Homebrew installations
324
+
325
+ ```shell
326
+ python3 versiontracker-cli.py --recommend
327
+ ```
328
+
329
+ ### Check for outdated applications
330
+
331
+ ```shell
332
+ python3 versiontracker-cli.py --outdated
333
+ ```
334
+
335
+ Or if installed:
336
+
337
+ ```shell
338
+ versiontracker --outdated
339
+ ```
340
+
341
+ ### Handle applications with auto-updates
342
+
343
+ ```shell
344
+ # List brews excluding those with auto-updates enabled
345
+ python3 versiontracker-cli.py --brews --exclude-auto-updates
346
+
347
+ # List only brews that have auto-updates enabled
348
+ python3 versiontracker-cli.py --brews --only-auto-updates
349
+
350
+ # Get recommendations excluding apps with auto-updates
351
+ python3 versiontracker-cli.py --recommend --exclude-auto-updates
352
+
353
+ # Get recommendations for only apps with auto-updates
354
+ python3 versiontracker-cli.py --recommend --only-auto-updates
355
+ ```
356
+
357
+ ### Manage applications with auto-updates
358
+
359
+ ```shell
360
+ # Add all apps with auto-updates to the blacklist
361
+ python3 versiontracker-cli.py --blacklist-auto-updates
362
+
363
+ # Uninstall all Homebrew casks that have auto-updates (with confirmation)
364
+ python3 versiontracker-cli.py --uninstall-auto-updates
365
+ ```
366
+
367
+ The auto-update management commands provide:
368
+
369
+ * **Interactive confirmation**: Both commands ask for confirmation before making changes
370
+ * **Clear feedback**: Shows exactly what will be blacklisted or uninstalled
371
+ * **Safety features**: The uninstall command requires typing "UNINSTALL" to confirm
372
+ * **Status reporting**: Shows success/failure for each operation
373
+
374
+ ### Export results to JSON format
375
+
376
+ ```shell
377
+ python3 versiontracker-cli.py --apps --export json
378
+ ```
379
+
380
+ ### Save export results to a file
381
+
382
+ ```shell
383
+ python3 versiontracker-cli.py --apps --export csv --output-file applications.csv
384
+ ```
385
+
386
+ ### Generate a default configuration file
387
+
388
+ ```shell
389
+ python3 versiontracker-cli.py --generate-config
390
+ ```
391
+
392
+ ### Generate a configuration file in a custom location
393
+
394
+ ```shell
395
+ python3 versiontracker-cli.py --generate-config --config-path ~/custom_config.yaml
396
+ ```
397
+
398
+ ### Run with debugging enabled
399
+
400
+ ```shell
401
+ python3 versiontracker-cli.py --debug --recommend
402
+ ```
403
+
404
+ ### Enable performance profiling for optimization
405
+
406
+ ```shell
407
+ # Enable profiling and get detailed performance report
408
+ VERSIONTRACKER_PROFILE=true python -m versiontracker --apps
409
+ ```
410
+
411
+ ### macOS System Integration
412
+
413
+ ```shell
414
+ # Install scheduled checker service (runs every 24 hours by default)
415
+ python -m versiontracker --install-service
416
+
417
+ # Check service status
418
+ python -m versiontracker --service-status
419
+
420
+ # Send notification with outdated app results
421
+ python -m versiontracker --outdated --notify
422
+
423
+ # Launch menubar application for quick access
424
+ python -m versiontracker --menubar
425
+
426
+ # Test notifications
427
+ python -m versiontracker --test-notification
428
+
429
+ # Uninstall the service
430
+ python -m versiontracker --uninstall-service
431
+ ```
432
+
433
+ ## List applications based on your preferences
434
+
435
+ ```shell
436
+ python -m versiontracker -a --blacklist="Xcode,Safari" --similarity 85
437
+ ```
438
+
439
+ ## Enhanced User Interface
440
+
441
+ VersionTracker includes several UI enhancements to improve usability:
442
+
443
+ ### Color-Coded Output
444
+
445
+ All console output is color-coded for better readability:
446
+
447
+ 1. Green: Success messages and up-to-date applications
448
+ 2. Blue: Informational messages and progress updates
449
+ 3. Yellow: Warning messages and unknown statuses
450
+ 4. Red: Error messages and outdated applications
451
+
452
+ ### Smart Progress Indicators
453
+
454
+ Long-running operations show progress bars with:
455
+
456
+ 1. Estimated time remaining
457
+ 2. CPU usage monitoring
458
+ 3. Memory usage tracking
459
+ 4. Adaptive refresh rates
460
+
461
+ ### Adaptive Rate Limiting
462
+
463
+ When making network requests, VersionTracker intelligently adjusts rate limits based on:
464
+
465
+ 1. Current CPU usage
466
+ 2. Available memory
467
+ 3. Network conditions
468
+
469
+ This ensures optimal performance regardless of system load.
470
+
471
+ ### Advanced Caching System
472
+
473
+ VersionTracker implements a sophisticated caching system for Homebrew queries:
474
+
475
+ 1. **Multi-tier caching** with memory, disk, and compressed storage layers
476
+ 2. **Automatic expiry** based on access patterns and data freshness
477
+ 3. **Cache compression** for large responses to save disk space
478
+ 4. **Thread-safe batch operations** for concurrent access
479
+ 5. **Detailed cache statistics** and monitoring with usage metrics
480
+ 6. **Smart cache invalidation** to ensure data consistency
481
+
482
+ ### Performance Monitoring
483
+
484
+ Built-in performance profiling and monitoring capabilities:
485
+
486
+ 1. **Function-level timing** with min/max/average execution times
487
+ 2. **Memory usage tracking** per operation with peak memory detection
488
+ 3. **Detailed performance reports** with call counts and resource usage
489
+ 4. **Configurable profiling** that can be enabled for debugging or optimization
490
+ 5. **cProfile integration** for deep performance analysis
491
+
492
+ ### Query Filter Management
493
+
494
+ Save and reuse your favorite query settings:
495
+
496
+ ```shell
497
+ # Save current settings
498
+ python -m versiontracker -a --blacklist="Xcode,Safari" --save-filter my-filter
499
+
500
+ # List all saved filters
501
+ python -m versiontracker --list-filters
502
+
503
+ # Load a saved filter
504
+ python -m versiontracker --load-filter my-filter
505
+
506
+ # Delete a filter
507
+ python -m versiontracker --delete-filter my-filter
508
+ ```
509
+
510
+ ## Configuration
511
+
512
+ ### Configuration File
513
+
514
+ VersionTracker supports a YAML configuration file located at `~/.config/versiontracker/config.yaml` by default.
515
+ You can generate this file using the `--generate-config` command line option.
516
+
517
+ You can also specify a custom configuration file location using the `--config-path` option:
518
+
519
+ ```shell
520
+ # Generate a configuration file at a custom location
521
+ python3 versiontracker-cli.py --generate-config --config-path ~/custom_config.yaml
522
+
523
+ # Run the application using a custom configuration file
524
+ python3 versiontracker-cli.py --config-path ~/custom_config.yaml --apps
525
+ ```
526
+
527
+ Example configuration file:
528
+
529
+ ```yaml
530
+ # API rate limit in seconds
531
+ api-rate-limit: 3
532
+
533
+ # Maximum worker threads for parallel processing
534
+ max-workers: 10
535
+
536
+ # Similarity threshold for matching (0-100)
537
+ similarity-threshold: 75
538
+
539
+ # List of applications to exclude from results
540
+ blacklist:
541
+ - Firefox
542
+ - Chrome
543
+ - Safari
544
+
545
+ # Additional application directories to scan
546
+ additional-app-dirs:
547
+ - /Users/username/Applications
548
+ - /opt/Applications
549
+
550
+ # Whether to show progress bars
551
+ show-progress: true
552
+ ```
553
+
554
+ ### Environment Variables
555
+
556
+ You can also configure VersionTracker using environment variables, which will override any settings in the
557
+ configuration file:
558
+
559
+ ```shell
560
+ # Set the API rate limit (seconds)
561
+ export VERSIONTRACKER_API_RATE_LIMIT=5
562
+
563
+ # Enable debug mode
564
+ export VERSIONTRACKER_DEBUG=true
565
+
566
+ # Set maximum worker threads
567
+ export VERSIONTRACKER_MAX_WORKERS=8
568
+
569
+ # Configure similarity threshold (0-100)
570
+ export VERSIONTRACKER_SIMILARITY_THRESHOLD=80
571
+
572
+ # Add applications to blacklist (comma-separated)
573
+ export VERSIONTRACKER_BLACKLIST=Firefox,Chrome,Safari
574
+
575
+ # Add additional application directories (colon-separated)
576
+ export VERSIONTRACKER_ADDITIONAL_APP_DIRS=/Users/username/Applications:/opt/Applications
577
+
578
+ # Disable progress bars
579
+ export VERSIONTRACKER_PROGRESS_BARS=false
580
+ ```
581
+
582
+ ## Testing
583
+
584
+ VersionTracker includes a comprehensive test suite to ensure functionality. To run the tests:
585
+
586
+ ```shell
587
+ # Activate your virtual environment if necessary
588
+ source .venv/bin/activate
589
+
590
+ # Install test dependencies
591
+ pip install pytest pytest-cov
592
+
593
+ # Run tests with coverage
594
+ pytest
595
+
596
+ # Run tests with detailed coverage report
597
+ pytest --cov=versiontracker --cov-report=term-missing
598
+ ```
599
+
600
+ The test suite includes:
601
+
602
+ * Standard unit tests for core functionality
603
+ * Parameterized tests for efficient testing of version comparison
604
+ * Mock server for network operation testing
605
+ * Simulated edge cases for error handling
606
+ * Thread safety tests for concurrent operations
607
+
608
+ This ensures robust functionality across various scenarios and network conditions.
609
+
610
+ ### Testing Strategy & Coverage Philosophy
611
+
612
+ VersionTracker intentionally uses a heavy mocking approach to:
613
+
614
+ 1. Isolate complex version parsing and comparison logic
615
+ 2. Deterministically simulate Homebrew and filesystem behaviors
616
+ 3. Keep test execution fast and CI-friendly
617
+
618
+ Current Coverage Profile:
619
+
620
+ * Reported line coverage: ≈10–11%
621
+ * Effective logical path coverage for core decision branches: substantially higher (most comparison and
622
+ matching branches exercised)
623
+ * High mock call volume (5,000+ patched interactions) reduces counted executable lines while still validating behavior
624
+
625
+ Why Coverage Is Not Higher:
626
+
627
+ * Many modules rely on guarded platform / network code paths that are mocked out
628
+ * Async and I/O heavy branches prefer behavioral contract tests instead of executing real subprocess or network calls
629
+ * Legacy compatibility layers (fallback logic) are thin wrappers rarely worth direct line coverage
630
+
631
+ Planned Improvements:
632
+
633
+ * Add end-to-end integration tests for: discovery → recommendation → outdated flow
634
+ * Introduce cold vs warm cache performance validation tests
635
+ * Add semantic regression test matrix for prerelease/build metadata edge cases
636
+ * Incremental async Homebrew operations tests once migration begins
637
+ * Raise coverage target after integration suite (goal: 25–30% meaningful executable coverage with higher branch coverage)
638
+
639
+ Quality Guarantees Beyond Coverage:
640
+
641
+ * All previously high/medium cyclomatic complexity functions refactored below threshold
642
+ * Strict type-aware comparison helpers with malformed/None/empty path handling
643
+ * Deterministic behavior for prerelease, build metadata, and application build number comparisons
644
+
645
+ If you are contributing:
646
+
647
+ * Prefer adding branch/path tests over superficial line coverage
648
+ * Mock external commands (brew, filesystem, network) consistently
649
+ * When adding new complex logic, accompany with parameterized tests demonstrating edge cases
650
+
651
+ This strategy favors maintainability, determinism, and clear behavioral guarantees over a raw percentage metric.
652
+
653
+ ## Continuous Integration
654
+
655
+ VersionTracker uses GitHub Actions for continuous integration and deployment:
656
+
657
+ * **Testing**: Automatically runs the test suite on multiple Python versions
658
+ * **Linting**: Ensures code quality with flake8, black, and isort
659
+ * **Releases**: Automatically publishes new versions to PyPI when a release is created
660
+
661
+ The CI/CD pipeline helps maintain code quality and ensures that the application is always in a deployable state.
662
+
663
+ ## Background
664
+
665
+ On macOS, not all apps are installed through the App Store. If you have many apps downloaded outside of Apple's
666
+ App Store, it can be a hassle to keep them all updated - especially those you don't use every day. While download
667
+ sites like macupdate.com or macdownload.com exist, they may not prioritize user privacy.
668
+
669
+ Package managers like Homebrew and MacPort make it possible to install and maintain many popular applications
670
+ through the command line. Versiontracker helps bridge the gap between your current applications and what could
671
+ be managed through Homebrew.
672
+
673
+ ## Project Status
674
+
675
+ VersionTracker has completed major technical debt cleanup and is now production-ready.
676
+ All critical and medium-priority complexity issues have been resolved. Key completed improvements include:
677
+
678
+ * **Complete Code Complexity Resolution**: All 10 high & medium-priority complex functions refactored
679
+ * Refactored the codebase to follow the command pattern with dedicated handlers
680
+ * Improved project structure with better module separation
681
+ * Enhanced error handling with custom exceptions and proper type hints
682
+ * Added support for smart progress indicators and adaptive rate limiting
683
+ * Moved handler functions to a dedicated `handlers/` directory
684
+ * **70%+ test coverage** with 950+ passing tests and 0 failing tests
685
+ * **Zero high-severity security vulnerabilities**
686
+
687
+ ## Recent Major Achievements
688
+
689
+ * **Technical Debt Elimination**: Reduced function complexity by 60-90% across 10 critical functions
690
+ * **Type Safety**: All type checking passes with proper None handling and NoReturn annotations
691
+ * Improved test coverage with parameterized tests for version comparison
692
+ * Created a mock server for network operation testing with simulated failures
693
+ * Implemented an advanced caching mechanism for Homebrew queries
694
+ * Added request batching to reduce network calls
695
+ * Enhanced error handling for network operations with focused helper functions
696
+
697
+ ## Planned Improvements
698
+
699
+ * Add more package managers support (MacPorts, etc.)
700
+ * Implement automatic update capabilities for Homebrew-manageable applications
701
+ * Explore using `asyncio` for network operations
702
+ * Add GUI interface
703
+
704
+ ## License
705
+
706
+ [MIT](https://github.com/docdyhr/versiontracker/blob/master/LICENSE)
707
+
708
+ ### Blocklist Terminology Migration
709
+
710
+ The project is migrating from the legacy term "blacklist" to the preferred term "blocklist" for excluding applications
711
+ from results. This is a non-breaking change.
712
+
713
+ Current Status:
714
+
715
+ * New flags: --blocklist, --blocklist-auto-updates
716
+ * Legacy flags (still supported, deprecated): --blacklist, --blacklist-auto-updates
717
+ * Configuration key remains internally stored as "blacklist" for backward compatibility (will accept future "blocklist")
718
+
719
+ Examples:
720
+
721
+ ```shell
722
+ # New preferred usage
723
+ versiontracker --apps --blocklist "Safari,Firefox"
724
+
725
+ # Legacy (still works – shows deprecation warning)
726
+ versiontracker --apps --blacklist "Safari,Firefox"
727
+
728
+ # Blocklist all auto-updating casks
729
+ versiontracker --blocklist-auto-updates
730
+
731
+ # Legacy form (deprecated but supported)
732
+ versiontracker --blacklist-auto-updates
733
+ ```
734
+
735
+ Deprecation Timeline (planned):
736
+
737
+ 1. Phase 1 (current): Dual support with stderr warnings on legacy flags.
738
+ 2. Phase 2 (future): Documentation removal of legacy flags; runtime still accepts them.
739
+ 3. Phase 3 (future major release): Possible removal of legacy flags (advance notice in CHANGELOG).
740
+
741
+ Contributors:
742
+
743
+ * When adding new filtering-related code, prefer naming like "blocklist"/"is_blocklisted".
744
+ * Retain adapter logic only at the CLI + config boundary layers.