Browse Source

first push

master
Ava Fox 11 months ago
commit
6fba16b68d
16 changed files with 384 additions and 0 deletions
  1. +8
    -0
      .gitignore
  2. +16
    -0
      README.markdown
  3. +39
    -0
      app.lisp
  4. +0
    -0
      db/schema.sql
  5. +44
    -0
      src/config.lisp
  6. +23
    -0
      src/db.lisp
  7. +30
    -0
      src/main.lisp
  8. +51
    -0
      src/view.lisp
  9. +35
    -0
      src/web.lisp
  10. +21
    -0
      static/css/main.css
  11. +47
    -0
      templates/_errors/404.html
  12. +7
    -0
      templates/index.html
  13. +11
    -0
      templates/layouts/default.html
  14. +12
    -0
      tests/universe-time-calc.lisp
  15. +11
    -0
      universe-time-calc-test.asd
  16. +29
    -0
      universe-time-calc.asd

+ 8
- 0
.gitignore View File

@@ -0,0 +1,8 @@
*.fasl
*.dx32fsl
*.dx64fsl
*.lx32fsl
*.lx64fsl
*.x86f
*~
.#*

+ 16
- 0
README.markdown View File

@@ -0,0 +1,16 @@
# universe-time-calc



## Usage

## Installation

## Author

* ava fox

## Copyright

Copyright (c) 2019 ava fox


+ 39
- 0
app.lisp View File

@@ -0,0 +1,39 @@
(ql:quickload :universe-time-calc)

(defpackage universe-time-calc.app
(:use :cl)
(:import-from :lack.builder
:builder)
(:import-from :ppcre
:scan
:regex-replace)
(:import-from :universe-time-calc.web
:*web*)
(:import-from :universe-time-calc.config
:config
:productionp
:*static-directory*))
(in-package :universe-time-calc.app)

(builder
(:static
:path (lambda (path)
(if (ppcre:scan "^(?:/images/|/css/|/js/|/robot\\.txt$|/favicon\\.ico$)" path)
path
nil))
:root *static-directory*)
(if (productionp)
nil
:accesslog)
(if (getf (config) :error-log)
`(:backtrace
:output ,(getf (config) :error-log))
nil)
:session
(if (productionp)
nil
(lambda (app)
(lambda (env)
(let ((datafly:*trace-sql* t))
(funcall app env)))))
*web*)

+ 0
- 0
db/schema.sql View File


+ 44
- 0
src/config.lisp View File

@@ -0,0 +1,44 @@
(in-package :cl-user)
(defpackage universe-time-calc.config
(:use :cl)
(:import-from :envy
:config-env-var
:defconfig)
(:export :config
:*application-root*
:*static-directory*
:*template-directory*
:appenv
:developmentp
:productionp))
(in-package :universe-time-calc.config)

(setf (config-env-var) "APP_ENV")

(defparameter *application-root* (asdf:system-source-directory :universe-time-calc))
(defparameter *static-directory* (merge-pathnames #P"static/" *application-root*))
(defparameter *template-directory* (merge-pathnames #P"templates/" *application-root*))

(defconfig :common
`(:databases ((:maindb :sqlite3 :database-name ":memory:"))))

(defconfig |development|
'())

(defconfig |production|
'())

(defconfig |test|
'())

(defun config (&optional key)
(envy:config #.(package-name *package*) key))

(defun appenv ()
(uiop:getenv (config-env-var #.(package-name *package*))))

(defun developmentp ()
(string= (appenv) "development"))

(defun productionp ()
(string= (appenv) "production"))

+ 23
- 0
src/db.lisp View File

@@ -0,0 +1,23 @@
(in-package :cl-user)
(defpackage universe-time-calc.db
(:use :cl)
(:import-from :universe-time-calc.config
:config)
(:import-from :datafly
:*connection*)
(:import-from :cl-dbi
:connect-cached)
(:export :connection-settings
:db
:with-connection))
(in-package :universe-time-calc.db)

(defun connection-settings (&optional (db :maindb))
(cdr (assoc db (config :databases))))

(defun db (&optional (db :maindb))
(apply #'connect-cached (connection-settings db)))

(defmacro with-connection (conn &body body)
`(let ((*connection* ,conn))
,@body))

+ 30
- 0
src/main.lisp View File

@@ -0,0 +1,30 @@
(in-package :cl-user)
(defpackage universe-time-calc
(:use :cl)
(:import-from :universe-time-calc.config
:config)
(:import-from :clack
:clackup)
(:export :start
:stop))
(in-package :universe-time-calc)

(defvar *appfile-path*
(asdf:system-relative-pathname :universe-time-calc #P"app.lisp"))

(defvar *handler* nil)

(defun start (&rest args &key server port debug &allow-other-keys)
(declare (ignore server port debug))
(when *handler*
(restart-case (error "Server is already running.")
(restart-server ()
:report "Restart the server"
(stop))))
(setf *handler*
(apply #'clackup *appfile-path* args)))

(defun stop ()
(prog1
(clack:stop *handler*)
(setf *handler* nil)))

+ 51
- 0
src/view.lisp View File

@@ -0,0 +1,51 @@
(in-package :cl-user)
(defpackage universe-time-calc.view
(:use :cl)
(:import-from :universe-time-calc.config
:*template-directory*)
(:import-from :caveman2
:*response*
:response-headers)
(:import-from :djula
:add-template-directory
:compile-template*
:render-template*
:*djula-execute-package*)
(:import-from :datafly
:encode-json)
(:export :render
:render-json))
(in-package :universe-time-calc.view)

(djula:add-template-directory *template-directory*)

(defparameter *template-registry* (make-hash-table :test 'equal))

(defun render (template-path &optional env)
(let ((template (gethash template-path *template-registry*)))
(unless template
(setf template (djula:compile-template* (princ-to-string template-path)))
(setf (gethash template-path *template-registry*) template))
(apply #'djula:render-template*
template nil
env)))

(defun render-json (object)
(setf (getf (response-headers *response*) :content-type) "application/json")
(encode-json object))


;;
;; Execute package definition

(defpackage universe-time-calc.djula
(:use :cl)
(:import-from :universe-time-calc.config
:config
:appenv
:developmentp
:productionp)
(:import-from :caveman2
:url-for))

(setf djula:*djula-execute-package* (find-package :universe-time-calc.djula))

+ 35
- 0
src/web.lisp View File

@@ -0,0 +1,35 @@
(in-package :cl-user)
(defpackage universe-time-calc.web
(:use :cl
:caveman2
:universe-time-calc.config
:universe-time-calc.view
:universe-time-calc.db
:datafly
:sxql)
(:export :*web*))
(in-package :universe-time-calc.web)

;; for @route annotation
(syntax:use-syntax :annot)

;;
;; Application

(defclass <web> (<app>) ())
(defvar *web* (make-instance '<web>))
(clear-routing-rules *web*)

;;
;; Routing rules

(defroute "/" ()
(render #P"index.html"))

;;
;; Error pages

(defmethod on-exception ((app <web>) (code (eql 404)))
(declare (ignore app))
(merge-pathnames #P"_errors/404.html"
*template-directory*))

+ 21
- 0
static/css/main.css View File

@@ -0,0 +1,21 @@
@charset "UTF-8";

body {
font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif;
}

a:link {
color: #005585;
text-decoration: none;
}
a:visited {
color: #485270;
}
a:hover {
color: #b83800;
text-decoration: underline;
}

#main {
text-align: center;
}

+ 47
- 0
templates/_errors/404.html View File

@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>404 NOT FOUND</title>
<style type="text/css">
html {
height: 100%;
}

body {
height: 100%;
font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif;
background-color: #DFDFDF;
}

#main {
display: table;
width: 100%;
height: 100%;
}

.error {
display: table-cell;
text-align: center;
vertical-align: middle;
}

.error .code {
font-size: 1600%;
font-weight: bold;
}

.error .message {
font-size: 400%;
}
</style>
</head>
<body>
<div id="main">
<div class="error">
<div class="code">404</div>
<div class="message">NOT FOUND</div>
</div>
</div>
</body>
</html>

+ 7
- 0
templates/index.html View File

@@ -0,0 +1,7 @@
{% extends "layouts/default.html" %}
{% block title %}Welcome to Caveman2{% endblock %}
{% block content %}
<div id="main">
Welcome to <a href="http://8arrow.org/caveman/">Caveman2</a>!
</div>
{% endblock %}

+ 11
- 0
templates/layouts/default.html View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css">
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

+ 12
- 0
tests/universe-time-calc.lisp View File

@@ -0,0 +1,12 @@
(in-package :cl-user)
(defpackage universe-time-calc-test
(:use :cl
:universe-time-calc
:prove))
(in-package :universe-time-calc-test)

(plan nil)

;; blah blah blah.

(finalize)

+ 11
- 0
universe-time-calc-test.asd View File

@@ -0,0 +1,11 @@
(defsystem "universe-time-calc-test"
:defsystem-depends-on ("prove-asdf")
:author "ava fox"
:license ""
:depends-on ("universe-time-calc"
"prove")
:components ((:module "tests"
:components
((:test-file "universe-time-calc"))))
:description "Test system for universe-time-calc"
:perform (test-op (op c) (symbol-call :prove-asdf :run-test-system c)))

+ 29
- 0
universe-time-calc.asd View File

@@ -0,0 +1,29 @@
(defsystem "universe-time-calc"
:version "0.1.0"
:author "ava fox"
:license ""
:depends-on ("clack"
"lack"
"caveman2"
"envy"
"cl-ppcre"
"uiop"

;; for @route annotation
"cl-syntax-annot"

;; HTML Template
"djula"

;; for DB
"datafly"
"sxql")
:components ((:module "src"
:components
((:file "main" :depends-on ("config" "view" "db"))
(:file "web" :depends-on ("view"))
(:file "view" :depends-on ("config"))
(:file "db" :depends-on ("config"))
(:file "config"))))
:description ""
:in-order-to ((test-op (test-op "universe-time-calc-test"))))

Loading…
Cancel
Save