-
Notifications
You must be signed in to change notification settings - Fork 0
/
search_script.py
executable file
·119 lines (93 loc) · 2.59 KB
/
search_script.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
#!/usr/bin/python3
import json
import os
import sys
from dataclasses import dataclass, field
from typing import List
import argparse
IDEA_PATH = ""
@dataclass()
class Icon:
path: str
@dataclass
class Item:
uid: str
title: str
subtitle: str
arg: str
icon: Icon
autocomplete: str = ""
type: str = "default"
@dataclass
class Items:
items: List[Item] = field(default_factory=list)
def add(self, item: Item):
self.items.append(item)
def toJson(self) -> str:
return json.dumps(self, default=lambda o: o.__dict__)
def search(q: str, dirname):
ps = []
filenames = os.listdir(dirname)
for i, filename in enumerate(filenames):
full_path = os.path.join(dirname, filename)
if os.path.isdir(full_path) and check_jetbrain_project(full_path):
if q == "" or filename.lower().find(q.lower()) >= 0:
ps.append({
"index": i,
"project_name": get_project_name(full_path),
"dirname": filename,
"path": os.path.join(dirname, filename)
})
return ps
def check_jetbrain_project(path):
filenames = os.listdir(path)
for filename in filenames:
if filename == ".idea":
return True
return False
def get_project_name(path):
name = path.split("/")[-1]
dotname_path = path + '/.idea/.name'
if os.path.exists(dotname_path):
with open(dotname_path, 'r') as file:
name = file.read().replace('\n', '')
return name
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument(
"--idea",
type=str,
default="/usr/local/bin/idea"
)
parser.add_argument(
"--query",
type=str,
default=""
)
parser.add_argument(
"--project_paths",
nargs="*",
type=str,
default=[]
)
parser.add_argument(
"--icon_path",
type=str,
default="ij_icon.png"
)
args = parser.parse_args()
IDEA_PATH = args.idea
q = args.query
projects = []
icon_path = args.icon_path
for path in args.project_paths:
projects.extend(search(q, path))
projects = sorted(projects, key=(lambda x: x["project_name"]))
items = Items()
for project in projects:
item = Item(uid=project["index"], arg=project["path"], title=project["project_name"],
subtitle=f'Open Project "{project["dirname"]}"', icon=Icon(path=icon_path))
items.add(item)
print(items.toJson())
if __name__ == "__main__":
main(sys.argv)