INFO1112 A1 - Just a friendly reminder
In this assignment, you'll be creating a basic application called "Jafr" (short for "Just a
friendly reminder"). This application helps multiple users manage their tasks and meetings
on a Unix-like OS (a popular choice of OS in industry where developers might share a
computer system or host web applications).
Jafr is Unix-friendly. This means that
1. Users interact with Jafr by typing commands in a command-line interface.
2. Jafr assumes that all the tasks and meetings are stored in text files that are otherwise
managed by users of the shared system. Users simply edit these files themselves when
they want to make changes outside of Jafr.
You will implement Jafr in Python and write a simple start up script in Bash. You will then
write I/O end to end tests for Jafr.
These specifications first describe each behaviour of Jafr. The final sections describe error
handling, how to write tests for Jafr and provide some hints.
Overview
Jafr is designed to run whenever a user opens their terminal at the beginning of their day.
Users can choose to view reminders that are relevant to the current day, or make changes.
Changes can include sharing reminders with other users.
There are two kinds of reminders: tasks and meetings.
Note
Students and tutors often have great suggestions to specifications. While no major
changes will be made after release, this assignment specification may be clarified up to
Week 4, 27/08/2023. Revised versions will be clearly marked and accompanying
announcements made to Edstem.
Setup
Jafr primarily relies on two text files for each user: tasks.md and meetings.md . These text
files are placed inside a master directory of the user's choosing.
The user chooses their master directory inside a JSON file called user-settings.json
located at ~/.jafr/user-settings.json . You may consider ~/.jafr/ a 'hidden' directory,
for Jafr's internal use only.
user-settings.json has a single key value pair storing the absolute path to the master
directory.
Sample user-settings.json :
Hint
Notice that the hidden directory .jafr/ is inside a user's home directory which can be
symbolically referred to by ~
.
You can fetch the path referred to by ~ in Python by using os.path.expanduser('~')
{
"master": "/home/dailystuff"
}
Help! What's a JSON file?
JSON is a universal file format for easy data reading and writing. There are two kinds of
data structures possible to write in JSON: objects and arrays.
Curly braces are used to define an object: a collection of name/value pairs (exactly like
a dictionary in Python). Square brackets are used to define an array: an ordered list of
values (exactly like a list in Python).
You may use Python's json library in your implementation to read JSON files. See
json.load()
Note
tasks.md and meetings.md for each user are given inside your scaffold. Assume the
user creates these themselves using their preferred text editor.
The ~/.jafr/ directory for each user is also given inside your scaffold. You do not
have to handle the case where ~/.jafr/user-settings.json is missing for any user.
Assume Jafr has some installation script that handles this, outside of the scope of your
assignment.
Text files containing reminders
The two text files inside the master directory for each user are as follows.
tasks.md
This text file contains dot pointed tasks with the following format. Dates follow DD/MM/YY, or
more precisely the C standard format %d/%m/%y (see the datetime docs). You will only ever
have to handle dates in the years 1969 - 2068 (inclusive).
For example
meetings.md
This text file contains dot pointed meetings with the following format. Times follow HH:mm,
or more precisely the C standard format %H:%M (see the datetime docs).
For example
- Due:
- Complete INFO1112 A1 Due: 01/10/23 not complete
- Acquire Twitter Due: 30/10/23 complete
- Study linux namespaces Due: 30/09/23 not complete
Hint
Notice that a task must end with complete or not complete !
Moreover, the format implies that a task description should never contain the string
Due: . You do not have to handle the case where a user does this.
- Scheduled:
- Michael Mai's welcome party Scheduled: 18:00 25/08/23
- A1 marking meeting Scheduled: 09:00 01/09/23
Hint
You do not have to handle the case where a user places Scheduled: inside the
meeting description.
Further, as suggested by the links above, it will be easiest to use datetime to handle
all dates/times!
Usage
Jafr runs when jafr.py is executed by the Python interpreter. There is one command line
argument which will contain a path (absolute or relative) to a given passwd file. More on this
below.
For example
Jafr first displays relevant reminders (tasks followed by meetings), before showing a menu.
The menu contains the following.
A user chooses one option only.
This invokes the relevant behaviour, described below. If the user enters 6 , Jafr exits. After
completing a behaviour, Jafr returns to the menu.
For example
python3 jafr.py passwd
What would you like to do?
1. Complete tasks
2. Add a new meeting.
3. Share a task.
4. Share a meeting.
5. Change Jafr's master directory.
6. Exit