Coverage report

|  |  | Statements |  | Branches |  | Total
--- | --- | --- | --- | --- | --- | --- | ---
File | function |  | coverage | statements | missing | excluded |  | coverage | branches | partial |  | coverage
src / beautyspot / __init__.py | Spot |  | 100% | 16 | 0 | 0 |  | 100% | 6 | 0 |  | 100%
src / beautyspot / __init__.py | (no function) |  | 91% | 23 | 2 | 0 |  | 100% | 0 | 0 |  | 91%
src / beautyspot / _version.py | (no function) |  | 0% | 13 | 13 | 5 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cache.py | CacheManager.__init__ |  | 100% | 9 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager.make_cache_key |  | 100% | 6 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager.calculate_expires_at |  | 80% | 10 | 2 | 0 |  | 75% | 8 | 2 |  | 78%
src / beautyspot / cache.py | CacheManager.get |  | 100% | 26 | 0 | 0 |  | 100% | 10 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager.set |  | 88% | 16 | 2 | 0 |  | 100% | 4 | 0 |  | 90%
src / beautyspot / cache.py | CacheManager.herd_sync |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager.herd_async |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager.wait_herd_sync |  | 96% | 23 | 1 | 0 |  | 83% | 12 | 2 |  | 91%
src / beautyspot / cache.py | CacheManager.wait_herd_async |  | 90% | 29 | 3 | 0 |  | 79% | 14 | 3 |  | 86%
src / beautyspot / cache.py | CacheManager._await_herd_signal_async |  | 53% | 15 | 7 | 0 |  | 12% | 8 | 1 |  | 39%
src / beautyspot / cache.py | CacheManager.notify_and_cleanup_inflight |  | 100% | 13 | 0 | 0 |  | 80% | 10 | 2 |  | 91%
src / beautyspot / cache.py | CacheManager._notify_future |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cache.py | CacheManager._notify_future._set |  | 100% | 6 | 0 | 0 |  | 83% | 6 | 1 |  | 92%
src / beautyspot / cache.py | (no function) |  | 100% | 42 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _safe_sort_key |  | 100% | 3 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_ndarray |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_instance |  | 81% | 21 | 4 | 0 |  | 75% | 12 | 3 |  | 79%
src / beautyspot / cachekey.py | _is_ndarray_like |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | canonicalize |  | 53% | 15 | 7 | 0 |  | 70% | 10 | 3 |  | 60%
src / beautyspot / cachekey.py | _canonicalize_dict |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_list |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_tuple |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_set |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | _canonicalize_frozenset |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | _canonicalize_deque |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | _canonicalize_defaultdict |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | _canonicalize_ordereddict |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | _canonicalize_enum |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | _canonicalize_type |  | 14% | 21 | 18 | 0 |  | 10% | 10 | 1 |  | 13%
src / beautyspot / cachekey.py | _canonicalize_np_ndarray |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | KeyGenPolicy.__init__ |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | KeyGenPolicy.bind |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | KeyGenPolicy.bind._bound_keygen |  | 76% | 17 | 4 | 0 |  | 88% | 8 | 1 |  | 80%
src / beautyspot / cachekey.py | KeyGen.from_path_stat |  | 0% | 5 | 5 | 0 |  | 0% | 2 | 0 |  | 0%
src / beautyspot / cachekey.py | KeyGen.from_file_content |  | 18% | 11 | 9 | 0 |  | 25% | 4 | 1 |  | 20%
src / beautyspot / cachekey.py | KeyGen._default |  | 67% | 12 | 4 | 0 |  | 50% | 2 | 1 |  | 64%
src / beautyspot / cachekey.py | KeyGen.hash_items |  | 50% | 8 | 4 | 0 |  | 50% | 2 | 1 |  | 50%
src / beautyspot / cachekey.py | KeyGen.ignore |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | KeyGen.map |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cachekey.py | KeyGen.file_content |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | KeyGen.path_stat |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cachekey.py | (no function) |  | 97% | 74 | 2 | 0 |  | 100% | 0 | 0 |  | 97%
src / beautyspot / cli.py | get_service |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cli.py | _is_port_in_use |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cli.py | _find_available_port |  | 80% | 5 | 1 | 0 |  | 50% | 4 | 2 |  | 67%
src / beautyspot / cli.py | _format_size |  | 80% | 5 | 1 | 0 |  | 75% | 4 | 1 |  | 78%
src / beautyspot / cli.py | _format_timestamp |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _get_task_count |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _list_databases |  | 91% | 22 | 2 | 0 |  | 83% | 6 | 1 |  | 89%
src / beautyspot / cli.py | _list_tasks |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _list_tasks_inner |  | 82% | 33 | 6 | 0 |  | 67% | 12 | 4 |  | 78%
src / beautyspot / cli.py | ui_cmd |  | 67% | 24 | 8 | 0 |  | 100% | 6 | 0 |  | 73%
src / beautyspot / cli.py | list_cmd |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cli.py | show_cmd |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _show_cmd_inner |  | 40% | 35 | 21 | 0 |  | 33% | 18 | 4 |  | 38%
src / beautyspot / cli.py | stats_cmd |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _stats_cmd_inner |  | 75% | 40 | 10 | 0 |  | 69% | 16 | 3 |  | 73%
src / beautyspot / cli.py | clear_cmd |  | 89% | 18 | 2 | 0 |  | 70% | 10 | 3 |  | 82%
src / beautyspot / cli.py | clean_cmd |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / cli.py | _clean_cmd_inner |  | 79% | 24 | 5 | 0 |  | 67% | 12 | 2 |  | 75%
src / beautyspot / cli.py | gc_cmd |  | 68% | 77 | 25 | 0 |  | 61% | 38 | 7 |  | 65%
src / beautyspot / cli.py | prune_cmd |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / cli.py | _prune_cmd_inner |  | 65% | 31 | 11 | 0 |  | 56% | 16 | 3 |  | 62%
src / beautyspot / cli.py | version_cmd |  | 60% | 5 | 2 | 0 |  | 100% | 0 | 0 |  | 60%
src / beautyspot / cli.py | main |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / cli.py | (no function) |  | 98% | 49 | 1 | 0 |  | 50% | 2 | 1 |  | 96%
src / beautyspot / content_types.py | (no function) |  | 100% | 10 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | _BackgroundLoop.__init__ |  | 100% | 8 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | _BackgroundLoop._run_event_loop |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | _BackgroundLoop._task_wrapper |  | 100% | 6 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | _BackgroundLoop.submit |  | 38% | 24 | 15 | 0 |  | 50% | 4 | 0 |  | 39%
src / beautyspot / core.py | _BackgroundLoop.stop |  | 82% | 11 | 2 | 0 |  | 75% | 8 | 2 |  | 79%
src / beautyspot / core.py | _BackgroundLoop._shutdown |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / core.py | Spot.__init__ |  | 89% | 28 | 3 | 0 |  | 50% | 6 | 3 |  | 82%
src / beautyspot / core.py | Spot.__enter__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.__exit__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._track_future |  | 83% | 6 | 1 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / core.py | Spot._track_future._on_done |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.maintenance |  | 100% | 8 | 0 | 0 |  | 50% | 4 | 2 |  | 83%
src / beautyspot / core.py | Spot._ensure_bg_resources |  | 100% | 15 | 0 | 0 |  | 67% | 12 | 4 |  | 85%
src / beautyspot / core.py | Spot._shutdown_resources |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot.shutdown |  | 100% | 10 | 0 | 0 |  | 100% | 8 | 0 |  | 100%
src / beautyspot / core.py | Spot.flush |  | 93% | 15 | 1 | 0 |  | 83% | 6 | 1 |  | 90%
src / beautyspot / core.py | Spot._drain_futures |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._get_func_identifier |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._trigger_auto_eviction |  | 81% | 26 | 5 | 0 |  | 70% | 10 | 3 |  | 78%
src / beautyspot / core.py | Spot._trigger_auto_eviction._run_clean_safe |  | 0% | 4 | 4 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / core.py | Spot._trigger_auto_eviction._clear_eviction_flag |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._trigger_auto_eviction._run_clean_coro |  | 0% | 4 | 4 | 0 |  | 0% | 2 | 0 |  | 0%
src / beautyspot / core.py | Spot._resolve_key_fn |  | 100% | 8 | 0 | 0 |  | 100% | 6 | 0 |  | 100%
src / beautyspot / core.py | Spot.register |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot.register.decorator |  | 100% | 7 | 0 | 0 |  | 100% | 4 | 0 |  | 100%
src / beautyspot / core.py | Spot.register_type |  | 67% | 3 | 1 | 0 |  | 50% | 2 | 1 |  | 60%
src / beautyspot / core.py | Spot._dispatch_hooks |  | 71% | 7 | 2 | 0 |  | 100% | 4 | 0 |  | 82%
src / beautyspot / core.py | Spot._dispatch_hooks_async |  | 100% | 3 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot._resolve_settings |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._prepare_execution |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._build_cache_hit_context |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._build_save_kwargs |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._persist_result_sync |  | 92% | 12 | 1 | 0 |  | 75% | 4 | 1 |  | 88%
src / beautyspot / core.py | Spot._persist_result_async |  | 67% | 18 | 6 | 0 |  | 50% | 6 | 1 |  | 62%
src / beautyspot / core.py | Spot._execute_sync |  | 97% | 29 | 1 | 0 |  | 90% | 10 | 1 |  | 95%
src / beautyspot / core.py | Spot._execute_async |  | 97% | 31 | 1 | 0 |  | 90% | 10 | 1 |  | 95%
src / beautyspot / core.py | Spot._handle_save_error |  | 100% | 8 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot._notify_save_discarded |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot._submit_background_save |  | 100% | 6 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot._save_result_async |  | 100% | 10 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | Spot._save_result_safe |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.consume |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.consume.decorator |  | 100% | 6 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.consume.decorator.sync_wrapper |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / core.py | Spot.consume.decorator.async_wrapper |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.mark |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.mark |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.mark |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.mark.decorator |  | 89% | 9 | 1 | 0 |  | 50% | 2 | 1 |  | 82%
src / beautyspot / core.py | Spot.mark.decorator.sync_wrapper |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.mark.decorator.async_wrapper |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.cached_run |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.cached_run |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / core.py | Spot.cached_run |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / core.py | (no function) |  | 100% | 85 | 0 | 20 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / dashboard.py | get_args |  | 0% | 4 | 4 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / dashboard.py | load_data |  | 0% | 5 | 5 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / dashboard.py | (no function) |  | 0% | 108 | 108 | 0 |  | 0% | 46 | 0 |  | 0%
src / beautyspot / db.py | TaskDBCore.init_schema |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | TaskDBCore.get |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | TaskDBCore.save |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | TaskDBCore.delete |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Flushable.flush |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Shutdownable.shutdown |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.delete_expired |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.prune |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.get_outdated_tasks |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.get_blob_refs |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.delete_all |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.get_keys_start_with |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | Maintenable.get_history |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | _ReadConnWrapper.__init__ |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | _ReadConnWrapper.close |  | 58% | 12 | 5 | 0 |  | 50% | 6 | 1 |  | 56%
src / beautyspot / db.py | _ReadConnWrapper.__del__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | _ensure_utc_isoformat |  | 83% | 6 | 1 | 0 |  | 75% | 4 | 1 |  | 80%
src / beautyspot / db.py | _WriteTask.try_cancel |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / db.py | _WriteTask.try_start |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / db.py | _WriteTask.mark_done |  | 100% | 3 | 0 | 0 |  | 50% | 2 | 1 |  | 80%
src / beautyspot / db.py | TaskDBBase.init_schema |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.get |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.save |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.delete |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.delete_expired |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.prune |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.get_outdated_tasks |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.get_blob_refs |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.delete_all |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.get_keys_start_with |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | TaskDBBase.get_history |  | 0% | 5 | 5 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | SQLiteTaskDB.__init__ |  | 95% | 20 | 1 | 0 |  | 50% | 2 | 1 |  | 91%
src / beautyspot / db.py | SQLiteTaskDB.reset |  | 79% | 19 | 4 | 0 |  | 50% | 6 | 3 |  | 72%
src / beautyspot / db.py | SQLiteTaskDB._ensure_cache_dir |  | 71% | 7 | 2 | 0 |  | 100% | 2 | 0 |  | 78%
src / beautyspot / db.py | SQLiteTaskDB._read_connect |  | 66% | 35 | 12 | 0 |  | 58% | 12 | 5 |  | 64%
src / beautyspot / db.py | SQLiteTaskDB._writer_loop |  | 80% | 49 | 10 | 0 |  | 71% | 14 | 2 |  | 78%
src / beautyspot / db.py | SQLiteTaskDB._enqueue_write |  | 81% | 36 | 7 | 0 |  | 68% | 28 | 9 |  | 75%
src / beautyspot / db.py | SQLiteTaskDB.shutdown |  | 74% | 19 | 5 | 0 |  | 80% | 10 | 2 |  | 76%
src / beautyspot / db.py | SQLiteTaskDB.init_schema |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.init_schema._op |  | 29% | 41 | 29 | 0 |  | 30% | 20 | 4 |  | 30%
src / beautyspot / db.py | SQLiteTaskDB.get |  | 80% | 15 | 3 | 0 |  | 88% | 8 | 1 |  | 83%
src / beautyspot / db.py | SQLiteTaskDB.save |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.save._op |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.get_history |  | 67% | 9 | 3 | 0 |  | 50% | 2 | 1 |  | 64%
src / beautyspot / db.py | SQLiteTaskDB.delete |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | SQLiteTaskDB.delete._op |  | 0% | 2 | 2 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / db.py | SQLiteTaskDB.delete_all |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.delete_all._op |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.prune |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.prune._op |  | 100% | 4 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.get_outdated_tasks |  | 88% | 8 | 1 | 0 |  | 75% | 4 | 1 |  | 83%
src / beautyspot / db.py | SQLiteTaskDB.delete_expired |  | 80% | 5 | 1 | 0 |  | 50% | 2 | 1 |  | 71%
src / beautyspot / db.py | SQLiteTaskDB.delete_expired._op |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | SQLiteTaskDB.get_blob_refs |  | 80% | 5 | 1 | 0 |  | 50% | 2 | 1 |  | 71%
src / beautyspot / db.py | SQLiteTaskDB.get_keys_start_with |  | 83% | 6 | 1 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / db.py | SQLiteTaskDB.count_tasks |  | 80% | 10 | 2 | 0 |  | 100% | 0 | 0 |  | 80%
src / beautyspot / db.py | SQLiteTaskDB.flush |  | 84% | 19 | 3 | 0 |  | 75% | 8 | 2 |  | 81%
src / beautyspot / db.py | SQLiteTaskDB.flush._noop_op |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / db.py | (no function) |  | 100% | 87 | 0 | 43 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / exceptions.py | (no function) |  | 100% | 6 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | HookBase.pre_execute |  | 100% | 0 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | HookBase.on_cache_hit |  | 100% | 0 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | HookBase.on_cache_miss |  | 100% | 0 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | _wrap_with_lock |  | 100% | 3 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | _wrap_with_lock.wrapper |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | ThreadSafeHookBase.__init_subclass__ |  | 100% | 4 | 0 | 0 |  | 75% | 4 | 1 |  | 88%
src / beautyspot / hooks.py | ThreadSafeHookBase.__init__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / hooks.py | ThreadSafeHookBase.__getattr__ |  | 0% | 3 | 3 | 0 |  | 0% | 2 | 0 |  | 0%
src / beautyspot / hooks.py | (no function) |  | 100% | 16 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / lifecycle.py | _ForeverSentinel.__new__ |  | 100% | 5 | 0 | 0 |  | 75% | 4 | 1 |  | 89%
src / beautyspot / lifecycle.py | _ForeverSentinel.__repr__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / lifecycle.py | _ForeverSentinel.__bool__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / lifecycle.py | parse_retention |  | 100% | 26 | 0 | 0 |  | 96% | 24 | 1 |  | 98%
src / beautyspot / lifecycle.py | LifecyclePolicy.__init__ |  | 75% | 4 | 1 | 0 |  | 50% | 2 | 1 |  | 67%
src / beautyspot / lifecycle.py | LifecyclePolicy.resolve |  | 100% | 4 | 0 | 0 |  | 100% | 4 | 0 |  | 100%
src / beautyspot / lifecycle.py | LifecyclePolicy.resolve_with_fallback |  | 100% | 7 | 0 | 0 |  | 100% | 8 | 0 |  | 100%
src / beautyspot / lifecycle.py | LifecyclePolicy.default |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / lifecycle.py | (no function) |  | 100% | 30 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / limiter.py | LimiterProtocol.consume |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / limiter.py | LimiterProtocol.consume_async |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / limiter.py | TokenBucket.__init__ |  | 100% | 6 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / limiter.py | TokenBucket._consume_reservation |  | 86% | 14 | 2 | 0 |  | 75% | 8 | 2 |  | 82%
src / beautyspot / limiter.py | TokenBucket.consume |  | 100% | 3 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / limiter.py | TokenBucket.consume_async |  | 100% | 3 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / limiter.py | (no function) |  | 100% | 11 | 0 | 3 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.__init__ |  | 100% | 5 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.close |  | 100% | 2 | 0 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / maintenance.py | MaintenanceService.__enter__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.__exit__ |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.from_path |  | 90% | 21 | 2 | 0 |  | 100% | 4 | 0 |  | 92%
src / beautyspot / maintenance.py | MaintenanceService.get_history |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.get_task_detail |  | 100% | 20 | 0 | 0 |  | 80% | 10 | 2 |  | 93%
src / beautyspot / maintenance.py | MaintenanceService.delete_expired_tasks |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.delete_task |  | 85% | 13 | 2 | 0 |  | 67% | 6 | 2 |  | 79%
src / beautyspot / maintenance.py | MaintenanceService.get_prunable_tasks |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.prune |  | 100% | 5 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.clear |  | 100% | 4 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.scan_garbage |  | 84% | 25 | 4 | 0 |  | 92% | 12 | 1 |  | 86%
src / beautyspot / maintenance.py | MaintenanceService.scan_garbage._normalize_location |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.scan_garbage._basename |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / maintenance.py | MaintenanceService.clean_garbage |  | 70% | 40 | 12 | 0 |  | 68% | 22 | 7 |  | 69%
src / beautyspot / maintenance.py | MaintenanceService.resolve_key_prefix |  | 62% | 8 | 3 | 0 |  | 50% | 6 | 1 |  | 57%
src / beautyspot / maintenance.py | MaintenanceService.scan_orphan_projects |  | 100% | 10 | 0 | 0 |  | 88% | 8 | 1 |  | 94%
src / beautyspot / maintenance.py | MaintenanceService.delete_project_storage |  | 50% | 6 | 3 | 0 |  | 50% | 2 | 1 |  | 50%
src / beautyspot / maintenance.py | (no function) |  | 100% | 33 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / serializer.py | SerializerProtocol.dumps |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / serializer.py | SerializerProtocol.loads |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / serializer.py | TypeRegistryProtocol.register |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / serializer.py | MsgpackSerializer.__init__ |  | 100% | 6 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / serializer.py | MsgpackSerializer._get_local_cache |  | 100% | 5 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / serializer.py | MsgpackSerializer._enforce_cache_size |  | 100% | 2 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / serializer.py | MsgpackSerializer.register |  | 80% | 15 | 3 | 0 |  | 67% | 6 | 2 |  | 76%
src / beautyspot / serializer.py | MsgpackSerializer._default_packer |  | 89% | 35 | 4 | 0 |  | 92% | 12 | 1 |  | 89%
src / beautyspot / serializer.py | MsgpackSerializer._ext_hook |  | 80% | 10 | 2 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / serializer.py | MsgpackSerializer.dumps |  | 78% | 9 | 2 | 0 |  | 50% | 4 | 2 |  | 69%
src / beautyspot / serializer.py | MsgpackSerializer.loads |  | 83% | 6 | 1 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / serializer.py | (no function) |  | 100% | 19 | 0 | 10 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | StoragePolicyProtocol.should_save_as_blob |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | ThresholdStoragePolicy.should_save_as_blob |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | WarningOnlyPolicy.should_save_as_blob |  | 100% | 3 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / storage.py | AlwaysBlobPolicy.should_save_as_blob |  | 100% | 1 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | BlobStorageCore.save |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | BlobStorageCore.load |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | BlobStorageCore.delete |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | Maintenable.list_keys |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | Maintenable.get_mtime |  | 100% | 0 | 0 | 1 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | BlobStorageBase.save |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | BlobStorageBase.load |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | BlobStorageBase.delete |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | BlobStorageBase.list_keys |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | BlobStorageBase.get_mtime |  | 0% | 1 | 1 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | LocalStorage.__init__ |  | 100% | 2 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
src / beautyspot / storage.py | LocalStorage._ensure_cache_dir |  | 71% | 7 | 2 | 0 |  | 100% | 2 | 0 |  | 78%
src / beautyspot / storage.py | LocalStorage._validate_key |  | 100% | 2 | 0 | 0 |  | 100% | 2 | 0 |  | 100%
src / beautyspot / storage.py | LocalStorage.save |  | 65% | 17 | 6 | 0 |  | 100% | 0 | 0 |  | 65%
src / beautyspot / storage.py | LocalStorage.load |  | 80% | 10 | 2 | 0 |  | 100% | 4 | 0 |  | 86%
src / beautyspot / storage.py | LocalStorage.delete |  | 67% | 9 | 3 | 0 |  | 50% | 2 | 1 |  | 64%
src / beautyspot / storage.py | LocalStorage.list_keys |  | 80% | 5 | 1 | 0 |  | 67% | 6 | 2 |  | 73%
src / beautyspot / storage.py | LocalStorage.get_mtime |  | 86% | 7 | 1 | 0 |  | 50% | 2 | 1 |  | 78%
src / beautyspot / storage.py | LocalStorage.clean_temp_files |  | 77% | 13 | 3 | 0 |  | 75% | 8 | 2 |  | 76%
src / beautyspot / storage.py | LocalStorage.prune_empty_dirs |  | 50% | 22 | 11 | 0 |  | 60% | 10 | 2 |  | 53%
src / beautyspot / storage.py | S3Storage.__init__ |  | 0% | 8 | 8 | 0 |  | 0% | 2 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage._parse_s3_uri |  | 0% | 7 | 7 | 0 |  | 0% | 4 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage.save |  | 0% | 4 | 4 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage.load |  | 0% | 9 | 9 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage.delete |  | 0% | 5 | 5 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage.get_mtime |  | 0% | 6 | 6 | 0 |  | 100% | 0 | 0 |  | 0%
src / beautyspot / storage.py | S3Storage.list_keys |  | 0% | 4 | 4 | 0 |  | 0% | 4 | 0 |  | 0%
src / beautyspot / storage.py | create_storage |  | 67% | 3 | 1 | 0 |  | 50% | 2 | 1 |  | 60%
src / beautyspot / storage.py | (no function) |  | 96% | 70 | 3 | 11 |  | 100% | 0 | 0 |  | 96%
src / beautyspot / types.py | HookContextBase.__post_init__ |  | 100% | 2 | 0 | 0 |  | 50% | 2 | 1 |  | 75%
src / beautyspot / types.py | (no function) |  | 100% | 40 | 0 | 0 |  | 100% | 0 | 0 |  | 100%
Total |  |  | 77% | 2647 | 598 | 120 |  | 66% | 818 | 151 |  | 75%

No items found using the specified filter.