dad
dad copied to clipboard
Small configuration management tool for Clojure
= Dad
image:https://github.com/liquidz/dad/workflows/test/badge.svg[link="https://github.com/liquidz/dad/actions/workflows/test.yml"] image:https://github.com/liquidz/dad/actions/workflows/lint.yml/badge.svg[link="https://github.com/liquidz/dad/actions/workflows/lint.yml"] image:https://github.com/liquidz/dad/actions/workflows/dependency.yml/badge.svg[link="https://github.com/liquidz/dad/actions/workflows/dependency.yml"] image:https://img.shields.io/github/release/liquidz/dad.svg?logo=Github[link="https://github.com/liquidz/dad/releases"]
My father is a greate chef :)
Dad is a small configuration management tool for Clojure. This project is heavily inspired by https://github.com/itamae-kitchen/mitamae[mitamae].
== Concept
=== 🤯 Minimum to remember
- May not write code for Dad often. //* Minimum to remember -- May not write code for Dad often
- Write codes as a https://github.com/babashka/pods[babashka pod]. ** You can gain benefits from code completion and docstring references. //* Easy to start -- Download single binary and run it.
=== 🍟 Easy to start
- Download single binary and run it.
- Run the code written as a babashka pod as it is. ** Dad ignores codes related to loading pods.
== Getting Started
Download binary from https://github.com/liquidz/dad/releases[releases]. [source,terminal]
Download latest dad to the current working directory
curl -L https://raw.githubusercontent.com/liquidz/dad/main/script/download | bash ./dad your_task.clj
Here is a example to install Clojure https://clojure.org/guides/deps_and_cli[command line tools].
You can generate a template file by ./dad --init example.core.
// cf. example/clojure/cli.clj [source,clojure]
#!/usr/bin/env dad --no-color --dry-run (ns example.core (:require [babashka.pods :as pods]))
;; Load dad as a babashka pod (pods/load-pod "dad") (require '[pod.liquidz.dad :as dad])
(dad/package {:name ["curl" "rlwrap"]})
;; You can define function as you like
(defn curl [m]
(let [{:keys [path url]} m]
;; file-exists? is a built-in function in dad.
(when (and (not (dad/file-exists? path))
(string? url))
(dad/execute {:command (str "curl -sfLo " path " " url)}))))
(curl {:path "/tmp/install.sh" :url "https://download.clojure.org/install/linux-install-1.10.3.1087.sh"})
(dad/file {:path "/tmp/install.sh" :mode "755"}) (dad/execute {:cwd "/tmp" :command "./install.sh"}) (dad/file {:path "/tmp/install.sh" :action :delete})
== Supports
- [x] Ubuntu (
apt) - [x] macOS (link:https://brew.sh[Homebrew])
== Example
- link:./example/vim[Building vim by source]
- link:./test/resources/test_task/tasks.clj[Test task]
== Reference
NOTE: You can refer all documents in codes. (evaluate (dad/doc) or (help))
=== Built-in vars / functions
|=== | Name | Var/Func | Description
| link:doc/doc.md[doc] | Func | Print dad documents.
| link:doc/file-exists.md[file-exists?] | Func | Return true if the specified path exists.
| link:doc/os-type.md[os-type]
| Func
| OS name string such as "linux" or "mac".
| link:doc/render.md[render] | Func | Render a template string with a data.
| link:doc/load-file.md[load-file] | Func | Load another recipe file.
|===
See https://github.com/borkdude/sci/blob/master/src/sci/impl/namespaces.cljc[sci/impl/namespaces.cljc] for other core functions.
=== Resources
|=== | Resource name | Description
| link:doc/directory.md[directory] | Create directories.
| link:doc/download.md[download] | Download a file from remote host.
| link:doc/execute.md[execute] | Execute a shell command.
| link:doc/file.md[file] | Create a file.
| link:doc/git.md[git] | Execute git command.
| link:doc/link.md[link] | Create a symbolic link.
| link:doc/package.md[package] | Install packages.
| link:doc/template.md[template] | Create a text file from the specified template files.
|===
== REPL
Dad also provides REPL mode that does not affect your environment. (same as --dry-run option)
[source,console]
$ dad --repl
user=> (println "hello from dad") hello from dad nil
user=> (+ 1 2 3) 6
user=> (package "sl") apt-update [sl] ... will change package-install [sl] ... will change
user=> (package "sl" {:action :uninstall}) package-uninstall [sl] ... WILL NOT change
== License
Copyright © 2019-2022 https://twitter.com/uochan[Masashi Iizuka]
This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0.
This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version, with the GNU Classpath Exception which is available at https://www.gnu.org/software/classpath/license.html. // vim:fdm=marker:fdl=0