Merge branch 'prefixed'

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

42
LICENSE
View File

@ -1,21 +1,21 @@
MIT License MIT License
Copyright (c) 2018 m455 Copyright (c) 2018 m455
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

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
(equal? args-length 1)
[(and (equal? (vector:vector-member config:list-command args) 0))
(equal? args-length 1) (util:show-list)]
(equal? (vector-member list-command args) 0))
(show-list)] [(and
(equal? args-length 2)
[(and (equal? (vector-ref args 0) config:add-command))
(equal? args-length 2) (util:add-item args)]
(equal? (vector-ref args 0) add-command))
(add-item args)] [(and
(equal? args-length 2)
[(and (equal? (vector:vector-member config:remove-command args) 0)
(equal? args-length 2) (not (equal? (vector:vector-member "0" args) 1))
(equal? (vector-member remove-command args) 0) (vector:vector-member
(not (equal? (vector-member "0" args) 1)) (vector-ref args 1)
(vector-member (vector-ref args 1) (list->vector (map number->string (rest (range (length (file->string-list path)))))))) (list->vector
(remove-item args)] (map number->string (list:rest (list:range (length (util:file->string-list config:path))))))))
(util:remove-item args)]
[(and
(equal? args-length 1) [(and
(equal? (vector-member initialize-command args) 0)) (equal? args-length 1)
(initialize)] (equal? (vector:vector-member config:initialize-command args) 0))
(init:initialize)]
[(and
(equal? args-length 1) [(and
(member (vector-ref args 0) help-command)) (equal? args-length 1)
(d-hash-ref messages 'show-help)] (member (vector-ref args 0) config:help-command))
(util:display-hash-ref messages:messages 'show-help)]
[else
(d-hash-ref messages 'show-usage)]))) [else
(util:display-hash-ref messages:messages 'show-usage)])))

View File

@ -1,19 +1,18 @@
#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") (define program-directory ".rodo/")
(define program-directory ".rodo/") (define program-path "~/")
(define program-path "~/") (define program-file "todo-list")
(define program-file "todo-list") (define remove-command "rm")
(define remove-command "rm") (define add-command "add")
(define add-command "add") (define list-command "ls")
(define list-command "ls") (define initialize-command "init")
(define initialize-command "init") (define help-command '("-h" "--help"))
(define help-command '("-h" "--help")) (define path
(define path (expand-user-path
(expand-user-path (string-append
(string-append program-path
program-path program-directory
program-directory program-file)))
program-file)))

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) (file:display-to-file
(display-to-file "--Do not edit this file--\n"
"--Do not edit this file--\n" config:path
path #:mode 'text
#:mode 'text #:exists 'replace))
#:exists 'replace))
(define (init-prompt hash-list key)
(define (init-prompt hash-list key) (util:display-hash-ref hash-list key)
(d-hash-ref hash-list key) (display "> ")
(display "> ") (let
(let ([user-input (read-line)])
([user-input (read-line)]) (cond
(cond [(member user-input (hash-ref messages:y/n 'yes))
[(member user-input (hash-ref y/n 'yes)) (util:display-hash-ref messages:messages 'creating-folder)
(d-hash-ref messages 'creating-folder) (util:display-hash-ref messages:messages 'creating-file)
(d-hash-ref messages 'creating-file) (util:create-folder)
(create-folder) (util:create-file)
(create-file) (initialize-file)
(initialize-file) (if (and
(if (util:check-for-folder)
(and (util:check-for-file))
(check-for-folder) (util:display-hash-ref messages:messages 'successfully-created)
(check-for-file)) (util:display-hash-ref messages:messages 'creation-error))]
(d-hash-ref messages 'successfully-created)
(d-hash-ref messages 'creation-error))] [(member user-input (hash-ref messages:y/n 'no))
(util:display-hash-ref messages:messages 'terminating)]
[(member user-input (hash-ref y/n 'no))
(d-hash-ref messages 'terminating)] [else
(init-prompt messages:messages 'choose-y/n)])))
[else
(init-prompt messages 'choose-y/n)]))) (define (initialize)
(if (util:check-for-file)
(define (initialize) (util:display-hash-ref messages:messages 'file-already-exists)
(if (check-for-file) (begin
(d-hash-ref messages 'file-already-exists) (init-prompt messages:messages 'init-y/n))))
(begin
(init-prompt 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)

250
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 (check-for-file)
(define (d-hash-ref hash-list key) (file-exists? config:path))
(display (hash-ref hash-list key)))
(define (create-file)
(define (d-vector-ref args key) (let ([opened-file
(display (vector-ref args key))) (open-output-file config:path
#:mode 'text
(define (file->string-list path-to-file) #:exists 'can-update)])
(let (close-output-port opened-file)))
([todo-list
(file->lines (define (check-for-folder)
path-to-file (directory-exists? (expand-user-path
#:mode 'text (string-append
#:line-mode 'any)]) config:program-path
todo-list)) config:program-directory))))
(define (list-empty? lst) (define (create-folder)
(empty? (rest (file->string-list lst)))) (make-directory (expand-user-path
(string-append
(define (get-removed-item lst args) config:program-path
(list-ref lst (string->number args))) config:program-directory))))
(define (quote-item args) (define (display-hash-ref hash-list key)
(display (display (hash-ref hash-list key)))
(string-append "\"" args "\"")))
(define (d-vector-ref args key)
(define (number-list lst) (display (vector-ref args key)))
(map string-append
(map number->string (rest (range (length lst)))) (define (file->string-list config:path-to-file)
(rest lst))) (let ([todo-list (file:file->lines config:path-to-file
#:mode 'text
(define (indent-list lst) #:line-mode 'any)])
(string-append ". " lst)) todo-list))
(define (prettify-list) (define (list-empty? lst)
(display (list:empty? (list:rest (file->string-list lst))))
(string-join
(number-list (map indent-list (file->string-list path))) (define (get-removed-item lst args)
"\n" (list-ref lst (string->number args)))
#:after-last "\n")))
(define (quote-item args)
(define (show-list) (display
(cond (string-append "\"" args "\"")))
[(and
(check-for-folder) (define (prefix-with-number lst)
(check-for-file)) (map string-append
(if (map number->string (list:rest (list:range (length lst))))
(list-empty? path) (list:rest lst)))
(d-hash-ref messages 'empty-todo-list)
(prettify-list))] (define (prefix-with-period lst)
[else (string-append ". " lst))
(d-hash-ref messages 'file-not-found)
(d-hash-ref messages 'try-init)])) (define (prettify-list)
(display
(define (add-item-to-file args) (string:string-join (prefix-with-number (map prefix-with-period (file->string-list config:path)))
(let ([new-list "\n"
(reverse #:after-last "\n")))
(cons args
(reverse (file->string-list path))))]) (define (append-to-end args lst)
(display-to-file (reverse (cons args (reverse (file->string-list lst)))))
(string-join new-list "\n" #:after-last "\n")
path (define (display-item-added args)
#:mode 'text (display-hash-ref messages:messages 'item-added-prefix)
#:exists 'replace) (quote-item args)
(d-hash-ref messages 'item-added-prefix) (display-hash-ref messages:messages 'item-added-suffix))
(quote-item args)
(d-hash-ref messages 'item-added-suffix))) (define (display-item-removed args)
(display-hash-ref messages:messages 'item-removed-prefix)
(define (add-item args) (quote-item args)
(if (display-hash-ref messages:messages 'item-removed-suffix))
(and
(check-for-folder) (define (show-list)
(check-for-file)) (cond [(and
(add-item-to-file (vector-ref args 1)) (check-for-folder)
(begin (check-for-file))
(d-hash-ref messages 'file-not-found) (if
(d-hash-ref messages 'try-init)))) (list-empty? config:path)
(display-hash-ref messages:messages 'empty-todo-list)
(define (remove-item-from-file args) (prettify-list))]
(let ([removed-item [else
(get-removed-item (file->string-list path) args)] (display-hash-ref messages:messages 'file-not-found)
[new-list (display-hash-ref messages:messages 'try-init)]))
(remove
(list-ref (file->string-list path) (string->number args)) (define (add-item-to-file args)
(file->string-list path))]) (let ([new-list (append-to-end args config:path)])
(display-to-file (file:display-to-file
(string-join new-list "\n" #:after-last "\n") (string:string-join new-list "\n" #:after-last "\n")
path config:path
#:mode 'text #:mode 'text
#:exists 'replace) #:exists 'replace)
(d-hash-ref messages 'item-removed-prefix) (display-item-added args)))
(quote-item removed-item)
(d-hash-ref messages 'item-removed-suffix))) (define (add-item args)
(if (and
(define (remove-item args) (check-for-folder)
(cond (check-for-file))
[(list-empty? path) (add-item-to-file (vector-ref args 1))
(d-hash-ref messages 'empty-todo-list)] (begin
[(and (display-hash-ref messages:messages 'file-not-found)
(check-for-folder) (display-hash-ref messages:messages 'try-init))))
(check-for-file))
(remove-item-from-file (vector-ref args 1))] (define (remove-item-from-file args)
[(and (not (check-for-folder)) (not (check-for-file))) (let ([removed-item (get-removed-item (file->string-list config:path) args)]
(begin [new-list (remove
(d-hash-ref messages 'file-not-found) (list-ref (file->string-list config:path) (string->number args))
(d-hash-ref messages 'try-init))])) (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))]))