Merge branch 'prefixed'

main
m455 2018-10-10 15:05:54 -04:00
commit b7519faa03
10 changed files with 421 additions and 436 deletions

1
README.md 100755 → 100644
View File

@ -87,3 +87,4 @@ rm - `rodo rm 1`
## Configuring rodo ## Configuring rodo
Right now, the configurations can be found in the config.rkt file. Settings such at program name, path and directory can be set here. Right now, the configurations can be found in the config.rkt file. Settings such at program name, path and directory can be set here.

View File

@ -1,47 +1,48 @@
#lang racket/base #lang racket/base
(require racket/vector (require (prefix-in vector: racket/vector)
racket/list (prefix-in list: racket/list)
"config.rkt" (prefix-in config: "config.rkt")
"init.rkt" (prefix-in init: "init.rkt")
"util.rkt" (prefix-in util: "util.rkt")
"messages.rkt") (prefix-in messages: "messages.rkt"))
(provide (all-defined-out)) (provide (all-defined-out))
(define (check-args args) (define (check-args args)
(let (let([args-length (vector-length args)])
([args-length (vector-length args)]) (cond [(equal? args-length 0)
(cond (util:display-hash-ref messages:messages 'show-usage)]
[(equal? args-length 0)
(d-hash-ref messages 'show-usage)]
[(and [(and
(equal? args-length 1) (equal? args-length 1)
(equal? (vector-member list-command args) 0)) (equal? (vector:vector-member config:list-command args) 0))
(show-list)] (util:show-list)]
[(and [(and
(equal? args-length 2) (equal? args-length 2)
(equal? (vector-ref args 0) add-command)) (equal? (vector-ref args 0) config:add-command))
(add-item args)] (util:add-item args)]
[(and [(and
(equal? args-length 2) (equal? args-length 2)
(equal? (vector-member remove-command args) 0) (equal? (vector:vector-member config:remove-command args) 0)
(not (equal? (vector-member "0" args) 1)) (not (equal? (vector:vector-member "0" args) 1))
(vector-member (vector-ref args 1) (list->vector (map number->string (rest (range (length (file->string-list path)))))))) (vector:vector-member
(remove-item args)] (vector-ref args 1)
(list->vector
(map number->string (list:rest (list:range (length (util:file->string-list config:path))))))))
(util:remove-item args)]
[(and [(and
(equal? args-length 1) (equal? args-length 1)
(equal? (vector-member initialize-command args) 0)) (equal? (vector:vector-member config:initialize-command args) 0))
(initialize)] (init:initialize)]
[(and [(and
(equal? args-length 1) (equal? args-length 1)
(member (vector-ref args 0) help-command)) (member (vector-ref args 0) config:help-command))
(d-hash-ref messages 'show-help)] (util:display-hash-ref messages:messages 'show-help)]
[else [else
(d-hash-ref messages 'show-usage)]))) (util:display-hash-ref messages:messages 'show-usage)])))

View File

@ -1,5 +1,4 @@
#lang racket/base #lang racket/base
(require racket/file)
(provide (all-defined-out)) (provide (all-defined-out))
(define program-name "rodo") (define program-name "rodo")

View File

@ -1,47 +1,45 @@
#lang racket/base #lang racket/base
(require racket/file (require (prefix-in file: racket/file)
"config.rkt" (prefix-in config: "config.rkt")
"util.rkt" (prefix-in util: "util.rkt")
"messages.rkt" (prefix-in messages: "messages.rkt"))
"io.rkt")
(provide (all-defined-out)) (provide (all-defined-out))
(define (initialize-file) (define (initialize-file)
(display-to-file (file:display-to-file
"--Do not edit this file--\n" "--Do not edit this file--\n"
path config:path
#:mode 'text #:mode 'text
#:exists 'replace)) #:exists 'replace))
(define (init-prompt hash-list key) (define (init-prompt hash-list key)
(d-hash-ref hash-list key) (util:display-hash-ref hash-list key)
(display "> ") (display "> ")
(let (let
([user-input (read-line)]) ([user-input (read-line)])
(cond (cond
[(member user-input (hash-ref y/n 'yes)) [(member user-input (hash-ref messages:y/n 'yes))
(d-hash-ref messages 'creating-folder) (util:display-hash-ref messages:messages 'creating-folder)
(d-hash-ref messages 'creating-file) (util:display-hash-ref messages:messages 'creating-file)
(create-folder) (util:create-folder)
(create-file) (util:create-file)
(initialize-file) (initialize-file)
(if (if (and
(and (util:check-for-folder)
(check-for-folder) (util:check-for-file))
(check-for-file)) (util:display-hash-ref messages:messages 'successfully-created)
(d-hash-ref messages 'successfully-created) (util:display-hash-ref messages:messages 'creation-error))]
(d-hash-ref messages 'creation-error))]
[(member user-input (hash-ref y/n 'no)) [(member user-input (hash-ref messages:y/n 'no))
(d-hash-ref messages 'terminating)] (util:display-hash-ref messages:messages 'terminating)]
[else [else
(init-prompt messages 'choose-y/n)]))) (init-prompt messages:messages 'choose-y/n)])))
(define (initialize) (define (initialize)
(if (check-for-file) (if (util:check-for-file)
(d-hash-ref messages 'file-already-exists) (util:display-hash-ref messages:messages 'file-already-exists)
(begin (begin
(init-prompt messages 'init-y/n)))) (init-prompt messages:messages 'init-y/n))))

32
io.rkt
View File

@ -1,32 +0,0 @@
#lang racket/base
(require racket/file
"config.rkt")
(provide (all-defined-out))
(define (check-for-file)
(file-exists? path))
(define (create-file)
(let
([opened-file
(open-output-file
path
#:mode 'text
#:exists 'can-update)])
(close-output-port opened-file)))
(define (check-for-folder)
(directory-exists?
(expand-user-path
(string-append
program-path
program-directory))))
(define (create-folder)
(make-directory
(expand-user-path
(string-append
program-path
program-directory))))

View File

@ -1,145 +1,145 @@
#lang racket/base #lang racket/base
(require "config.rkt") (require (prefix-in config: "config.rkt"))
(provide (all-defined-out)) (provide (all-defined-out))
(define messages (define messages
(hash (hash
'show-help 'show-help
(string-append (string-append
"* " initialize-command ": " config:initialize-command ":\n"
"initialize a file in " "initialize a file in "
program-path config:program-path
program-directory config:program-directory
program-file config:program-file
"\n" "\n"
"\x09Example: " "Example: "
"rodo init\n\n" "rodo init\n\n"
"* " list-command ": " config:list-command ":\n"
"lists items on the list" "lists items on the list"
"\n" "\n"
"\x09Example: " "Example: "
"rodo ls\n\n" "rodo ls\n\n"
"* " add-command ": " config:add-command ":\n"
"adds an item to the list" "adds an item to the list"
"\n" "\n"
"\x09Example: " "Example: "
"rodo add bread\n\n" "rodo add bread\n\n"
"\x09Note: For multi-word items you will need to\n" "Note: For multi-word items you will need to\n"
"\x09surround your item in double quotes as so:\n" "surround your item in double quotes as so:\n"
"\x09rodo add \"go to the bank\"\n" "rodo add \"go to the bank\"\n\n"
"* " remove-command ": " config:remove-command ":\n"
"removes an item from the list\n" "removes an item from the list\n"
"\x09Example: " "Example: "
"rodo rm 1\n" "rodo rm 1\n\n"
"\x09Note: You may have to run `rodo ls` to see which\n" "Note: You may have to run `rodo ls` to see which\n"
"\x09number corresponds to which item to remove it.\n") "number corresponds to which item to remove it.\n")
'empty-todo-list 'empty-todo-list
"> There is nothing in your list \n" "> There is nothing in your list \n"
'show-usage 'show-usage
(string-append (string-append
"> For usage type " "> For usage type "
"`" program-name " -h`" "`" config:program-name " -h`"
" or " " or "
"`" program-name " --help`\n") "`" config:program-name " --help`\n")
'creating-folder 'creating-folder
(string-append (string-append
"> creating a " "> creating a "
program-directory config:program-directory
" folder in " " folder in "
program-path " ...\n") config:program-path " ...\n")
'creating-file 'creating-file
(string-append (string-append
"> creating a " "> creating a "
program-file config:program-file
" file in " " file in "
program-path config:program-path
program-directory " ...\n") config:program-directory " ...\n")
'creation-error 'creation-error
(string-append (string-append
"> Error: Could not create " "> Error: Could not create "
program-file config:program-file
" in " " in "
program-directory config:program-directory
program-path ".\n" config:program-path ".\n"
"> This may be due to directory permissions\n") "> This may be due to directory permissions\n")
'file-already-exists 'file-already-exists
(string-append (string-append
"> Error: " "> Error: "
program-name config:program-name
" already exists in " " already exists in "
program-path config:program-path
program-directory config:program-directory
program-file "\n") config:program-file "\n")
'successfully-created 'successfully-created
(string-append (string-append
"> " "> "
program-path config:program-path
program-directory config:program-directory
program-file config:program-file
" has been successfully created\n") " has been successfully created\n")
'file-not-found 'file-not-found
(string-append (string-append
"> Error: Could not find " "> Error: Could not find "
program-path config:program-path
program-directory config:program-directory
program-file "\n") config:program-file "\n")
'init-y/n 'init-y/n
(string-append (string-append
"> A " "> A "
program-file config:program-file
" file will be created in " " file will be created in "
program-path config:program-path
program-directory "\n" config:program-directory "\n"
"> Are you sure you want to continue? [y/n]\n") "> Are you sure you want to continue? [y/n]\n")
'try-init 'try-init
(string-append (string-append
"> Try typing " "> Try typing "
"`" program-name " init` " "`" config:program-name " init` "
"to set it up\n") "to set it up\n")
'terminating 'terminating
(string-append (string-append
"> Exiting " "> Exiting "
program-name config:program-name
" ...\n") " ...\n")
'choose-y/n 'choose-y/n
"> Error: Please choose y or n\n" "> Error: Please choose y or n\n"
'not-in-list 'not-in-list
"> Error: Item does not exist\n" "> Error: Item does not exist\n"
'item-added-prefix 'item-added-prefix
"> Added " "> Added "
'item-added-suffix 'item-added-suffix
" to list\n" " to list\n"
'item-removed-prefix 'item-removed-prefix
"> Removed " "> Removed "
'item-removed-suffix 'item-removed-suffix
" from list\n")) " from list\n"))
(define y/n (define y/n
(hash (hash
'yes 'yes
'("yes" "Yes" "y" "Y") '("yes" "Yes" "y" "Y")
'no 'no
'("no" "No" "n" "N"))) '("no" "No" "n" "N")))

BIN
rodo

Binary file not shown.

View File

@ -1,9 +1,9 @@
#! /usr/bin/env racket #! /usr/bin/env racket
#lang racket/base #lang racket/base
(require "args.rkt") (require (prefix-in args: "args.rkt"))
(define (main) (define (main)
(check-args (current-command-line-arguments))) (args:check-args (current-command-line-arguments)))
(main) (main)

182
util.rkt
View File

@ -1,116 +1,134 @@
#lang racket/base #lang racket/base
(require racket/list (require (prefix-in list: racket/list)
racket/file (prefix-in file: racket/file)
racket/string (prefix-in string: racket/string)
"config.rkt" (prefix-in config: "config.rkt")
"io.rkt" (prefix-in messages: "messages.rkt"))
"messages.rkt")
(provide (all-defined-out)) (provide (all-defined-out))
(define (d-hash-ref hash-list key) (define (check-for-file)
(file-exists? config:path))
(define (create-file)
(let ([opened-file
(open-output-file config:path
#:mode 'text
#:exists 'can-update)])
(close-output-port opened-file)))
(define (check-for-folder)
(directory-exists? (expand-user-path
(string-append
config:program-path
config:program-directory))))
(define (create-folder)
(make-directory (expand-user-path
(string-append
config:program-path
config:program-directory))))
(define (display-hash-ref hash-list key)
(display (hash-ref hash-list key))) (display (hash-ref hash-list key)))
(define (d-vector-ref args key) (define (d-vector-ref args key)
(display (vector-ref args key))) (display (vector-ref args key)))
(define (file->string-list path-to-file) (define (file->string-list config:path-to-file)
(let (let ([todo-list (file:file->lines config:path-to-file
([todo-list #:mode 'text
(file->lines #:line-mode 'any)])
path-to-file
#:mode 'text
#:line-mode 'any)])
todo-list)) todo-list))
(define (list-empty? lst) (define (list-empty? lst)
(empty? (rest (file->string-list lst)))) (list:empty? (list:rest (file->string-list lst))))
(define (get-removed-item lst args) (define (get-removed-item lst args)
(list-ref lst (string->number args))) (list-ref lst (string->number args)))
(define (quote-item args) (define (quote-item args)
(display (display
(string-append "\"" args "\""))) (string-append "\"" args "\"")))
(define (number-list lst) (define (prefix-with-number lst)
(map string-append (map string-append
(map number->string (rest (range (length lst)))) (map number->string (list:rest (list:range (length lst))))
(rest lst))) (list:rest lst)))
(define (indent-list lst) (define (prefix-with-period lst)
(string-append ". " lst)) (string-append ". " lst))
(define (prettify-list) (define (prettify-list)
(display (display
(string-join (string:string-join (prefix-with-number (map prefix-with-period (file->string-list config:path)))
(number-list (map indent-list (file->string-list path))) "\n"
"\n" #:after-last "\n")))
#:after-last "\n")))
(define (append-to-end args lst)
(reverse (cons args (reverse (file->string-list lst)))))
(define (display-item-added args)
(display-hash-ref messages:messages 'item-added-prefix)
(quote-item args)
(display-hash-ref messages:messages 'item-added-suffix))
(define (display-item-removed args)
(display-hash-ref messages:messages 'item-removed-prefix)
(quote-item args)
(display-hash-ref messages:messages 'item-removed-suffix))
(define (show-list) (define (show-list)
(cond (cond [(and
[(and (check-for-folder)
(check-for-folder) (check-for-file))
(check-for-file)) (if
(if (list-empty? config:path)
(list-empty? path) (display-hash-ref messages:messages 'empty-todo-list)
(d-hash-ref messages 'empty-todo-list) (prettify-list))]
(prettify-list))] [else
[else (display-hash-ref messages:messages 'file-not-found)
(d-hash-ref messages 'file-not-found) (display-hash-ref messages:messages 'try-init)]))
(d-hash-ref messages 'try-init)]))
(define (add-item-to-file args) (define (add-item-to-file args)
(let ([new-list (let ([new-list (append-to-end args config:path)])
(reverse (file:display-to-file
(cons args (string:string-join new-list "\n" #:after-last "\n")
(reverse (file->string-list path))))]) config:path
(display-to-file #:mode 'text
(string-join new-list "\n" #:after-last "\n") #:exists 'replace)
path (display-item-added args)))
#:mode 'text
#:exists 'replace)
(d-hash-ref messages 'item-added-prefix)
(quote-item args)
(d-hash-ref messages 'item-added-suffix)))
(define (add-item args) (define (add-item args)
(if (if (and
(and
(check-for-folder)
(check-for-file))
(add-item-to-file (vector-ref args 1))
(begin
(d-hash-ref messages 'file-not-found)
(d-hash-ref messages 'try-init))))
(define (remove-item-from-file args)
(let ([removed-item
(get-removed-item (file->string-list path) args)]
[new-list
(remove
(list-ref (file->string-list path) (string->number args))
(file->string-list path))])
(display-to-file
(string-join new-list "\n" #:after-last "\n")
path
#:mode 'text
#:exists 'replace)
(d-hash-ref messages 'item-removed-prefix)
(quote-item removed-item)
(d-hash-ref messages 'item-removed-suffix)))
(define (remove-item args)
(cond
[(list-empty? path)
(d-hash-ref messages 'empty-todo-list)]
[(and
(check-for-folder) (check-for-folder)
(check-for-file)) (check-for-file))
(remove-item-from-file (vector-ref args 1))] (add-item-to-file (vector-ref args 1))
[(and (not (check-for-folder)) (not (check-for-file))) (begin
(begin (display-hash-ref messages:messages 'file-not-found)
(d-hash-ref messages 'file-not-found) (display-hash-ref messages:messages 'try-init))))
(d-hash-ref messages 'try-init))]))
(define (remove-item-from-file args)
(let ([removed-item (get-removed-item (file->string-list config:path) args)]
[new-list (remove
(list-ref (file->string-list config:path) (string->number args))
(file->string-list config:path))])
(file:display-to-file
(string:string-join new-list "\n" #:after-last "\n")
config:path
#:mode 'text
#:exists 'replace)
(display-item-removed removed-item)))
(define (remove-item args)
(cond [(list-empty? config:path)
(display-hash-ref messages:messages 'empty-todo-list)]
[(and
(check-for-folder)
(check-for-file))
(remove-item-from-file (vector-ref args 1))]
[(and (not (check-for-folder)) (not (check-for-file)))
(begin
(display-hash-ref messages:messages 'file-not-found)
(display-hash-ref messages:messages 'try-init))]))