-
Notifications
You must be signed in to change notification settings - Fork 3
/
actions.py
157 lines (131 loc) · 5.71 KB
/
actions.py
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import logging
from constant import ICON, NAME
# noinspection PyUnresolvedReferences
from ulauncher.api.shared.item.ExtensionResultItem import ExtensionResultItem
# noinspection PyUnresolvedReferences
from ulauncher.api.shared.action.CopyToClipboardAction import CopyToClipboardAction
# noinspection PyUnresolvedReferences
from ulauncher.api.shared.action.RunScriptAction import RunScriptAction
_LOGGER_ = logging.getLogger(__name__)
class DefaultAction:
@staticmethod
def execute():
_LOGGER_.debug("Executing DefaultAction")
return [ExtensionResultItem(
icon=ICON,
name=NAME,
description="Enter: \"set <key> <value> | [get] <key> [unset]\"")]
class GetAction:
def __init__(self, db, text):
self.text = text
self.db = db
def execute(self):
_LOGGER_.debug("Executing GetAction")
items = []
exists = 0
for row in self.db.execute_statement(
"SELECT key, value, tags from KV where key like '%{}%' or tags like '%{}%'".format(self.text,
self.text)):
exists = 1
key = row[0]
value = row[1]
value_fix = value.strip().replace('$', '\$').replace('"', '\\"').replace('`', '\\`') + '\n'
script_action = 'sleep 0.01m && echo -n "' + value_fix + \
'" | xclip -i -selection clipboard && sleep 0.01m && xdotool key --clearmodifiers ctrl+v &'
item = ExtensionResultItem(
icon=ICON,
name="{} = {}".format(key, value.replace('&', '&')),
description="Press enter or click to copy '{}' to clipboard or type 'unset' to unset from db".format(
value),
on_alt_enter=RunScriptAction(script_action, []),
on_enter=CopyToClipboardAction(value))
items.append(item)
if not exists:
item = ExtensionResultItem(icon=ICON, name=NAME)
if self.text == "":
item._description = "It looks like you have nothing stored"
else:
item._description = "No VALUE for KEY: '{}'".format(self.text)
items.append(item)
return items
class UnsetAction:
def __init__(self, db, key):
self.key_filter = key
self.db = db
def execute(self):
_LOGGER_.debug("==== Executing UnsetAction")
exists = 0
statement = "SELECT key, value, tags from KV where key = '{}'".format(self.key_filter)
key = ""
value = ""
for row in self.db.execute_statement(statement):
exists = 1
key = row[0]
value = row[1]
item = ExtensionResultItem(icon=ICON, name=NAME)
if exists:
item._description = "Key '{}' of Value '{}' unset".format(key, value)
statement = "DELETE FROM KV WHERE KEY = '{}'".format(key)
self.db.execute_statement(statement)
else:
item._description = "'{}' not found to unset".format(self.key_filter)
return [item]
class SetAction:
def __init__(self, db, key, value):
self.key = key
self.value = value
self.db = db
def execute(self):
_LOGGER_.debug("==== Executing SetAction")
item = ExtensionResultItem(
icon=ICON,
name="{} = {}".format(self.key, self.value.replace('&', '&')),
description="",
on_enter=CopyToClipboardAction(self.value))
cursor = self.db.execute_statement("SELECT key, value, tags from KV where key = '{}'".format(self.key))
exists = 0
for _ in cursor:
exists = 1
break
if exists:
statement = "UPDATE KV SET VALUE = '{}' WHERE KEY = '{}'".format(self.value, self.key)
item._description = "Update '{}' with '{}'".format(self.key, self.value)
else:
statement = "INSERT INTO KV (KEY,VALUE) VALUES ('{}', '{}')".format(self.key, self.value)
item._description = "Insert '{}' with '{}'".format(self.key, self.value)
self.db.execute_statement(statement)
_LOGGER_.debug("Insert '{}' with '{}'".format(self.key, self.value))
return [item]
class ActionFactory:
def __init__(self, arguments, db):
self.arguments = arguments
self.db = db
def create(self):
if self.is_get_without_filter(self.arguments):
text = self.arguments[0] if len(self.arguments) == 1 else ""
return GetAction(self.db, text)
if self.is_get_with_filter(self.arguments):
return GetAction(self.db, self.arguments[1])
if self.is_set(self.arguments):
return SetAction(self.db, self.arguments[1], ' '.join(self.arguments[2:]))
if self.is_set_without_last_argument(self.arguments):
return GetAction(self.db, self.arguments[1])
if self.is_unset(self.arguments):
return UnsetAction(self.db, self.arguments[1])
else:
return DefaultAction()
@staticmethod
def is_get_without_filter(arguments):
return (len(arguments) == 1 and arguments[0] == "get") or (len(arguments) == 1 and arguments[0] != "set")
@staticmethod
def is_get_with_filter(arguments):
return len(arguments) == 2 and arguments[0] == "get"
@staticmethod
def is_set(arguments):
return len(arguments) >= 3 and arguments[0] == "set"
@staticmethod
def is_set_without_last_argument(arguments):
return len(arguments) == 2 and arguments[0] == "set"
@staticmethod
def is_unset(arguments):
return len(arguments) == 3 and arguments[0] == "get" and arguments[2] == "unset"