Skip to content

Commit 77ede1b

Browse files
committed
⚡ enhance user configuration options for caching in Alfred workflow
1 parent c74dd44 commit 77ede1b

File tree

6 files changed

+287
-188
lines changed

6 files changed

+287
-188
lines changed

bin/main.dart

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,17 @@
11
import 'dart:io' show File, exitCode, stdout;
22

3-
import 'package:alfred_workflow/alfred_workflow.dart'
4-
show
5-
AlfredCache,
6-
AlfredItem,
7-
AlfredItemIcon,
8-
AlfredItemMod,
9-
AlfredItemModKey,
10-
AlfredItemText,
11-
AlfredItems,
12-
AlfredUpdater,
13-
AlfredWorkflow;
3+
import 'package:alfred_workflow/alfred_workflow.dart';
144
import 'package:algoliasearch/src/model/hit.dart';
155
import 'package:algoliasearch/src/model/search_response.dart';
166
import 'package:args/args.dart' show ArgParser, ArgResults;
177
import 'package:cli_script/cli_script.dart';
18-
import 'package:stash/stash_api.dart' show CreatedExpiryPolicy;
198

209
import 'src/env/env.dart' show Env;
2110
import 'src/extensions/string_helpers.dart';
2211
import 'src/models/search_result.dart' show SearchResult;
2312
import 'src/services/algolia_search.dart' show AlgoliaSearch;
2413
import 'src/services/emoji_downloader.dart' show EmojiDownloader;
14+
import 'src/models/user_config_key.dart' show UserConfigKey;
2515

2616
part 'main_helpers.dart';
2717

@@ -50,13 +40,41 @@ void main(List<String> arguments) {
5040

5141
_verbose = args['verbose'];
5242

43+
final Map<String, AlfredUserConfiguration>? userDefaults =
44+
await _workflow.getUserDefaults();
45+
46+
final AlfredUserConfigurationCheckBox? useFileCache =
47+
userDefaults?[UserConfigKey.useFileCache.toString()]
48+
as AlfredUserConfigurationCheckBox?;
49+
50+
final AlfredUserConfigurationNumberSlider? fileCacheMaxEntries =
51+
userDefaults?[UserConfigKey.fileCacheMaxEntries.toString()]
52+
as AlfredUserConfigurationNumberSlider?;
53+
54+
final AlfredUserConfigurationCheckBox? useAlfredCache =
55+
userDefaults?[UserConfigKey.useAlfredCache.toString()]
56+
as AlfredUserConfigurationCheckBox?;
57+
58+
final AlfredUserConfigurationNumberSlider? cacheTimeToLive =
59+
userDefaults?[UserConfigKey.cacheTtl.toString()]
60+
as AlfredUserConfigurationNumberSlider?;
61+
5362
final String query =
5463
args['query'].replaceAll(RegExp(r'\s+'), ' ').trim().toLowerCase();
5564

5665
if (_verbose) stdout.writeln('Query: "$query"');
5766

58-
_workflow.cacheKey = query.isNotEmpty ? query : 'ALL_GITMOJIS'.md5hex;
59-
if (await _workflow.getItems() == null) {
67+
if (useAlfredCache?.value ?? false) {
68+
_workflow.useAutomaticCache = true;
69+
} else if (useFileCache?.value ?? false) {
70+
_workflow.cacheKey = query.isNotEmpty ? query : 'ALL_GITMOJIS'.md5hex;
71+
_workflow.maxCacheEntries =
72+
fileCacheMaxEntries?.value ?? fileCacheMaxEntries?.defaultValue;
73+
}
74+
75+
_workflow.cacheTimeToLive = cacheTimeToLive?.value;
76+
77+
if ((await _workflow.getItems()).isEmpty) {
6078
await _performSearch(query.isNotEmpty ? query : '');
6179
}
6280
} on FormatException catch (err) {

bin/main_helpers.dart

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
part of 'main.dart';
22

3-
final AlfredWorkflow _workflow = AlfredWorkflow(
4-
cache: AlfredCache<AlfredItems>(
5-
fromEncodable: (Map<String, dynamic> json) => AlfredItems.fromJson(json),
6-
maxEntries: 1024,
7-
expiryPolicy: const CreatedExpiryPolicy(
8-
Duration(days: 7),
9-
),
10-
),
11-
)..disableAlfredSmartResultOrdering = true;
3+
final AlfredWorkflow _workflow = AlfredWorkflow()
4+
..disableAlfredSmartResultOrdering = true;
125

136
final AlfredUpdater _updater = AlfredUpdater(
147
githubRepositoryUrl: Env.githubRepositoryUrl,
@@ -30,7 +23,7 @@ Future<void> _performSearch(String query) async {
3023
try {
3124
final SearchResponse searchResponse = await AlgoliaSearch.query(query);
3225

33-
if (searchResponse.nbHits > 0) {
26+
if ((searchResponse.nbHits ?? 0) > 0) {
3427
final AlfredItems items = AlfredItems(
3528
await Future.wait(searchResponse.hits
3629
.map((Hit hit) => SearchResult.fromJson(
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:recase/recase.dart';
2+
3+
enum UserConfigKey {
4+
useAlfredCache,
5+
useFileCache,
6+
cacheTtl,
7+
fileCacheMaxEntries;
8+
9+
@override
10+
String toString() => name.snakeCase;
11+
}

info.plist

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,96 @@ Either press `⌘Y` to Quick Look the result, or press `&lt;enter&gt;` copy it t
416416
</dict>
417417
</dict>
418418
<key>userconfigurationconfig</key>
419-
<array/>
419+
<array>
420+
<dict>
421+
<key>config</key>
422+
<dict>
423+
<key>default</key>
424+
<true/>
425+
<key>required</key>
426+
<false/>
427+
<key>text</key>
428+
<string>Enable (Alfred 5.5+ only)</string>
429+
</dict>
430+
<key>description</key>
431+
<string>Presents results from previous run when enabled and not expired. Mutually exclusive with File Cache.</string>
432+
<key>label</key>
433+
<string>Use Alfred Cache</string>
434+
<key>type</key>
435+
<string>checkbox</string>
436+
<key>variable</key>
437+
<string>use_alfred_cache</string>
438+
</dict>
439+
<dict>
440+
<key>config</key>
441+
<dict>
442+
<key>default</key>
443+
<false/>
444+
<key>required</key>
445+
<false/>
446+
<key>text</key>
447+
<string>Enable (Recommended for Alfred 5 or older)</string>
448+
</dict>
449+
<key>description</key>
450+
<string>Presents results from previous run when enabled and not expired. Mutually exclusive with Alfred Cache.</string>
451+
<key>label</key>
452+
<string>Use File Cache</string>
453+
<key>type</key>
454+
<string>checkbox</string>
455+
<key>variable</key>
456+
<string>use_file_cache</string>
457+
</dict>
458+
<dict>
459+
<key>config</key>
460+
<dict>
461+
<key>defaultvalue</key>
462+
<integer>86400</integer>
463+
<key>markercount</key>
464+
<integer>24</integer>
465+
<key>maxvalue</key>
466+
<integer>86400</integer>
467+
<key>minvalue</key>
468+
<integer>5</integer>
469+
<key>onlystoponmarkers</key>
470+
<false/>
471+
<key>showmarkers</key>
472+
<false/>
473+
</dict>
474+
<key>description</key>
475+
<string>Time to live for cached data is defined as a number of seconds between 5 and 86400 (i.e. 24 hours).</string>
476+
<key>label</key>
477+
<string>Cache TTL</string>
478+
<key>type</key>
479+
<string>slider</string>
480+
<key>variable</key>
481+
<string>cache_ttl</string>
482+
</dict>
483+
<dict>
484+
<key>config</key>
485+
<dict>
486+
<key>defaultvalue</key>
487+
<integer>1280</integer>
488+
<key>markercount</key>
489+
<integer>8</integer>
490+
<key>maxvalue</key>
491+
<integer>2048</integer>
492+
<key>minvalue</key>
493+
<integer>256</integer>
494+
<key>onlystoponmarkers</key>
495+
<true/>
496+
<key>showmarkers</key>
497+
<true/>
498+
</dict>
499+
<key>description</key>
500+
<string>Maximum File Cache entries</string>
501+
<key>label</key>
502+
<string>Max File Cache</string>
503+
<key>type</key>
504+
<string>slider</string>
505+
<key>variable</key>
506+
<string>file_cache_max_entries</string>
507+
</dict>
508+
</array>
420509
<key>version</key>
421510
<string></string>
422511
<key>webaddress</key>

0 commit comments

Comments
 (0)