git.fiddlerwoaroof.com
Browse code

deploy: make Dockerfile actually build an executable

Ed Langley authored on 10/09/2019 23:31:43
Showing 8 changed files
... ...
@@ -1,7 +1,18 @@
1
-FROM fiddlerwoaroof/sbcl-static:1.5.6
1
+FROM fiddlerwoaroof/sbcl-static:latest
2 2
 
3
-COPY build /build
3
+COPY todo-backend.asd /root/quicklisp/local-projects/todo-backend.asd
4 4
 
5
-RUN /usr/local/bin/sbcl --load /build/build.lisp
5
+RUN mkdir -p /build
6
+COPY build/deps.lisp /build/deps.lisp
7
+RUN /usr/local/bin/sbcl --load /build/deps.lisp --quit
6 8
 
7
-ENTRYPOINT ["/usr/local/bin/sbcl"]
9
+RUN rm /root/quicklisp/local-projects/todo-backend.asd
10
+
11
+RUN mkdir -p /root/quicklisp/local-projects/cl-todo-backend/
12
+COPY . /root/quicklisp/local-projects/cl-todo-backend/
13
+WORKDIR /root
14
+COPY build/build.lisp /build/build.lisp
15
+RUN /usr/local/bin/sbcl --disable-debugger --load /build/build.lisp /root/todo-backend
16
+
17
+EXPOSE 5000
18
+ENTRYPOINT ["/root/todo-backend"]
... ...
@@ -146,7 +146,7 @@
146 146
            ,@(loop for (target . descriptors) in routes
147 147
                    append (loop for (method callback) in descriptors
148 148
                                 append `((ningle:route ,app ,target
149
-                                                       :method method)
149
+                                                       :method ,method)
150 150
                                          ,callback))))))
151 151
    #+END_SRC
152 152
    
... ...
@@ -263,40 +263,45 @@
263 263
 ** main.lisp source 
264 264
 
265 265
    #+BEGIN_SRC lisp :tangle main.lisp :noweb yes
266
-   <<package-include>>
267
-   ;;; entrypoint
268
-   (defun setup ()
269
-     (let ((app (make-instance 'ningle:<app>)))
270
-       (prog1 app (setup-routes app))))
271
-
272
-   (defvar *handler*)
273
-
274
-   (defun is-running ()
275
-     (and (boundp '*handler*)
276
-          ,*handler*))
277
-
278
-   (defun ensure-started (&rest r &key port)
279
-     (declare (ignore port))
280
-     (let ((app (setup)))
281
-       (values app
282
-               (setf *handler*
283
-                     (if (not (is-running))
284
-                         (apply 'clack:clackup
285
-                                (lack.builder:builder
286
-                                 :accesslog
287
-                                 'fwoar.lack.cors.middleware:cors-middleware
288
-                                 'fwoar.lack.json.middleware:json-middleware
289
-                                 app)
290
-                                r)
291
-                         ,*handler*)))))
292
-
293
-   (defun stop ()
294
-     (if (is-running)
295
-         (progn
296
-           (clack:stop *handler*)
297
-           (makunbound '*handler*)
298
-           nil)
299
-         nil))
266
+     <<package-include>>
267
+     ;;; entrypoint
268
+     (defun setup ()
269
+       (let ((app (make-instance 'ningle:<app>)))
270
+         (prog1 app (setup-routes app))))
271
+
272
+     (defvar *handler*)
273
+
274
+     (defun is-running ()
275
+       (and (boundp '*handler*)
276
+            ,*handler*))
277
+
278
+     (defun ensure-started (&rest r &key (address "127.0.0.1") (port 5000))
279
+       (declare (ignore address port))
280
+       (let ((app (setup)))
281
+         (values app
282
+                 (setf *handler*
283
+                       (if (not (is-running))
284
+                           (apply 'clack:clackup
285
+                                  (lack.builder:builder
286
+                                   :accesslog
287
+                                   'fwoar.lack.cors.middleware:cors-middleware
288
+                                   'fwoar.lack.json.middleware:json-middleware
289
+                                   app)
290
+                                  r)
291
+                           ,*handler*)))))
292
+
293
+     (defun stop ()
294
+       (if (is-running)
295
+           (progn
296
+             (clack:stop *handler*)
297
+             (makunbound '*handler*)
298
+             nil)
299
+           nil))
300
+
301
+     (defun main (&rest _)
302
+       (declare (ignore _))
303
+       (ensure-started :address "0.0.0.0" :port 5000)
304
+       (loop (sleep 5)))
300 305
    #+END_SRC
301 306
 
302 307
    #+NAME: package-include
... ...
@@ -1,17 +1,17 @@
1
-#.(progn (ql:quickload :legit)
2
-         nil)
1
+(in-package :cl-user)
3 2
 
4
-(defun clone-github-repo (user repo)
5
-  (let ((result-dir (merge-pathnames (make-pathname :directory (list :relative
6
-                                                                     "quicklisp" "local-projects"
7
-                                                                     repo)
8
-                                                    :defaults #p"/")
9
-                                     (user-homedir-pathname))))
10
-    (legit:git-clone (format nil "https://github.com/~a/~a.git" user repo)
11
-                     :directory result-dir)))
3
+(eval-when (:compile-toplevel :load-toplevel :execute)
4
+  (defun build ()
5
+    (ql:quickload :todo-backend)
6
+    (handler-case
7
+        (progn (setq sb-alien::*shared-objects* nil)
8
+               (save-lisp-and-die (car (last (uiop:command-line-arguments)))
9
+                                  :executable t
10
+                                  :toplevel (find-symbol "MAIN" :fwoar.todo)
11
+                                  :save-runtime-options t
12
+                                  :compression 5))
13
+      (serious-condition (c)
14
+        (format t "~&fail: ~a~%" c)
15
+        (sb-ext:exit :code 1)))))
12 16
 
13
-(clone-github-repo "fukamachi" "lack")
14
-(clone-github-repo "fiddlerwoaroof" "data-lens")
15
-(clone-github-repo "fiddlerwoaroof" "cl-todo-backend")
16
-
17
-(ql:quickload :todo-backend)
17
+(build)
18 18
new file mode 100644
... ...
@@ -0,0 +1,17 @@
1
+#.(progn (ql:quickload :legit)
2
+         nil)
3
+
4
+(defun clone-github-repo (user repo)
5
+  (let ((result-dir (merge-pathnames (make-pathname :directory (list :relative
6
+                                                                     "quicklisp" "local-projects"
7
+                                                                     repo)
8
+                                                    :defaults #p"/")
9
+                                     (user-homedir-pathname))))
10
+    (legit:git-clone (format nil "https://github.com/~a/~a.git" user repo)
11
+                     :directory result-dir)))
12
+
13
+(clone-github-repo "fukamachi" "lack")
14
+(clone-github-repo "fiddlerwoaroof" "data-lens")
15
+(asdf:load-asd "/root/todo-backend.asd")
16
+
17
+(ql:quickload (asdf:system-depends-on (asdf:find-system :todo-backend)))
... ...
@@ -3,7 +3,7 @@
3 3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5 5
 <head>
6
-<!-- 2019-08-30 Fri 16:33 -->
6
+<!-- 2019-09-10 Tue 16:30 -->
7 7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8 8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9 9
 <title>TODO backend implementation using CL and fukamachi/ningle</title>
... ...
@@ -300,34 +300,34 @@ for the JavaScript code in this tag.
300 300
 <h2>Table of Contents</h2>
301 301
 <div id="text-table-of-contents">
302 302
 <ul>
303
-<li><a href="#org45f170c">1. Setup</a></li>
304
-<li><a href="#org750f278">2. todo API</a>
303
+<li><a href="#org2c60c2a">1. Setup</a></li>
304
+<li><a href="#org8b48160">2. todo API</a>
305 305
 <ul>
306
-<li><a href="#org47779f4">2.1. List-level APIs</a></li>
307
-<li><a href="#org57d2aea">2.2. Getting/Replacing a todo</a></li>
308
-<li><a href="#orgbf48fa4">2.3. Adding and modifying todos</a></li>
309
-<li><a href="#org87b91ac">2.4. Examples</a></li>
306
+<li><a href="#orgddfdad7">2.1. List-level APIs</a></li>
307
+<li><a href="#orge78579a">2.2. Getting/Replacing a todo</a></li>
308
+<li><a href="#org1d8273a">2.3. Adding and modifying todos</a></li>
309
+<li><a href="#orgd06e313">2.4. Examples</a></li>
310 310
 </ul>
311 311
 </li>
312
-<li><a href="#org6a09bc1">3. Routing</a>
312
+<li><a href="#orgf16a59b">3. Routing</a>
313 313
 <ul>
314
-<li><a href="#org20ffa7f">3.1. Routing utilities</a></li>
315
-<li><a href="#org7bdd028">3.2. todo routes</a></li>
314
+<li><a href="#org8fa2aba">3.1. Routing utilities</a></li>
315
+<li><a href="#org104511b">3.2. todo routes</a></li>
316 316
 </ul>
317 317
 </li>
318
-<li><a href="#orgd46ec32">4. Source</a>
318
+<li><a href="#org27ea61c">4. Source</a>
319 319
 <ul>
320
-<li><a href="#org9c84f34">4.1. model.lisp source code</a></li>
321
-<li><a href="#org76ec19a">4.2. routing.lisp source</a></li>
322
-<li><a href="#org98907a6">4.3. main.lisp source</a></li>
320
+<li><a href="#orgc9b940b">4.1. model.lisp source code</a></li>
321
+<li><a href="#orge55bf4b">4.2. routing.lisp source</a></li>
322
+<li><a href="#org714745a">4.3. main.lisp source</a></li>
323 323
 </ul>
324 324
 </li>
325 325
 </ul>
326 326
 </div>
327 327
 </div>
328 328
 
329
-<div id="outline-container-org45f170c" class="outline-2">
330
-<h2 id="org45f170c"><span class="section-number-2">1</span> Setup</h2>
329
+<div id="outline-container-org2c60c2a" class="outline-2">
330
+<h2 id="org2c60c2a"><span class="section-number-2">1</span> Setup</h2>
331 331
 <div class="outline-text-2" id="text-1">
332 332
 <ul class="org-ul">
333 333
 <li><code class="src src-sh">git clone https://github.com/fiddlerwoaroof/data-lens.git ~/quicklisp/local-projects/data-lens</code></li>
... ...
@@ -347,8 +347,8 @@ After this, all the tests <a href="http://www.todobackend.com/specs/index.html?h
347 347
 </div>
348 348
 </div>
349 349
 
350
-<div id="outline-container-org750f278" class="outline-2">
351
-<h2 id="org750f278"><span class="section-number-2">2</span> todo API</h2>
350
+<div id="outline-container-org8b48160" class="outline-2">
351
+<h2 id="org8b48160"><span class="section-number-2">2</span> todo API</h2>
352 352
 <div class="outline-text-2" id="text-2">
353 353
 <p>
354 354
 We use a fairly simple structure for our "database": a fset map (a
... ...
@@ -358,8 +358,8 @@ referenced as <code>*todo*</code>, but this is a detail hidden behind the API.
358 358
 </p>
359 359
 </div>
360 360
 
361
-<div id="outline-container-org47779f4" class="outline-3">
362
-<h3 id="org47779f4"><span class="section-number-3">2.1</span> List-level APIs</h3>
361
+<div id="outline-container-orgddfdad7" class="outline-3">
362
+<h3 id="orgddfdad7"><span class="section-number-3">2.1</span> List-level APIs</h3>
363 363
 <div class="outline-text-3" id="text-2-1">
364 364
 <p>
365 365
 These are functions for getting the todo list and clearing
... ...
@@ -368,7 +368,7 @@ and <code>clear-todos</code> for DELETE requests.
368 368
 </p>
369 369
 
370 370
 <div class="org-src-container">
371
-<pre class="src src-lisp" id="orgc8a4ff2"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todos</span> <span style="color: #93a8c6;">()</span>
371
+<pre class="src src-lisp" id="org2fa86a6"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todos</span> <span style="color: #93a8c6;">()</span>
372 372
   <span style="color: #93a8c6;">(</span>gmap:gmap <span style="font-weight: bold;">:seq</span>
373 373
              <span style="color: #b0b1a3;">(</span><span style="color: #F0DFAF;">lambda</span> <span style="color: #97b098;">(</span>_ b<span style="color: #97b098;">)</span>
374 374
                <span style="color: #97b098;">(</span><span style="color: #F0DFAF;">declare</span> <span style="color: #aebed8;">(</span>ignore _<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
... ...
@@ -383,8 +383,8 @@ and <code>clear-todos</code> for DELETE requests.
383 383
 </div>
384 384
 </div>
385 385
 
386
-<div id="outline-container-org57d2aea" class="outline-3">
387
-<h3 id="org57d2aea"><span class="section-number-3">2.2</span> Getting/Replacing a todo</h3>
386
+<div id="outline-container-orge78579a" class="outline-3">
387
+<h3 id="orge78579a"><span class="section-number-3">2.2</span> Getting/Replacing a todo</h3>
388 388
 <div class="outline-text-3" id="text-2-2">
389 389
 <p>
390 390
 This uses lisp's <a href="http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm">generalized references</a> to abstract away the
... ...
@@ -394,7 +394,7 @@ the GET request for a specific todo by id.
394 394
 </p>
395 395
 
396 396
 <div class="org-src-container">
397
-<pre class="src src-lisp" id="org404baac"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todo</span> <span style="color: #93a8c6;">(</span>id<span style="color: #93a8c6;">)</span>
397
+<pre class="src src-lisp" id="orge96683a"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todo</span> <span style="color: #93a8c6;">(</span>id<span style="color: #93a8c6;">)</span>
398 398
   <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">let</span> <span style="color: #b0b1a3;">(</span><span style="color: #97b098;">(</span>todo <span style="color: #aebed8;">(</span>fset:@ *todos* id<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span>
399 399
     todo<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
400 400
 
... ...
@@ -410,8 +410,8 @@ the GET request for a specific todo by id.
410 410
 </div>
411 411
 </div>
412 412
 
413
-<div id="outline-container-orgbf48fa4" class="outline-3">
414
-<h3 id="orgbf48fa4"><span class="section-number-3">2.3</span> Adding and modifying todos</h3>
413
+<div id="outline-container-org1d8273a" class="outline-3">
414
+<h3 id="org1d8273a"><span class="section-number-3">2.3</span> Adding and modifying todos</h3>
415 415
 <div class="outline-text-3" id="text-2-3">
416 416
 <p>
417 417
 <code>new-todo</code> is fairly trivial. It's main feature is that it has to
... ...
@@ -421,7 +421,7 @@ properly. <code>new-todo</code> backs POST requests to the root endpoint.
421 421
 </p>
422 422
 
423 423
 <div class="org-src-container">
424
-<pre class="src src-lisp" id="orgc417af0"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-host*</span>
424
+<pre class="src src-lisp" id="orgf6c3a44"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-host*</span>
425 425
   <span style="color: #D0BF8F;">"localhost"</span><span style="color: #8c8c8c;">)</span>
426 426
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-port*</span>
427 427
   5000<span style="color: #8c8c8c;">)</span>
... ...
@@ -450,7 +450,7 @@ todo endpoint for a specific ID.
450 450
 </p>
451 451
 
452 452
 <div class="org-src-container">
453
-<pre class="src src-lisp" id="orga2be00f"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">update-todo</span> <span style="color: #93a8c6;">(</span>id v<span style="color: #93a8c6;">)</span>
453
+<pre class="src src-lisp" id="org0a1e71e"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">update-todo</span> <span style="color: #93a8c6;">(</span>id v<span style="color: #93a8c6;">)</span>
454 454
   <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">let*</span> <span style="color: #b0b1a3;">(</span><span style="color: #97b098;">(</span>old-todo <span style="color: #aebed8;">(</span>or <span style="color: #b0b0b3;">(</span>todo id<span style="color: #b0b0b3;">)</span>
455 455
                        <span style="color: #b0b0b3;">(</span>make-hash-table <span style="font-weight: bold;">:test</span> 'equal<span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
456 456
          <span style="color: #97b098;">(</span>in-hash-table <span style="color: #aebed8;">(</span>alexandria:alist-hash-table v <span style="font-weight: bold;">:test</span> 'equal<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
... ...
@@ -465,8 +465,8 @@ todo endpoint for a specific ID.
465 465
 </div>
466 466
 </div>
467 467
 
468
-<div id="outline-container-org87b91ac" class="outline-3">
469
-<h3 id="org87b91ac"><span class="section-number-3">2.4</span> Examples</h3>
468
+<div id="outline-container-orgd06e313" class="outline-3">
469
+<h3 id="orgd06e313"><span class="section-number-3">2.4</span> Examples</h3>
470 470
 <div class="outline-text-3" id="text-2-4">
471 471
 <div class="org-src-container">
472 472
 <pre class="src src-lisp"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">in-package</span> <span style="font-weight: bold;">:fwoar.todo</span><span style="color: #8c8c8c;">)</span>
... ...
@@ -481,10 +481,10 @@ todo endpoint for a specific ID.
481 481
 </div>
482 482
 
483 483
 <pre class="example">
484
-(#&lt;hash-table "url": "http://localhost:5000/todo/175",
484
+(#&lt;hash-table "url": "http://localhost:5000/todo/9",
485 485
               "title": "get groceries",
486 486
               "completed": YASON:FALSE&gt;
487
- #&lt;hash-table "url": "http://localhost:5000/todo/176",
487
+ #&lt;hash-table "url": "http://localhost:5000/todo/10",
488 488
               "title": "write-better-documentation",
489 489
               "completed": YASON:FALSE&gt;)
490 490
 </pre>
... ...
@@ -493,12 +493,12 @@ todo endpoint for a specific ID.
493 493
 </div>
494 494
 
495 495
 
496
-<div id="outline-container-org6a09bc1" class="outline-2">
497
-<h2 id="org6a09bc1"><span class="section-number-2">3</span> Routing</h2>
496
+<div id="outline-container-orgf16a59b" class="outline-2">
497
+<h2 id="orgf16a59b"><span class="section-number-2">3</span> Routing</h2>
498 498
 <div class="outline-text-2" id="text-3">
499 499
 </div>
500
-<div id="outline-container-org20ffa7f" class="outline-3">
501
-<h3 id="org20ffa7f"><span class="section-number-3">3.1</span> Routing utilities</h3>
500
+<div id="outline-container-org8fa2aba" class="outline-3">
501
+<h3 id="org8fa2aba"><span class="section-number-3">3.1</span> Routing utilities</h3>
502 502
 <div class="outline-text-3" id="text-3-1">
503 503
 <p>
504 504
 The core utility here is the <code>defroutes</code> macro.  This takes a
... ...
@@ -508,13 +508,13 @@ routes.
508 508
 </p>
509 509
 
510 510
 <div class="org-src-container">
511
-<pre class="src src-lisp" id="org95e4a72"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">defroutes</span> <span style="color: #93a8c6;">(</span>app <span style="color: #CC9393;">&amp;body</span> routes<span style="color: #93a8c6;">)</span>
511
+<pre class="src src-lisp" id="org2c1405a"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">defroutes</span> <span style="color: #93a8c6;">(</span>app <span style="color: #CC9393;">&amp;body</span> routes<span style="color: #93a8c6;">)</span>
512 512
   <span style="color: #93a8c6;">(</span>alexandria:once-only <span style="color: #b0b1a3;">(</span>app<span style="color: #b0b1a3;">)</span>
513 513
     `<span style="color: #b0b1a3;">(</span>setf
514 514
       ,@<span style="color: #97b098;">(</span><span style="color: #F0DFAF;">loop</span> for <span style="color: #aebed8;">(</span>target . descriptors<span style="color: #aebed8;">)</span> in routes
515 515
               append <span style="color: #aebed8;">(</span><span style="color: #F0DFAF;">loop</span> for <span style="color: #b0b0b3;">(</span>method callback<span style="color: #b0b0b3;">)</span> in descriptors
516 516
                            append `<span style="color: #b0b0b3;">(</span><span style="color: #90a890;">(</span>ningle:route ,app ,target
517
-                                                  <span style="font-weight: bold;">:method</span> method<span style="color: #90a890;">)</span>
517
+                                                  <span style="font-weight: bold;">:method</span> ,method<span style="color: #90a890;">)</span>
518 518
                                     ,callback<span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
519 519
 </pre>
520 520
 </div>
... ...
@@ -537,19 +537,13 @@ a list of verbs <code>(:GET :POST)</code> in the head of each handler clause.
537 537
 
538 538
 
539 539
 <pre class="example">
540
-(LET ((#:APP1882 APP))
541
-  (SETF (NINGLE/APP:ROUTE #:APP1882 "/" :METHOD METHOD)
542
-          (HANDLER NIL
543
-            (TODOS))
544
-        (NINGLE/APP:ROUTE #:APP1882 "/" :METHOD METHOD)
545
-          (HANDLER (V)
546
-            (NEW-TODO V))
547
-        (NINGLE/APP:ROUTE #:APP1882 "/" :METHOD METHOD)
548
-          (HANDLER NIL
549
-            (CLEAR-TODOS))))
550
-T
540
+(DEFROUTES APP
541
+ ("/" (:GET (HANDLER NIL (TODOS))) (:POST (HANDLER (V) (NEW-TODO V)))
542
+  (:DELETE (HANDLER NIL (CLEAR-TODOS)))))
543
+NIL
551 544
 </pre>
552 545
 
546
+
553 547
 <p>
554 548
 Finally, there are some simple helpers to handle some of the
555 549
 boilerplate in a clack webserver.  Of particular interest is the
... ...
@@ -558,7 +552,7 @@ that all the API results get JSON encoded.
558 552
 </p>
559 553
 
560 554
 <div class="org-src-container">
561
-<pre class="src src-lisp" id="orgb9cfd08"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">success</span> <span style="color: #93a8c6;">(</span>value<span style="color: #93a8c6;">)</span>
555
+<pre class="src src-lisp" id="orgd63e2a0"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">success</span> <span style="color: #93a8c6;">(</span>value<span style="color: #93a8c6;">)</span>
562 556
   <span style="color: #93a8c6;">(</span>list 200 '<span style="color: #b0b1a3;">(</span><span style="font-weight: bold;">:conent-type</span> <span style="color: #D0BF8F;">"application/json"</span><span style="color: #b0b1a3;">)</span> value<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
563 557
 
564 558
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">handler</span> <span style="color: #93a8c6;">(</span><span style="color: #b0b1a3;">(</span><span style="color: #CC9393;">&amp;optional</span> <span style="color: #97b098;">(</span>sym <span style="color: #aebed8;">(</span>gensym <span style="color: #D0BF8F;">"PARAMS"</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span> <span style="color: #CC9393;">&amp;body</span> body<span style="color: #93a8c6;">)</span>
... ...
@@ -572,8 +566,8 @@ that all the API results get JSON encoded.
572 566
 </div>
573 567
 </div>
574 568
 
575
-<div id="outline-container-org7bdd028" class="outline-3">
576
-<h3 id="org7bdd028"><span class="section-number-3">3.2</span> todo routes</h3>
569
+<div id="outline-container-org104511b" class="outline-3">
570
+<h3 id="org104511b"><span class="section-number-3">3.2</span> todo routes</h3>
577 571
 <div class="outline-text-3" id="text-3-2">
578 572
 <p>
579 573
 <code>setup-routes</code> binds the endpoints to handlers: <code>"/"</code> to handlers
... ...
@@ -585,7 +579,7 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
585 579
 </p>
586 580
 
587 581
 <div class="org-src-container">
588
-<pre class="src src-lisp" id="org1538a61"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">routing</span>
582
+<pre class="src src-lisp" id="org8c6228c"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">routing</span>
589 583
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">get-id</span> <span style="color: #93a8c6;">(</span>params<span style="color: #93a8c6;">)</span>
590 584
   <span style="color: #93a8c6;">(</span>parse-integer <span style="color: #b0b1a3;">(</span>serapeum:assocdr <span style="font-weight: bold;">:id</span> params<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
591 585
 
... ...
@@ -607,12 +601,12 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
607 601
 </div>
608 602
 </div>
609 603
 
610
-<div id="outline-container-orgd46ec32" class="outline-2">
611
-<h2 id="orgd46ec32"><span class="section-number-2">4</span> Source</h2>
604
+<div id="outline-container-org27ea61c" class="outline-2">
605
+<h2 id="org27ea61c"><span class="section-number-2">4</span> Source</h2>
612 606
 <div class="outline-text-2" id="text-4">
613 607
 </div>
614
-<div id="outline-container-org9c84f34" class="outline-3">
615
-<h3 id="org9c84f34"><span class="section-number-3">4.1</span> model.lisp source code</h3>
608
+<div id="outline-container-orgc9b940b" class="outline-3">
609
+<h3 id="orgc9b940b"><span class="section-number-3">4.1</span> model.lisp source code</h3>
616 610
 <div class="outline-text-3" id="text-4-1">
617 611
 <div class="org-src-container">
618 612
 <pre class="src src-lisp"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">[[file:~/git_repos/lisp-sandbox/todo/README.org::package-include][package-include]]</span>
... ...
@@ -704,8 +698,8 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
704 698
 </div>
705 699
 </div>
706 700
 
707
-<div id="outline-container-org76ec19a" class="outline-3">
708
-<h3 id="org76ec19a"><span class="section-number-3">4.2</span> routing.lisp source</h3>
701
+<div id="outline-container-orge55bf4b" class="outline-3">
702
+<h3 id="orge55bf4b"><span class="section-number-3">4.2</span> routing.lisp source</h3>
709 703
 <div class="outline-text-3" id="text-4-2">
710 704
 <div class="org-src-container">
711 705
 <pre class="src src-lisp"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">[[file:~/git_repos/lisp-sandbox/todo/README.org::package-include][package-include]]</span>
... ...
@@ -720,7 +714,7 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
720 714
       ,@<span style="color: #97b098;">(</span><span style="color: #F0DFAF;">loop</span> for <span style="color: #aebed8;">(</span>target . descriptors<span style="color: #aebed8;">)</span> in routes
721 715
               append <span style="color: #aebed8;">(</span><span style="color: #F0DFAF;">loop</span> for <span style="color: #b0b0b3;">(</span>method callback<span style="color: #b0b0b3;">)</span> in descriptors
722 716
                            append `<span style="color: #b0b0b3;">(</span><span style="color: #90a890;">(</span>ningle:route ,app ,target
723
-                                                  <span style="font-weight: bold;">:method</span> method<span style="color: #90a890;">)</span>
717
+                                                  <span style="font-weight: bold;">:method</span> ,method<span style="color: #90a890;">)</span>
724 718
                                     ,callback<span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
725 719
 <span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">defroutes ends here</span>
726 720
 
... ...
@@ -759,8 +753,8 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
759 753
 </div>
760 754
 </div>
761 755
 
762
-<div id="outline-container-org98907a6" class="outline-3">
763
-<h3 id="org98907a6"><span class="section-number-3">4.3</span> main.lisp source</h3>
756
+<div id="outline-container-org714745a" class="outline-3">
757
+<h3 id="org714745a"><span class="section-number-3">4.3</span> main.lisp source</h3>
764 758
 <div class="outline-text-3" id="text-4-3">
765 759
 <div class="org-src-container">
766 760
 <pre class="src src-lisp"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">in-package</span> <span style="font-weight: bold;">:fwoar.todo</span><span style="color: #8c8c8c;">)</span>
... ...
@@ -776,8 +770,8 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
776 770
   <span style="color: #93a8c6;">(</span>and <span style="color: #b0b1a3;">(</span>boundp '*handler*<span style="color: #b0b1a3;">)</span>
777 771
        *handler*<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
778 772
 
779
-<span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">ensure-started</span> <span style="color: #93a8c6;">(</span><span style="color: #CC9393;">&amp;rest</span> r <span style="color: #CC9393;">&amp;key</span> port<span style="color: #93a8c6;">)</span>
780
-  <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">declare</span> <span style="color: #b0b1a3;">(</span>ignore port<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span>
773
+<span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">ensure-started</span> <span style="color: #93a8c6;">(</span><span style="color: #CC9393;">&amp;rest</span> r <span style="color: #CC9393;">&amp;key</span> <span style="color: #b0b1a3;">(</span>address <span style="color: #D0BF8F;">"127.0.0.1"</span><span style="color: #b0b1a3;">)</span> <span style="color: #b0b1a3;">(</span>port 5000<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span>
774
+  <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">declare</span> <span style="color: #b0b1a3;">(</span>ignore address port<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span>
781 775
   <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">let</span> <span style="color: #b0b1a3;">(</span><span style="color: #97b098;">(</span>app <span style="color: #aebed8;">(</span>setup<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span>
782 776
     <span style="color: #b0b1a3;">(</span>values app
783 777
             <span style="color: #97b098;">(</span>setf *handler*
... ...
@@ -798,6 +792,11 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
798 792
         <span style="color: #97b098;">(</span>makunbound '*handler*<span style="color: #97b098;">)</span>
799 793
         nil<span style="color: #b0b1a3;">)</span>
800 794
       nil<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
795
+
796
+<span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">main</span> <span style="color: #93a8c6;">(</span><span style="color: #CC9393;">&amp;rest</span> _<span style="color: #93a8c6;">)</span>
797
+  <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">declare</span> <span style="color: #b0b1a3;">(</span>ignore _<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span>
798
+  <span style="color: #93a8c6;">(</span>ensure-started <span style="font-weight: bold;">:address</span> <span style="color: #D0BF8F;">"0.0.0.0"</span> <span style="font-weight: bold;">:port</span> 5000<span style="color: #93a8c6;">)</span>
799
+  <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">loop</span> <span style="color: #b0b1a3;">(</span>sleep 5<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
801 800
 </pre>
802 801
 </div>
803 802
 </div>
... ...
@@ -806,7 +805,7 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
806 805
 </div>
807 806
 <div id="postamble" class="status">
808 807
 <p class="author">Author: Langley</p>
809
-<p class="date">Created: 2019-08-30 Fri 16:33</p>
808
+<p class="date">Created: 2019-09-10 Tue 16:30</p>
810 809
 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
811 810
 </div>
812 811
 </body>
... ...
@@ -11,8 +11,8 @@
11 11
   (and (boundp '*handler*)
12 12
        *handler*))
13 13
 
14
-(defun ensure-started (&rest r &key port)
15
-  (declare (ignore port))
14
+(defun ensure-started (&rest r &key (address "127.0.0.1") (port 5000))
15
+  (declare (ignore address port))
16 16
   (let ((app (setup)))
17 17
     (values app
18 18
             (setf *handler*
... ...
@@ -33,3 +33,8 @@
33 33
         (makunbound '*handler*)
34 34
         nil)
35 35
       nil))
36
+
37
+(defun main (&rest _)
38
+  (declare (ignore _))
39
+  (ensure-started :address "0.0.0.0" :port 5000)
40
+  (loop (sleep 5)))
... ...
@@ -9,4 +9,4 @@
9 9
 
10 10
 (defpackage :fwoar.todo
11 11
   (:use :cl)
12
-  (:export ))
12
+  (:export #:main))
... ...
@@ -11,7 +11,7 @@
11 11
       ,@(loop for (target . descriptors) in routes
12 12
               append (loop for (method callback) in descriptors
13 13
                            append `((ningle:route ,app ,target
14
-                                                  :method method)
14
+                                                  :method ,method)
15 15
                                     ,callback))))))
16 16
 ;; defroutes ends here
17 17