dotfiles/bin/vil

183 lines
5.6 KiB
Text
Raw Permalink Normal View History

2025-04-27 21:57:27 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# List System
# Copyright (C) 2011 Øyvind Jensen
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import cmd
import shelve
import os
class CLI(cmd.Cmd):
header = 'Virtual Inventory Logger'
prompt = '> '
storage = None
snd = None
filename = 'registry'
unablemsg = 'Unable to complete operation'
def complete_most(self, text, line):
col = []
for key in self.storage.keys():
col.append(key)
for item in self.storage[key]:
col.append(item)
if text:
return [
key for key in col
if key.startswith(text)
]
else:
return col
def log(self, line):
os.system('journal ' + line)
def do_place(self, op):
'USAGE: place <name> <location>'
thinglocation = op.split()
thinglocation = self.strip(thinglocation)
if len(thinglocation) == 2:
location = thinglocation[1]
name = thinglocation[0]
try:
self.storage[location]
except KeyError:
self.storage[location] = []
self.storage[location].append(name)
response = name + ' placed in ' + location
self.log(response)
else:
print(self.unablemsg)
def complete_place(self, text, line, start_index, end_index):
return self.complete_most(text, line)
def do_search(self, phrase):
'USAGE: search <name>'
found = False
if len(phrase) > 0:
for location in self.storage:
for item in self.storage[location]:
if phrase in item or item in phrase:
print(item + ' is located in ' + location)
found = True
if not found:
print(phrase + ' is nowhere to be found')
print('Please get one and put it somewhere')
else:
print(self.unablemsg)
def do_remove(self, op):
'USAGE: remove <name> <location>'
thinglocation = op.split()
thinglocation = self.strip(thinglocation)
if len(thinglocation) == 2:
location = thinglocation[1]
name = thinglocation[0]
try:
self.storage[location].remove(name)
if len(self.storage[location]) == 0:
self.storage.pop(location)
response = name + ' removed from ' + location
self.log(response)
except:
print(name + ' not found in ' + location)
else:
print(self.unablemsg)
def complete_remove(self, text, line, start_index, end_index):
return self.complete_most(text, line)
def do_move(self, op):
'USAGE: move <name> <from location> <to location>'
moveop = op.split()
moveop = self.strip(moveop)
if len(moveop) == 3:
name = moveop[0]
fromloc = moveop[1]
toloc = moveop[2]
self.do_remove(name + ' ' + fromloc)
self.do_place(name + ' ' + toloc)
#print(name + ' moved from ' + fromloc + ' to ' + toloc)
else:
print(self.unablemsg)
def complete_move(self, text, line, start_index, end_index):
return self.complete_most(text, line)
def do_list(self, location):
'USAGE: list <location>'
if len(location) > 0:
self.list_location(location)
else:
for onelocation in self.storage:
self.list_location(onelocation)
def complete_list(self, text, line, start_index, end_index):
return self.complete_most(text, line)
def do_journal(self, line):
'USAGE: journal <journal entry>'
os.system('journal ' + line)
def strip(self, tostrip):
words = ['in', 'from', 'inside', 'into']
for word in words:
if word in tostrip:
tostrip.remove(word)
return tostrip
def list_location(self, location):
print(location)
try:
if self.storage[location] is not None:
for item in self.storage[location]:
print('\t' + item)
except KeyError:
print('There is no place like ' + location)
def do_copyright(self, line):
print("Copyright (C) 2011- Øyvind Jensen")
def do_credits(self, line):
print("Author:")
print("Øyvind Jensen")
print("oyvind.jensen@protonmail.com")
def do_exit(self, line):
print('Be well..')
return True
def __init__(self):
cmd.Cmd.__init__(self)
self.storage = shelve.open(self.filename, writeback = True)
def do_EOF(self, line):
print()
return self.do_exit('')
def complete(self, text, state):
"""Add a whitespace after word completion"""
return cmd.Cmd.complete(self, text, state) + ' '
if __name__ == "__main__":
CLI().cmdloop()