Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
108
Task/Simple-database/Python/simple-database.py
Normal file
108
Task/Simple-database/Python/simple-database.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
'''\
|
||||
Simple database for: http://rosettacode.org/wiki/Simple_database
|
||||
|
||||
'''
|
||||
|
||||
import argparse
|
||||
from argparse import Namespace
|
||||
import datetime
|
||||
import shlex
|
||||
|
||||
|
||||
def parse_args():
|
||||
'Set up, parse, and return arguments'
|
||||
|
||||
parser = argparse.ArgumentParser(epilog=globals()['__doc__'])
|
||||
|
||||
parser.add_argument('command', choices='add pl plc pa'.split(),
|
||||
help='''\
|
||||
add: Add a new entry
|
||||
pl: Print the latest entry
|
||||
plc: Print the latest entry for each category/tag
|
||||
pa: Print all entries sorted by a date''')
|
||||
parser.add_argument('-d', '--description',
|
||||
help='A description of the item. (e.g., title, name)')
|
||||
parser.add_argument('-t', '--tag',
|
||||
help=('''A category or tag (genre, topic, relationship '''
|
||||
'''such as “friend” or “family”)'''))
|
||||
parser.add_argument('-f', '--field', nargs=2, action='append',
|
||||
help='Other optional fields with value (can be repeated)')
|
||||
|
||||
return parser
|
||||
|
||||
def do_add(args, dbname):
|
||||
'Add a new entry'
|
||||
if args.description is None:
|
||||
args.description = ''
|
||||
if args.tag is None:
|
||||
args.tag = ''
|
||||
del args.command
|
||||
print('Writing record to %s' % dbname)
|
||||
with open(dbname, 'a') as db:
|
||||
db.write('%r\n' % args)
|
||||
|
||||
def do_pl(args, dbname):
|
||||
'Print the latest entry'
|
||||
print('Getting last record from %s' % dbname)
|
||||
with open(dbname, 'r') as db:
|
||||
for line in db: pass
|
||||
record = eval(line)
|
||||
del record._date
|
||||
print(str(record))
|
||||
|
||||
def do_plc(args, dbname):
|
||||
'Print the latest entry for each category/tag'
|
||||
print('Getting latest record for each tag from %s' % dbname)
|
||||
with open(dbname, 'r') as db:
|
||||
records = [eval(line) for line in db]
|
||||
tags = set(record.tag for record in records)
|
||||
records.reverse()
|
||||
for record in records:
|
||||
if record.tag in tags:
|
||||
del record._date
|
||||
print(str(record))
|
||||
tags.discard(record.tag)
|
||||
if not tags: break
|
||||
|
||||
def do_pa(args, dbname):
|
||||
'Print all entries sorted by a date'
|
||||
print('Getting all records by date from %s' % dbname)
|
||||
with open(dbname, 'r') as db:
|
||||
records = [eval(line) for line in db]
|
||||
for record in records:
|
||||
del record._date
|
||||
print(str(record))
|
||||
|
||||
def test():
|
||||
import time
|
||||
parser = parse_args()
|
||||
for cmdline in [
|
||||
"""-d Book -f title 'Windy places' -f type hardback --tag DISCOUNT add""",
|
||||
"""-d Book -f title 'RC spammers' -f type paperback -t DISCOUNT add""",
|
||||
"""-d Book -f title 'Splat it' -f type hardback -f special 'first edition' -t PREMIUM add""",
|
||||
"""pl""",
|
||||
"""plc""",
|
||||
]:
|
||||
args = parser.parse_args(shlex.split(cmdline))
|
||||
now = datetime.datetime.utcnow()
|
||||
args._date = now.isoformat()
|
||||
do_command[args.command](args, dbname)
|
||||
time.sleep(0.5)
|
||||
|
||||
|
||||
|
||||
do_command = dict(add=do_add, pl=do_pl, plc=do_plc, pa=do_pa)
|
||||
dbname = '_simple_db_db.py'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if 0:
|
||||
test()
|
||||
else:
|
||||
parser = parse_args()
|
||||
args = parser.parse_args()
|
||||
now = datetime.datetime.utcnow()
|
||||
args._date = now.isoformat()
|
||||
do_command[args.command](args, dbname)
|
||||
Loading…
Add table
Add a link
Reference in a new issue