├── .gitattributes ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── kv-bash └── kv-test /.gitattributes: -------------------------------------------------------------------------------- 1 | kv-bash text=auto eol=lf 2 | kv-test text=auto eol=lf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | testing_dirA/ 2 | testing_dirB/ 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: bash 2 | 3 | script: 4 | - bash kv-test 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Phat (https://github.com/damphat) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | kv-bash [![Build Status](https://travis-ci.org/damphat/kv-bash.png?branch=master)](https://travis-ci.org/damphat/kv-bash) 2 | ===================== 3 | **About** 4 | - tiny key/value dabatase 5 | - database store in home directory 6 | - each user has 1 database 7 | - usage by importing 5 bash functions via ```$ source ./kv-bash``` 8 | 9 | **Requirements** 10 | 11 | unix-like environement, no dependencies 12 | 13 | **Usage** 14 | 15 | import all database functions 16 | 17 | ``` 18 | $ source ./kv-bash # import kv-bash functions 19 | ``` 20 | 21 | use database functions 22 | 23 | ``` 24 | $ kvset # create or change value of key 25 | $ kvget # get value of key 26 | $ kvdel # delete by key 27 | $ kvlist # list all current key/value pairs 28 | $ kvclear # clear database 29 | ``` 30 | 31 | **Examples** 32 | 33 | ``` 34 | $ source ./kv-bash 35 | $ kvset user mr.bob 36 | $ kvset pass abc@123 37 | $ kvlist 38 | user mr.bob 39 | pass abc@123 40 | $ kvget user 41 | mr.bob 42 | $ kvget pass 43 | abc@123 44 | $ kvdel pass 45 | $ kvget pass 46 | 47 | $ kvclear 48 | ``` 49 | 50 | **Run tests** 51 | 52 | ``` 53 | git clone https://github.com/damphat/kv-bash.git 54 | cd kv-bash 55 | ./kv-test 56 | ``` 57 | 58 | test result 59 | 60 | ``` 61 | RUN ALL TEST CASES: 62 | =================== 63 | 1 call kvget for non-exist key should return empty [ OK ] 64 | 2 kvset then kvget a variable [ OK ] 65 | 3 kvset then kvset again with different value [ OK ] 66 | 4 deleted variable should be empty [ OK ] 67 | 5 kvdel non exist should be OK [ OK ] 68 | 6 kvset without param return error [ OK ] 69 | 7 kvget without param return error [ OK ] 70 | 8 kvdel without param return error [ OK ] 71 | 9 kvset 3 keys/value; kvlist => line count = 3 [ OK ] 72 | 10 non-exist-var => empty value => line count = 1 [ OK ] 73 | 11 kvclear; kvlist => line count = 0 [ OK ] 74 | 12 kvget return empty value => error code != 0 [ OK ] 75 | 13 spaces in value [ OK ] 76 | ``` 77 | -------------------------------------------------------------------------------- /kv-bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # ABOUT kv-bash: 3 | # key/value dabatase 4 | # database store in HOME directory 5 | # each user has 1 database 6 | # imports 5 bash functions via ```$ source kv-bash``` 7 | # 8 | # Author: damphat 9 | # Version: 0.1 10 | # Requirements: unix-like environement, no dependencies 11 | # 12 | # USAGE: 13 | # source ./kv-bash # import kv-bash functions 14 | # kvset # assign value to key 15 | # kvget # get value of key 16 | # kvdel # kvdelete by key 17 | # kvlist # list all current key/value pairs 18 | # kvclear # clear database 19 | # 20 | # EXAMPLES: 21 | # $ source ./kv-bash 22 | # $ kvset user mr.bob 23 | # $ kvset pass abc@123 24 | # $ kvlist 25 | # user mr.bob 26 | # pass abc@123 27 | # $ kvget user 28 | # mr.bob 29 | # $ kvget pass 30 | # abc@123 31 | # $ kvdel pass 32 | # $ kvget pass 33 | # 34 | # $ kvclear 35 | 36 | ######################## 37 | # CONSTANTS 38 | ######################## 39 | 40 | default_kv_user_dir="$HOME/.kv-bash" 41 | 42 | ######################## 43 | # LOCAL FUNCTIONS 44 | ######################## 45 | 46 | # print to stderr, red color 47 | kv_echo_err() { 48 | echo -e "\e[01;31m$@\e[0m" >&2 49 | } 50 | 51 | # Usage: kv_echo_err_box 52 | kv_echo_err_box() { 53 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 54 | kv_echo_err " +-------------------------------+" 55 | kv_echo_err " | ERROR: $1" 56 | kv_echo_err " | function: $2" 57 | kv_echo_err " | dir: $kv_user_dir" 58 | kv_echo_err " +-------------------------------+" 59 | } 60 | 61 | # Usage: kv_validate_key 62 | kv_validate_key() { 63 | [[ "$1" =~ ^[0-9a-zA-Z._:-]+$ ]] 64 | } 65 | 66 | ######################## 67 | # ENSURE THIS-FILE IS CALL BY 'source ./kv-bash' 68 | ######################## 69 | 70 | [[ "${BASH_SOURCE[0]}" != "${0}" ]] || { 71 | kv_echo_err " +------------------------------------------------+" 72 | kv_echo_err " | FATAL ERROR: wrong usage :( |" 73 | kv_echo_err " | You should use this via source |" 74 | kv_echo_err " | $ source ./kv-bash |" 75 | kv_echo_err " | |" 76 | kv_echo_err " | Examples: |" 77 | kv_echo_err " | $ source ./kv-bash |" 78 | kv_echo_err " | $ kvset user mr.bob |" 79 | kv_echo_err " | $ kvset pass abc@123 |" 80 | kv_echo_err " | $ kvlist |" 81 | kv_echo_err " | user mr.bob |" 82 | kv_echo_err " | pass abc@123 |" 83 | kv_echo_err " | $ kvget user |" 84 | kv_echo_err " | mr.bob |" 85 | kv_echo_err " | $ kvget pass |" 86 | kv_echo_err " | abc@123 |" 87 | kv_echo_err " | $ kvdel pass |" 88 | kv_echo_err " | $ kvget pass |" 89 | kv_echo_err " | |" 90 | kv_echo_err " | $ kvclear |" 91 | kv_echo_err " +------------------------------------------------+" 92 | exit 1 93 | } 94 | 95 | ######################## 96 | # PUBLIC FUNCTIONS 97 | ######################## 98 | 99 | # Usage: kvget 100 | kvget() { 101 | key="$1" 102 | kv_validate_key "$key" || { 103 | kv_echo_err_box 'invalid param "key"' 'kvget()' 104 | return 1 105 | } 106 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 107 | VALUE="$([ -f "$kv_user_dir/$key" ] && cat "$kv_user_dir/$key")" 108 | echo "$VALUE" 109 | 110 | [ "$VALUE" != "" ] 111 | } 112 | 113 | # Usage: kvset [value] 114 | kvset() { 115 | key="$1" 116 | value="$2" 117 | kv_validate_key "$key" || { 118 | kv_echo_err_box 'invalid param "key"' 'kvset()' 119 | return 1 120 | } 121 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 122 | test -d "$kv_user_dir" || mkdir "$kv_user_dir" 123 | echo "$value" > "$kv_user_dir/$key" 124 | } 125 | 126 | # Usage: kvdel 127 | kvdel() { 128 | key="$1" 129 | kv_validate_key "$key" || { 130 | kv_echo_err_box 'invalid param "key"' 'kvdel()' 131 | return 1 132 | } 133 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 134 | test -f "$kv_user_dir/$key" && rm -f "$kv_user_dir/$key" 135 | } 136 | 137 | # list all key/value pairs to stdout 138 | # Usage: kvlist 139 | kvlist() { 140 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 141 | for i in "$kv_user_dir/"*; do 142 | if [ -f "$i" ]; then 143 | key="$(basename "$i")" 144 | echo "$key" "$(kvget "$key")" 145 | fi 146 | done 147 | } 148 | 149 | # clear all key/value pairs in database 150 | # Usage: kvclear 151 | kvclear() { 152 | kv_user_dir=${KV_USER_DIR:-$default_kv_user_dir} 153 | rm -rf "$kv_user_dir" 154 | } 155 | -------------------------------------------------------------------------------- /kv-test: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | BASH_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) 4 | source $BASH_DIR/kv-bash 5 | 6 | OK() { echo -e "[\e[01;32m OK \e[0m]"; } 7 | FAILED() { echo -e "[\e[01;31mFAILED\e[0m]"; } 8 | RESULT() { [ $? == 0 ] && OK || FAILED; } 9 | 10 | TEST_COUNT=0 11 | test_dirA="./testingdirA" 12 | test_dirB="./testingdirB" 13 | 14 | # Usage: TESTCASE [description string] 15 | function TESTCASE() { 16 | ((TEST_COUNT++)) 17 | printf "%3s %-50s" "$TEST_COUNT" "$1" 18 | } 19 | 20 | rm -rf "$test_dirA" "$test_dirB" 21 | 22 | echo 23 | echo RUN ALL TEST CASES: 24 | echo =================== 25 | 26 | TESTCASE 'NO KV_USER_DIR: kvclear; kvlist => line count = 0' 27 | kvset cat Tom 28 | kvset mouse Jerry 29 | kvclear 30 | [ $(kvlist | wc -l) == 0 ] 31 | RESULT 32 | 33 | KV_USER_DIR="$test_dirA" 34 | 35 | TESTCASE 'call kvget for non-exist key should return empty' 36 | [ "$(kvget name)" == "" ] 37 | RESULT 38 | 39 | TESTCASE 'kvset then kvget a variable' 40 | kvset name "Tom" 41 | [ "$(kvget name)" == "Tom" ] 42 | RESULT 43 | 44 | TESTCASE 'kvset then kvset again with different value' 45 | kvset name "Tom" 46 | kvset name "Jerry" 47 | [ "$(kvget name)" == "Jerry" ] 48 | RESULT 49 | 50 | TESTCASE 'deleted variable should be empty' 51 | kvset name "hello world!" 52 | kvdel name 53 | [ "$(kvget name)" == "" ] 54 | RESULT 55 | 56 | TESTCASE 'kvdel non exist should be OK' 57 | kvdel name 58 | [ "$(kvdel name 2>&1)" == "" ] 59 | RESULT 60 | 61 | TESTCASE 'kvset without param return error' 62 | kvset 2>/dev/null 63 | [ $? != 0 ] 64 | RESULT 65 | 66 | TESTCASE 'kvget without param return error' 67 | kvget 2>/dev/null 68 | [ $? != 0 ] 69 | RESULT 70 | 71 | TESTCASE 'kvdel without param return error' 72 | kvdel 2>/dev/null 73 | [ $? != 0 ] 74 | RESULT 75 | 76 | TESTCASE 'kvset 3 keys/value; kvlist => line count = 3' 77 | kvclear 78 | kvset var1 value1 79 | kvset var2 value2 80 | kvset var3 value3 81 | [ $(kvlist | wc -l) == 3 ] 82 | RESULT 83 | 84 | TESTCASE 'non-exist-var => empty value => line count = 1' 85 | [ $(kvget non-exist-var | wc -l) == 1 ] 86 | RESULT 87 | 88 | TESTCASE 'kvclear; kvlist => line count = 0' 89 | kvset cat Tom 90 | kvset mouse Jerry 91 | kvclear 92 | [ $(kvlist | wc -l) == 0 ] 93 | RESULT 94 | 95 | TESTCASE 'kvget return empty value => error code != 0' 96 | kvset name 97 | $(kvget name) 98 | [ $? != 0 ] 99 | RESULT 100 | 101 | TESTCASE 'spaces in value' 102 | kvset name ' phat dam ' 103 | [ "$(kvget name)" == ' phat dam ' ] 104 | RESULT 105 | kvdel name 106 | 107 | TESTCASE 'can change user dir' 108 | kvclear 109 | kvset Foo Bar 110 | KV_USER_DIR="$test_dirB" 111 | kvset var1 value1 112 | kvset var2 value2 113 | kvset var3 value3 114 | [ $(kvlist | wc -l) == 3 ] 115 | RESULT 116 | kvclear 117 | 118 | TESTCASE 'can return to old user dir' 119 | KV_USER_DIR="$test_dirA" 120 | [ $(kvlist | wc -l) == 1 ] 121 | RESULT 122 | kvclear 123 | 124 | #more testcase here 125 | 126 | echo 127 | --------------------------------------------------------------------------------