summaryrefslogtreecommitdiff
path: root/saucypy
blob: 1843ade0c293109fcb900c7139b43c7577dc2420 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python

import difflib
import json
import optparse
import shlex
import sys

VERSION = "1.0.4"

ENTRIES_FILE = "saucypy.json"

def find( key, entries ):
	return difflib.get_close_matches( key, entries.keys(), 5, cutoff = 0.3 )

def parse_args():
	args = sys.argv[1:]
	if not args:
		args = shlex.split( sys.stdin.read() )
	parser = optparse.OptionParser( usage = "!source <term> | !source --add <key> <value>" )
	parser.add_option( "-a", "--add", action = "store", nargs = 2 )
	parser.add_option( "-i", "--index", action = "store", type = int )
	parser.add_option( "-c", "--count", action = "store_true" )
	parser.add_option( "-v", "--version", action = "store_true" )
	return parser.parse_args( args )

def main():
	options, args = parse_args()

	if options.version:
		print (VERSION)
		sys.exit( 0 )

	try:
		entries = json.load( open( ENTRIES_FILE ) )
	except IOError:
		entries = {}

	if options.add:
		key, value = options.add
		matches = find( key, entries )
		if len( matches ) > 1:
			exact_match = list(filter( lambda x: x == key, matches))
			if exact_match:
				print ("There is already an item named " + key)
			else:
				entries[key] = value
				json.dump( entries, open( ENTRIES_FILE, "w" ), indent = 4, sort_keys = True )
				print (key + ": " + value + " added")
	elif options.count:
		print ("Entries: {0}".format( len( entries.keys() ) ))
	else:
		if not args:
			print ("Expected a search argument, got nothing.")
			sys.exit( 1 )

		matches = find( args[0], entries )
		if len( matches ) > 1:
			exact_match = list(filter( lambda x: x == args[0], matches))
			if exact_match:
				print (entries[exact_match[0]])
			elif options.index is not None:
				try:
					print (entries[matches[options.index]])
				except IndexError:
					print ("Match index out of range.")
					sys.exit( 1 )
			else:
				print ("Matches (use -i option to pick one) -> {0}".format( ", ".join( "{0}: {1}".format( i, m ) for i, m in enumerate( matches ) ) ))
		elif matches:
			print (entries[matches[0]])
		else:
			print ("No match found.")

if __name__ == "__main__":
	main()