├── .gitignore ├── .travis.yml ├── README.md ├── contrib └── auth │ └── auth.lisp ├── docs ├── api.scr ├── extensions.scr ├── includes │ ├── project.lisp │ └── run-app.lisp ├── manifest.lisp ├── overview.scr ├── project.scr ├── utweet.png └── utweet.scr ├── examples ├── hello-world │ └── app.lisp └── utweet │ ├── .gitignore │ ├── models.lisp │ ├── static │ └── style.css │ ├── templates │ ├── base.html │ ├── head.html │ ├── index.html │ ├── navbar.html │ ├── profile.html │ ├── show-tweets.html │ ├── timeline.html │ └── user-list.html │ └── views.lisp ├── lucerne-auth.asd ├── lucerne-hello-world.asd ├── lucerne-test.asd ├── lucerne-utweet.asd ├── lucerne.asd ├── skeleton ├── README.md ├── asdf-test.lisp ├── asdf.lisp ├── assets │ ├── css │ │ ├── style.css │ │ └── style.scss │ └── js │ │ └── scripts.js ├── docs │ ├── manifest.lisp │ └── manual.scr ├── gitignore.txt ├── src │ └── source.lisp ├── t │ └── test.lisp ├── templates │ ├── base.html │ ├── includes │ │ └── head.html │ └── index.html └── travis.yml ├── src ├── app.lisp ├── control.lisp ├── http.lisp ├── lucerne.lisp ├── skeleton.lisp └── views.lisp └── t ├── examples.lisp ├── final.lisp ├── lucerne.lisp ├── skeleton.lisp └── subapps.lisp /.gitignore: -------------------------------------------------------------------------------- 1 | *.fasl 2 | *.dx32fsl 3 | *.dx64fsl 4 | *.lx32fsl 5 | *.lx64fsl 6 | *.x86f 7 | *~ 8 | .#* 9 | docs/build 10 | _site -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: common-lisp 2 | sudo: false 3 | 4 | env: 5 | global: 6 | - PATH=~/.roswell/bin:$PATH 7 | - ROSWELL_BRANCH=master 8 | - ROSWELL_INSTALL_DIR=$HOME/.roswell 9 | - COVERAGE_EXCLUDE=t 10 | matrix: 11 | - LISP=sbcl-bin COVERALLS=true 12 | 13 | install: 14 | # Roswell & coveralls 15 | - curl -L https://raw.githubusercontent.com/snmsts/roswell/$ROSWELL_BRANCH/scripts/install-for-ci.sh | sh 16 | - git clone https://github.com/fukamachi/cl-coveralls ~/lisp/cl-coveralls 17 | # Clone the latest copies of external libraries 18 | - git clone https://github.com/fukamachi/lack.git ~/lisp/lack 19 | - git clone https://github.com/fukamachi/clack.git ~/lisp/clack 20 | 21 | cache: 22 | directories: 23 | - $HOME/.roswell 24 | - $HOME/.config/common-lisp 25 | 26 | before_script: 27 | - ros --version 28 | - ros config 29 | 30 | script: 31 | - ros -e '(ql:quickload (list :cl-coveralls :lucerne-test))' 32 | -e '(setf fiveam:*debug-on-error* t 33 | fiveam:*debug-on-failure* t)' 34 | -e '(setf *debugger-hook* 35 | (lambda (c h) 36 | (declare (ignore c h)) 37 | (uiop:quit -1)))' 38 | -e '(coveralls:with-coveralls (:exclude (list "t" "examples/utweet/models.lisp")) 39 | (lucerne-test:run-tests))' 40 | 41 | notifications: 42 | email: 43 | - eudoxiahp@gmail.com 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lucerne: a web framework 2 | 3 | [](https://travis-ci.org/eudoxia0/lucerne) 4 | [](https://coveralls.io/r/eudoxia0/lucerne?branch=master) 5 | [](http://quickdocs.org/lucerne/) 6 | 7 | Read the [docs](http://borretti.me/lucerne/docs/overview.html). 8 | 9 | ## Usage 10 | 11 | ```lisp 12 | (defapp app) 13 | 14 | @route app "/" 15 | (defview index () 16 | (respond "