Tends to be a Clojure application generator.
Larva tends to become an easier way to build applications in Clojure and provides mechanisms for rapid development on solid foundations.
The main emphasis is on building WEB applications and services.
Larva is a software package containing a tiny DSL, code generators and other utilities.
It is divided into two parts:
larva.db
(provides db utilities)larva.web
(provides generating web applications)
Since Clojure tooling getting more diverse Larva is striving to provide support for best practices from Clojure community or to be tool/framework independent where it's possible.
Larva DSL is Clojure internal DSL which looks like this:
(def larva-model
{:about
{:name "model name"
:author "Author"
:comment "Comment here."}
:entities
[{:signature "Entity 1"
:properties [{:name "property 1" :type :str :gui-label "p1"}
{:name "property 2" :type :str :gui-label "p2"}
{:name "property 3" :type {:coll :str}}
{:name "property 4" :type {:one :reference
:to ["Entity 2"]}}]}
{:signature "Entity 2"
:properties [{:name "property 1" :type :str :gui-label "p11"}
{:name "property 2" :type :str :gui-label "p22"}
{:name "property 3" :type :num :gui-label "p33"}
{:name "property 4" :type {:coll :reference
:to ["Entity 1" "property 4"]}
:gui-label "p44"}]}
{:signature "Entity 3"
:properties [{:name "property 1" :type :str :gui-label "p111"}
{:name "property 2" :type :geo :gui-label "p222"}]}]})
Full language meta model is defined using plumatic/schema
and can be found in larva.meta-model
namespace.
Larva DSL serves to provide model to code generators. It is internally represented as a directed graph using Ubergraph and you can paint a picture of your larva model:
(ubergraph.core/viz-graph
(larva.graph/->graph larva.test-data/custom-property-datatype))
I'm currently implementing larva.db
so you can try/test it.
To do that you should make a fresh Luminus project with +postgres
profile.
Setup your database connection using profiles.clj
in the root of your
project.
Then add larva jar as a dependency of your fresh project:
;; in project.clj
:dependencies [[org.clojure/clojure "1.8.0"]
...
[larva "0.1.0-SNAPSHOT"]]
Now you can fire REPL and run:
(require '[larva.frameworks.luminus.build :as larva])
;; This namespace contains few models for testing.
;; You can write your own model though.
(require '[larva.test-data :as larva-test])
(larva/make :model larva-test/custom-property-datatype :force true)
This will fill resources/migrations
and resources/sql
with database
migrations and HugSQL queries respectively.
To setup your database you should run up migratioins placed in
resources/migrations
using standard Luminus
command:
lein run migrate
Now you should run (start)
form user
namespace in REPL to start all
the Mount states.
Then enter the <your application>.db.core
namespace and run:
(conman/bind-connection *db*
"sql/additional_queries.sql"
"sql/Bands_queries.sql"
"sql/Categories_queries.sql"
"sql/Festivals_queries.sql"
"sql/Instruments_queries.sql"
"sql/Mentors_queries.sql"
"sql/More_infos_queries.sql"
"sql/Musicians_queries.sql"
"sql/Socialmediaprofiles_queries.sql")
This will bind all the HugSQL queries to database connection.
... and your ready to play with larva.db
:
(let [mentor (create-mentor! {:name "Marc" :surname "Lauryn"})
band (create-band! {:name "The Unfos" :genre "RnR" :largeness 5
:category nil})
musician (create-musician! {:name "Philip" :surname "Yonas"
:nickname "Fisha" :band nil
:dream_band nil})]
(assoc-musician-band! {:band (:id band) :musician (:id musician)})
(assoc-musician-mentor! {:musician (:id musician) :mentor (:id mentor)})
(println (str (:name musician) " is rockin' with "
(-> {:musician (:id musician)}
get-musician-band
:name)
" thanks to "
(-> {:musician (:id musician)}
get-musician-mentor
:name) "!")))
=> Philip is rockin' with The Unfos thanks to Marc!
Copyright © 2015-2016 Novak Boškov
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.