dad icon indicating copy to clipboard operation
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