-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimport.py
145 lines (116 loc) · 4.41 KB
/
import.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
import os.path
import sys
import json
import ulid
from db_connect import ObjectRelationalMapping
from chardet import detect
CONFIG_FILE = "config.json"
def path_get():
json_open = open(CONFIG_FILE, 'r')
json_load = json.load(json_open)
json_open.close()
return json_load
# データベースがあるか確認:ない場合→作成
def check_db(db_path):
if not os.path.exists(db_path):
with open(db_path, "w") as f:
f.write("")
def tabel_check(db_path: str) -> None:
connect = ObjectRelationalMapping(db_path)
env_tables_sql = '''SELECT name
FROM sqlite_master
WHERE type='table';'''
table_data = connect.db_execute(env_tables_sql).fetchall()
connect.db_close()
table_list = []
for i in range(len(table_data)):
table_list.append(table_data[i][0])
# 「environments」テーブルの確認:ない場合→作成
if not ("environments" in table_list):
env_connect = ObjectRelationalMapping(db_path)
crete_env_sql = '''CREATE TABLE environments(
name TEXT PRIMARY KEY,
description TEXT,
create_date INTEGER);'''
env_connect.db_execute(crete_env_sql)
env_connect.db_commit()
env_connect.db_close()
# 「libraries」テーブルの確認:ない場合→作成
if not ("libraries" in table_list):
libraries_connect = ObjectRelationalMapping(db_path)
create_library_sql = '''CREATE TABLE libraries(
id TEXT PRIMARY KEY,
library_name TEXT NOT NULL,
search_library_name TEXT,
library_ver TEXT NOT NULL,
search_library_ver TEXT,
security_advisories TEXT,
search_url TEXT,
check_last_date TEXT);'''
libraries_connect.db_execute(create_library_sql)
libraries_connect.db_commit()
libraries_connect.db_close()
# 「library_tag」テーブルの確認:ない場合→作成
if not ("library_tag" in table_list):
tag_connect = ObjectRelationalMapping(db_path)
create_library_tag_sql = '''CREATE TABLE library_tag(
id TEXT PRIMARY KEY,
environments_name TEXT,
library_id TEXT,
create_date TEXT NOT NULL,
foreign key(environments_name) references environments(name),
foreign key(library_id) references libraries(id));'''
tag_connect.db_execute(create_library_tag_sql)
tag_connect.db_commit()
tag_connect.db_close()
def txt_read(requirements_path):
data = []
with open(requirements_path, 'rb') as bf: # バイナリーで読み込み
binary_data = bf.read()
encode_data = detect(binary_data)
with open(requirements_path, mode='r', encoding=encode_data['encoding']) as f:
for line in f.readlines():
library_id = ulid.ulid()
data_tuple = (library_id, line.split('==')[0], line.split('==')[1].replace('\n', ""))
data.append(data_tuple)
return data
# データ挿入:ライブラリ
def insert_library(db_path: str, data: list):
connect = ObjectRelationalMapping(db_path)
sql = '''INSERT INTO libraries(id, library_name, library_ver) VALUES(?, ?, ?);'''
connect.db_execute_many(sql, data)
connect.db_commit()
connect.db_close()
# 引数確認
def argument_check():
# requirementsファイルの確認
try:
requirements_path = sys.argv[1]
except IndexError:
print("引数が正しく指定されてません")
exit()
else:
if not os.path.exists(requirements_path):
print("Pythonパッケージリストのファイルが確認できませんでした")
exit()
# 仮想環境名の確認
try:
venv_name = sys.argv[2]
except IndexError:
print("仮想環境名が確認できませんでした")
exit()
return requirements_path, venv_name
def main():
requirements_path, venv_name = argument_check()
json_data = path_get()
db_path = json_data["db_path"]
if db_path == "":
db_path = "library.sqlite"
# テーブルの有無確認
tabel_check(db_path)
# requirements.txt読み込み
library_data = txt_read(requirements_path)
# ライブラリデータインポート(SQL実行)
insert_library(db_path, library_data)
if __name__ == '__main__':
main()