Browse Source

first commit

master
zapashcanon 9 months ago
commit
2b61851283
Signed by: zapashcanon GPG Key ID: 8981C3C62D1D28F1
  1. 1
      .gitignore
  2. 61
      .ocamlformat
  3. 8
      LICENSE.md
  4. 1
      dune-project
  5. 219
      src/default.ml
  6. 4
      src/dune
  7. 114
      src/gotd.ml

1
.gitignore

@ -0,0 +1 @@
_build

61
.ocamlformat

@ -0,0 +1,61 @@
version=0.19.0
align-cases=false
align-constructors-decl=false
align-variants-decl=false
assignment-operator=end-line
break-before-in=fit-or-vertical
break-cases=all
break-collection-expressions=fit-or-vertical
break-fun-decl=wrap
break-fun-sig=wrap
break-infix=wrap
break-infix-before-func=false
break-separators=before
break-sequences=true
break-string-literals=auto
break-struct=force
cases-exp-indent=2
cases-matching-exp-indent=normal
disambiguate-non-breaking-match=false
doc-comments=before
doc-comments-padding=2
doc-comments-tag-only=default
dock-collection-brackets=false
exp-grouping=preserve
extension-indent=2
field-space=loose
function-indent=2
function-indent-nested=never
if-then-else=k-r
indent-after-in=0
indicate-multiline-delimiters=space
indicate-nested-or-patterns=unsafe-no
infix-precedence=indent
leading-nested-match-parens=false
let-and=sparse
let-binding-indent=2
let-binding-spacing=compact
let-module=compact
margin=80
match-indent=0
match-indent-nested=never
max-indent=68
module-item-spacing=sparse
nested-match=wrap
ocp-indent-compat=false
parens-ite=false
parens-tuple=always
parens-tuple-patterns=multi-line-only
parse-docstrings=true
sequence-blank-line=preserve-one
sequence-style=terminator
single-case=compact
space-around-arrays=true
space-around-lists=true
space-around-records=true
space-around-variants=true
stritem-extension-indent=0
type-decl=sparse
type-decl-indent=2
wrap-comments=false
wrap-fun-args=true

8
LICENSE.md

@ -0,0 +1,8 @@
The ISC License (ISC)
=====================
Copyright © 2021, Léo Andrès
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

1
dune-project

@ -0,0 +1 @@
(lang dune 2.8)

219
src/default.ml

@ -0,0 +1,219 @@
let author = "TODO"
let changes = {|## unreleased
|}
let doc_dune name =
Format.sprintf {|(documentation
(package %s)
(mld_files index))
|} name
let doc_index name =
Format.sprintf
{|{0 %s}
{{:https://TODO} %s} is an {{:https://ocaml.org} OCaml} library/executable to TODO.
{1:api API}
{!modules:
%s
}
{1:private_api Private API}
You shouldn't have to use any of these modules, they're used internally only.
{!modules:
TODO
}
|}
name name
(String.mapi
(fun i c ->
if i = 0 then
Char.uppercase_ascii c
else
c )
name )
let gitignore = "build\n"
let license author =
Format.sprintf
{|The ISC License (ISC)
=====================
Copyright © 2021, %s
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|}
author
let duneproject name =
Format.sprintf
{|(lang dune 2.8)
(name %s)
(license ISC)
(authors "TODO")
(maintainers "TODO")
;(source
; (github TODO/%s))
(generate_opam_files true)
(package
(name %s)
(synopsis "OCaml library/executable to TODO")
(description
"%s is an OCaml library/executable to TODO.")
(tags
(%s TODO TODO TODO TODO))
(depends
(ocaml
(>= 4.08))))
|}
name name name name name
let example_dune = {|(executable
(name main)
(modules main))
|}
let example_main = {|let () = Format.printf "TODO@."
|}
let ocamlformat =
{|version=0.19.0
align-cases=false
align-constructors-decl=false
align-variants-decl=false
assignment-operator=end-line
break-before-in=fit-or-vertical
break-cases=all
break-collection-expressions=fit-or-vertical
break-fun-decl=wrap
break-fun-sig=wrap
break-infix=wrap
break-infix-before-func=false
break-separators=before
break-sequences=true
break-string-literals=auto
break-struct=force
cases-exp-indent=2
cases-matching-exp-indent=normal
disambiguate-non-breaking-match=false
doc-comments=before
doc-comments-padding=2
doc-comments-tag-only=default
dock-collection-brackets=false
exp-grouping=preserve
extension-indent=2
field-space=loose
function-indent=2
function-indent-nested=never
if-then-else=k-r
indent-after-in=0
indicate-multiline-delimiters=space
indicate-nested-or-patterns=unsafe-no
infix-precedence=indent
leading-nested-match-parens=false
let-and=sparse
let-binding-indent=2
let-binding-spacing=compact
let-module=compact
margin=80
match-indent=0
match-indent-nested=never
max-indent=68
module-item-spacing=sparse
nested-match=wrap
ocp-indent-compat=false
parens-ite=false
parens-tuple=always
parens-tuple-patterns=multi-line-only
parse-docstrings=true
sequence-blank-line=preserve-one
sequence-style=terminator
single-case=compact
space-around-arrays=true
space-around-lists=true
space-around-records=true
space-around-variants=true
stritem-extension-indent=0
type-decl=sparse
type-decl-indent=2
wrap-comments=false
wrap-fun-args=true
|}
let readme name =
Format.sprintf
{|# %s
%s is an [OCaml] executable/library to TODO.
## Installation
`%s` can be installed with [opam]:
```sh
opam install %s
```
If you don't have `opam`, you can install it following the [how to install opam] guide.
If you can't or don't want to use `opam`, consult the [opam file] for build instructions.
## Quickstart
```ocaml
let () = Format.printf "TODO@."
```
For more, have a look at the [example] folder, at the [documentation] or at the [test suite].
## About
- [LICENSE]
- [CHANGELOG]
[CHANGELOG]: ./CHANGES.md
[example]: ./example/
[LICENSE]: ./LICENSE.md
[opam file]: ./%s.opam
[test suite]: ./test/
[documentation]: TODO
[how to install opam]: https://opam.ocaml.org/doc/Install.html
[OCaml]: https://ocaml.org
[opam]: https://opam.ocaml.org/
[%s]: TODO
|}
name name name name name name
let src_dune name =
Format.sprintf {|(executable
(name %s)
(modules %s))@.|} name name
let src_name = {|let () = Format.printf "Hello!@."
|}
let test_dune = {|(test
(name main)
(modules main))
|}
let test_main = {|let () = assert true (* TODO *)
|}

4
src/dune

@ -0,0 +1,4 @@
(executable
(name gotd)
(modules default gotd)
(libraries bos directories fpath))

114
src/gotd.ml

@ -0,0 +1,114 @@
let error msg =
Format.eprintf "error: %s@." msg;
exit 1
let log msg = Format.eprintf "%s@." msg
let gen_file path default =
log @@ Format.asprintf "creating file %a" Fpath.pp path;
match Bos.OS.File.write ~mode:0o644 path default with
| Ok () -> ()
| Error (`Msg _) -> error @@ Format.asprintf "can't write %a" Fpath.pp path
let gen_dir path =
log @@ Format.asprintf "creating directory %a" Fpath.pp path;
match Bos.OS.Dir.create ~path:false ~mode:0o755 path with
| Ok true -> ()
| Ok false
| Error (`Msg _) ->
error @@ Format.asprintf "can't create directory %a" Fpath.pp path
module Dirs = Directories.Project_dirs (struct
let qualifier = "fr"
let organization = "zapashcanon"
let application = "gotd"
end)
let () =
if Array.length Sys.argv <> 2 then
error @@ Format.sprintf "usage: %s <project name>" Sys.argv.(0)
let project_name = Sys.argv.(1)
let root = Fpath.v project_name
(* TODO: check with Bos.OS.Path.exists root first ? If a file named root exists this may cause issue otherwise... *)
let () = gen_dir root
let gitignore = Fpath.(root // v ".gitignore")
let () = gen_file gitignore Default.gitignore
let license = Fpath.(root // v "LICENSE.md")
let () = gen_file license (Default.license Default.author)
let readme = Fpath.(root // v "README.md")
let () = gen_file readme (Default.readme project_name)
let changes = Fpath.(root // v "CHANGES.md")
let () = gen_file changes Default.changes
let ocamlformat = Fpath.(root // v ".ocamlformat")
let () = gen_file ocamlformat Default.ocamlformat
let duneproject = Fpath.(root // v "dune-project")
let () = gen_file duneproject (Default.duneproject project_name)
let src = Fpath.(root // v "src")
let () = gen_dir src
let src_dune = Fpath.(src // v "dune")
let () = gen_file src_dune (Default.src_dune project_name)
let src_name = Fpath.(src // add_ext "ml" (v project_name))
let () = gen_file src_name Default.src_name
let doc = Fpath.(root // v "doc")
let () = gen_dir doc
let doc_dune = Fpath.(doc // v "dune")
let () = gen_file doc_dune (Default.doc_dune project_name)
let doc_index = Fpath.(doc // v "index.mld")
let () = gen_file doc_index (Default.doc_index project_name)
let example = Fpath.(root // v "example")
let () = gen_dir example
let example_dune = Fpath.(example // v "dune")
let () = gen_file example_dune Default.example_dune
let example_main = Fpath.(example // v "main.ml")
let () = gen_file example_main Default.example_main
let test = Fpath.(root // v "test")
let () = gen_dir test
let test_dune = Fpath.(test // v "dune")
let () = gen_file test_dune Default.test_dune
let test_main = Fpath.(test // v "main.ml")
let () = gen_file test_main Default.test_main
let () = log "done ! happy hacking 🐱"
Loading…
Cancel
Save