]> gitweb.factorcode.org Git - factor.git/commitdiff
Furnace cleanup
authorSlava Pestov <slava@factorcode.org>
Thu, 6 Dec 2007 06:06:44 +0000 (01:06 -0500)
committerSlava Pestov <slava@factorcode.org>
Thu, 6 Dec 2007 06:06:44 +0000 (01:06 -0500)
15 files changed:
extra/furnace/furnace.factor
extra/furnace/scaffold/crud-templates/edit.furnace [deleted file]
extra/furnace/scaffold/crud-templates/list.furnace [deleted file]
extra/furnace/scaffold/crud-templates/show.furnace [deleted file]
extra/furnace/scaffold/scaffold.factor [deleted file]
extra/webapps/article-manager/article-manager.factor
extra/webapps/article-manager/furnace/article.furnace
extra/webapps/article-manager/furnace/index.furnace
extra/webapps/article-manager/furnace/navigation.furnace
extra/webapps/article-manager/furnace/tag.furnace
extra/webapps/fjsc/fjsc.factor
unmaintained/scaffold/crud-templates/edit.furnace [new file with mode: 0644]
unmaintained/scaffold/crud-templates/list.furnace [new file with mode: 0644]
unmaintained/scaffold/crud-templates/show.furnace [new file with mode: 0644]
unmaintained/scaffold/scaffold.factor [new file with mode: 0644]

index 076b5061121694e6d99a9dfdf5209ef44347b764..756fa13d1c52acc5101131976389a0e58949febc 100644 (file)
@@ -5,7 +5,7 @@ USING: kernel vectors io assocs quotations splitting strings
        continuations tuples classes io.files 
        http http.server.templating http.basic-authentication 
        webapps.callback html html.elements 
-       http.server.responders furnace.validator ;
+       http.server.responders furnace.validator vocabs ;
 IN: furnace
 
 SYMBOL: default-action
@@ -101,6 +101,10 @@ SYMBOL: request-params
 
 : service-post ( url -- ) "response" get swap service-request ;
 
+: send-resource ( name -- )
+    template-path get swap path+ resource-path <file-reader>
+    stdio get stream-copy ;
+
 : render-template ( template -- )
     template-path get swap path+
     ".furnace" append resource-path
@@ -130,19 +134,7 @@ SYMBOL: model
 : render-component ( model template -- )
     swap [ render-template ] with-slots ;
 
-! Deprecated stuff
-
-: render-page* ( model body-template head-template -- )
-    [
-        [ render-component ] [ f rot render-component ] html-document 
-    ] serve-html ;
-
-: render-titled-page* ( model body-template head-template title -- )
-    [ 
-        [ render-component ] swap [ <title> write </title> f rot render-component ] curry html-document
-    ] serve-html ;
-
-: render-page ( model template title -- )
-    [
-        [ render-component ] simple-html-document
-    ] serve-html ;
+: browse-webapp-source ( vocab -- )
+    <a f >vocab-link browser-link-href =href a>
+        "Browse source" write
+    </a> ;
diff --git a/extra/furnace/scaffold/crud-templates/edit.furnace b/extra/furnace/scaffold/crud-templates/edit.furnace
deleted file mode 100644 (file)
index 249ad0a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<% USING: namespaces io kernel furnace words prettyprint
-generic sequences parser ; %>
-
-<% "model" get %>
-
-<form action="<% dup class dup word-vocabulary use+ unparse write %>-update" method="post">
-
-<% dup crud-index [ %>
-
-<input type="hidden" name="crud-index" value="<% write %>"/>
-
-<% ] when* %>
-
-<table>
-
-<% dup tuple-slots swap class "slot-names" word-prop [ %> <tr><td><% dup write %>:</td>
-    <td><input type="text" name="<% write %>" value="<% write %>"/></td></tr><% ] 2each %>
-    
-</table>
-<input type="submit" name="submit" value="submit"/>
-</form>
\ No newline at end of file
diff --git a/extra/furnace/scaffold/crud-templates/list.furnace b/extra/furnace/scaffold/crud-templates/list.furnace
deleted file mode 100644 (file)
index a472f29..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<% USING: namespaces kernel io sequences generic words
-prettyprint furnace parser ; %>
-
-<% "model" get dup sequence? not [ unparse %>
-<p><a href="<% write %>-new">New</a></p><% ] [ %>
-
-<p><a href="<% first class unparse write %>-new">New</a></p>
-
-<table>
-<% "model" get dup first class dup
-    word-vocabulary use+ "slot-names" word-prop %>
-<tr><% [ %><th><% write %></th><% ] each %></tr>
-
-<% [ %>
-    
-<tr><% dup tuple-slots [ %><td><% write %></td><% ] each %>
-    
-    <% dup crud-index swap class dup "crud-index" word-prop swap unparse %>
-    <td><a href="<% 3dup write %>-show?<% write %>=<% write %>">Show</a></td>
-    <td><a href="<% 3dup write %>-edit?<% write %>=<% write %>">Edit</a></td>
-    <td><a href="<% write %>-delete?<% write %>=<% write %>">Delete</a></td></tr>
-
-<% ] each %>
-
-</table>
-
-<% ] if %>
\ No newline at end of file
diff --git a/extra/furnace/scaffold/crud-templates/show.furnace b/extra/furnace/scaffold/crud-templates/show.furnace
deleted file mode 100644 (file)
index 3500f24..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<% USING: namespaces io kernel words generic sequences 
-prettyprint furnace parser ; %>
-
-<% "model" get [ %>
-
-<% dup tuple-slots over class dup
-    word-vocabulary use+ "slot-names" word-prop %>
-
-<table>
-    
-<% [ %><tr><td><% write %>:</td><td><% write %></td></tr><% ] 2each %>
-
-</table>
-
-<% dup crud-index swap class dup "crud-index" word-prop swap unparse %>
-<p><a href="<% 3dup write %>-edit?<% write %>=<% write %>">Edit</a> |
-    <a href="<% [ write %>-delete?<% write %>=<% write  ] keep %>">Delete</a> |
-    <a href="<% dup write %>-new">New</a> | <a href="<% write %>-list">List</a></p>
-
-<% ] [ %><p>No such tuple</p><% ] if* %>
\ No newline at end of file
diff --git a/extra/furnace/scaffold/scaffold.factor b/extra/furnace/scaffold/scaffold.factor
deleted file mode 100644 (file)
index f0c2850..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-USING: http.server help.markup help.syntax kernel prettyprint
-sequences parser namespaces words classes math tuples.private
-quotations arrays strings ;
-
-IN: furnace
-
-TUPLE: furnace-model model ;
-C: <furnace-model> furnace-model
-
-HELP: furnace-model "This definition exists to circumvent a limitation in furnace with regard to sending arbitrary objects as models to .furnace templates." ;
-
-: crud-create ( class string -- word )
-    swap unparse "-" rot 3append in get create ;
-
-HELP: crud-create
-{ $values { "class" class } { "string" string } { "word" word } }
-{ $description "A CRUD utility function - creates a new action word for a given class and suffix string" } ;
-
-: crud-word ( class string -- word )
-    swap unparse "-" rot 3append parse first ;
-HELP: crud-word
-{ $values { "class" class } { "string" string } { "word" word } }
-{ $description "A CRUD utility function - looks up a word that has been crud-created" } ;
-
-: crud-index ( tuple -- )
-    dup class dup "crud-index" word-prop crud-word execute ;
-
-: crud-lookup ( string class -- obj )
-    get-global [ crud-index = ] curry* subset
-    dup empty? [ drop f ] [ first ] if ;
-HELP: crud-lookup
-{ $values { "string" string } { "class" class } { "obj" object } }
-{ $description "A CRUD utility function - looks up an object in the store by the pre-designated index." } ;
-
-: crud-lookup* ( string class -- tuple )
-    tuck crud-lookup
-    [ ] [ dup "slot-names" word-prop length 2 + <tuple> ] ?if ;
-
-HELP: crud-lookup*
-{ $values { "string" string } { "class" class } { "tuple" tuple } }
-"A CRUD utility function - same as crud-lookup, but always returns a tuple of the given class.  When the lookup fails, returns a tuple of the given class with all slots set to f." ;
-
-: crud-page ( model template title -- )
-    [ "libs/furnace/crud-templates" template-path set render-page ]
-    with-scope ;
-
-: define-list ( class -- word )
-    dup "list" crud-create swap
-    [ dup get-global dup empty? -rot ? <furnace-model> "list" "List" crud-page ]
-    curry dupd define-compound ;
-
-: define-show ( class -- word )
-    dup "show" crud-create swap
-    [ crud-lookup <furnace-model> "show" "Show" crud-page ] 
-    curry dupd define-compound ;
-
-: define-edit ( class -- word )
-    dup "edit" crud-create swap
-    [ crud-lookup* <furnace-model> "edit" "Edit" crud-page ] 
-    curry dupd define-compound ;
-    
-: define-new ( class -- word )
-    dup "new" crud-create swap "edit" crud-word
-    [ f swap execute ]
-    curry dupd define-compound ;
-    
-: define-update ( class -- word )
-    dup "update" crud-create swap
-    [ 
-        tuck crud-lookup [ over get-global remove over set-global ] when* 
-        dup >r "constructor" word-prop execute
-        r> 2dup get-global swap add over set-global swap
-        crud-index swap "show" crud-word execute
-    ] curry dupd define-compound ;
-
-: define-delete ( class -- word )
-    dup "delete" crud-create swap
-    [ 
-        tuck crud-lookup [ over get-global remove over set-global ] when* 
-        "list" crud-word execute
-    ] curry dupd define-compound ;
-
-: define-lookup ( class -- )
-    dup "crud-index" word-prop ">" pick unparse 3append in get create
-    swap [ crud-lookup ] curry define-compound ;
-
-: define-lookup* ( class -- )
-    dup "crud-index" word-prop ">" pick unparse "*" append 3append 
-    in get create swap [ crud-lookup* ] curry define-compound ;
-
-: scaffold-params ( class -- array )
-    "crud-index" word-prop 1array 1array ;
-
-: scaffold ( class index realm -- )
-    -rot dupd "crud-index" set-word-prop
-    [ define-lookup ] keep [ define-lookup* ] keep
-    [ get-global [ { } over set-global ] unless ] keep
-    [ define-list { } rot define-authenticated-action ] 2keep
-    [ dup define-show swap scaffold-params rot 
-        define-authenticated-action ] 2keep
-    [ dup define-edit swap scaffold-params rot
-        define-authenticated-action ] 2keep
-    [ define-new { } rot define-authenticated-action ] 2keep
-    [ dup define-update swap "slot-names" word-prop 
-        "crud-index" add [ 1array ] map rot 
-        define-authenticated-action ] 2keep
-    dup define-delete swap scaffold-params rot
-    define-authenticated-action ;
-
-HELP: scaffold
-{ $values { "class" class } { "index" "an index" } { "realm" "a realm" } }
-"If realm is not f, then realm is used as the basic authentication realm for the scaffolding actions." ;
-
-ARTICLE: { "furnace" "crud" } "CRUD Scaffolding"
-{ $code 
-    "\"libs/furnace\" require"
-    "USING: furnace httpd threads ;"
-    "IN: furnace:crud-example"
-    "TUPLE: foo bar baz ;"
-    "\"crud-example\" \"foo-list\" f web-app"
-    "foo \"bar\" f scaffold"
-    "[ 8888 httpd ] in-thread"
-} ;
\ No newline at end of file
index cb999818d236da3bf1380d0cd2329885d7b123b8..66e7faff9493630789e9f69fcc1021fbb2044764 100644 (file)
@@ -4,12 +4,17 @@
 USING: kernel furnace sqlite.tuple-db webapps.article-manager.database 
        sequences namespaces math arrays assocs quotations io.files
        http.server http.basic-authentication http.server.responders 
-       webapps.file ;
+       webapps.file html html.elements io ;
 IN: webapps.article-manager
 
 : current-site ( -- site )
   host get-site* ;
 
+: render-titled-page* ( model body-template head-template title -- )
+  [ 
+      [ render-component ] swap [ <title> write </title> f rot render-component ] curry html-document
+  ] serve-html ;
+
 TUPLE: template-args arg1 ;
   
 C: <template-args> template-args
index f0647aa44225dd232f6b5010515e42dac8eb5ecc..c3a19263be484af5d7c35761da26436bff6f9a7a 100644 (file)
@@ -1,12 +1,12 @@
 <% USING: kernel io http.server namespaces sequences math html.elements random furnace webapps.article-manager webapps.article-manager.database html.elements ; %>
     <div id="banner"><h1><% "arg1" get second article-title write %></h1></div>
-    <% "navigation" render-template %>
+    <% "navigation" render-template %>
     <div id="article">
     <% 100 random 25 > [ "arg1" get first 100 random 50 > [ site-ad2 ] [ site-ad3 ] if write-html ] when %>
     <% "arg1" get second article-body write-html %>
 
        <h1>Tags</h1>
-        <% "arg1" get second tags-for-article <template-args> "tags" render-template %>
+        <% "arg1" get second tags-for-article <template-args> "tags" render-component %>
 </div>
 <p class="footer"></p>
 <p id="copyright"><% "arg1" get first site-footer write %></p>
index ae8963c3b068e2be619ac68bd64f4d7588e4cb7d..da48d324cc6d938c0e55bf22dc5f3ab480b3e1f2 100644 (file)
@@ -6,7 +6,7 @@
 </head>
     <body>
        <div id="banner"><h1><% "title" get write %></h1></div>
-    <% "navigation" render-template %>
+    <% "navigation" render-template %>
 <div id="article">
   <% "intro" get write-html %>
     <h1>Recent Articles</h1>
@@ -23,7 +23,7 @@
            but in the meantime, Google is likely to provide
            reasonable results.
        </p>
-        <% host all-tags <template-args> "tags" render-template %>
+        <% host all-tags <template-args> "tags" render-component %>
 </div>
 <p class="footer"></p>
 <p id="copyright"><% "footer" get write %></p>
index 33fb29914e92d218d8af3bb9a4f5f7136d4f78ea..b42a384ca1a45489b1977504304f74ff802c61fc 100644 (file)
@@ -5,5 +5,5 @@
     </ul>
     <% current-site site-ad1 write-html %>
     <h1>Tags</h1>
-    <% host all-tags <template-args> "tags" render-template %>
+    <% host all-tags <template-args> "tags" render-component %>
     </div>
index a778deb9be08004265163393c5d2d296d7f38120..4e04196097c81dec06a7ba0c7cd773ac97b18e26 100644 (file)
@@ -1,7 +1,7 @@
 <% USING: kernel io http.server namespaces sequences math html furnace webapps.article-manager.database webapps.article-manager html.elements ; %>
 
        <div id="banner"><h1><% "arg1" get second tag-title write %></h1></div>
-    <% f "navigation" render-template %>
+    <% "navigation" render-component %>
        <div id="article">
        <h1><% "arg1" get second tag-title write %></h1>
         <% "arg1" get second tag-description write-html %>
index bede8846c1d02b4ed46cd447e6d67d9461a37ad5..b21e91bc8fb1bd5a872032a3b9e641dd4e49f3de 100755 (executable)
@@ -4,7 +4,7 @@
 USING: kernel furnace fjsc  parser-combinators namespaces
        lazy-lists io io.files furnace.validator sequences
        http.client http.server http.server.responders
-       webapps.file ;
+       webapps.file html ;
 IN: webapps.fjsc
 
 : compile ( code -- )
@@ -31,6 +31,11 @@ IN: webapps.fjsc
   { "url" v-required }
 } define-action
 
+: render-page* ( model body-template head-template -- )
+  [
+      [ render-component ] [ f rot render-component ] html-document 
+  ] serve-html ;
+
 : repl ( -- )
   #! The main 'repl' page.
   f "repl" "head" render-page* ;
diff --git a/unmaintained/scaffold/crud-templates/edit.furnace b/unmaintained/scaffold/crud-templates/edit.furnace
new file mode 100644 (file)
index 0000000..249ad0a
--- /dev/null
@@ -0,0 +1,21 @@
+<% USING: namespaces io kernel furnace words prettyprint
+generic sequences parser ; %>
+
+<% "model" get %>
+
+<form action="<% dup class dup word-vocabulary use+ unparse write %>-update" method="post">
+
+<% dup crud-index [ %>
+
+<input type="hidden" name="crud-index" value="<% write %>"/>
+
+<% ] when* %>
+
+<table>
+
+<% dup tuple-slots swap class "slot-names" word-prop [ %> <tr><td><% dup write %>:</td>
+    <td><input type="text" name="<% write %>" value="<% write %>"/></td></tr><% ] 2each %>
+    
+</table>
+<input type="submit" name="submit" value="submit"/>
+</form>
\ No newline at end of file
diff --git a/unmaintained/scaffold/crud-templates/list.furnace b/unmaintained/scaffold/crud-templates/list.furnace
new file mode 100644 (file)
index 0000000..a472f29
--- /dev/null
@@ -0,0 +1,27 @@
+<% USING: namespaces kernel io sequences generic words
+prettyprint furnace parser ; %>
+
+<% "model" get dup sequence? not [ unparse %>
+<p><a href="<% write %>-new">New</a></p><% ] [ %>
+
+<p><a href="<% first class unparse write %>-new">New</a></p>
+
+<table>
+<% "model" get dup first class dup
+    word-vocabulary use+ "slot-names" word-prop %>
+<tr><% [ %><th><% write %></th><% ] each %></tr>
+
+<% [ %>
+    
+<tr><% dup tuple-slots [ %><td><% write %></td><% ] each %>
+    
+    <% dup crud-index swap class dup "crud-index" word-prop swap unparse %>
+    <td><a href="<% 3dup write %>-show?<% write %>=<% write %>">Show</a></td>
+    <td><a href="<% 3dup write %>-edit?<% write %>=<% write %>">Edit</a></td>
+    <td><a href="<% write %>-delete?<% write %>=<% write %>">Delete</a></td></tr>
+
+<% ] each %>
+
+</table>
+
+<% ] if %>
\ No newline at end of file
diff --git a/unmaintained/scaffold/crud-templates/show.furnace b/unmaintained/scaffold/crud-templates/show.furnace
new file mode 100644 (file)
index 0000000..3500f24
--- /dev/null
@@ -0,0 +1,20 @@
+<% USING: namespaces io kernel words generic sequences 
+prettyprint furnace parser ; %>
+
+<% "model" get [ %>
+
+<% dup tuple-slots over class dup
+    word-vocabulary use+ "slot-names" word-prop %>
+
+<table>
+    
+<% [ %><tr><td><% write %>:</td><td><% write %></td></tr><% ] 2each %>
+
+</table>
+
+<% dup crud-index swap class dup "crud-index" word-prop swap unparse %>
+<p><a href="<% 3dup write %>-edit?<% write %>=<% write %>">Edit</a> |
+    <a href="<% [ write %>-delete?<% write %>=<% write  ] keep %>">Delete</a> |
+    <a href="<% dup write %>-new">New</a> | <a href="<% write %>-list">List</a></p>
+
+<% ] [ %><p>No such tuple</p><% ] if* %>
\ No newline at end of file
diff --git a/unmaintained/scaffold/scaffold.factor b/unmaintained/scaffold/scaffold.factor
new file mode 100644 (file)
index 0000000..e74374c
--- /dev/null
@@ -0,0 +1,128 @@
+USING: http.server help.markup help.syntax kernel prettyprint
+sequences parser namespaces words classes math tuples.private
+quotations arrays strings ;
+
+IN: furnace.scaffold
+
+TUPLE: furnace-model model ;
+C: <furnace-model> furnace-model
+
+HELP: furnace-model "This definition exists to circumvent a limitation in furnace with regard to sending arbitrary objects as models to .furnace templates." ;
+
+: crud-create ( class string -- word )
+    swap unparse "-" rot 3append in get create ;
+
+HELP: crud-create
+{ $values { "class" class } { "string" string } { "word" word } }
+{ $description "A CRUD utility function - creates a new action word for a given class and suffix string" } ;
+
+: crud-word ( class string -- word )
+    swap unparse "-" rot 3append parse first ;
+HELP: crud-word
+{ $values { "class" class } { "string" string } { "word" word } }
+{ $description "A CRUD utility function - looks up a word that has been crud-created" } ;
+
+: crud-index ( tuple -- )
+    dup class dup "crud-index" word-prop crud-word execute ;
+
+: crud-lookup ( string class -- obj )
+    get-global [ crud-index = ] curry* subset
+    dup empty? [ drop f ] [ first ] if ;
+HELP: crud-lookup
+{ $values { "string" string } { "class" class } { "obj" object } }
+{ $description "A CRUD utility function - looks up an object in the store by the pre-designated index." } ;
+
+: crud-lookup* ( string class -- tuple )
+    tuck crud-lookup
+    [ ] [ dup "slot-names" word-prop length 2 + <tuple> ] ?if ;
+
+HELP: crud-lookup*
+{ $values { "string" string } { "class" class } { "tuple" tuple } }
+"A CRUD utility function - same as crud-lookup, but always returns a tuple of the given class.  When the lookup fails, returns a tuple of the given class with all slots set to f." ;
+
+: render-page ( model template title -- )
+    [
+        [ render-component ] simple-html-document
+    ] serve-html ;
+
+: crud-page ( model template title -- )
+    [ "libs/furnace/crud-templates" template-path set render-page ]
+    with-scope ;
+
+: define-list ( class -- word )
+    dup "list" crud-create swap
+    [ dup get-global dup empty? -rot ? <furnace-model> "list" "List" crud-page ]
+    curry dupd define-compound ;
+
+: define-show ( class -- word )
+    dup "show" crud-create swap
+    [ crud-lookup <furnace-model> "show" "Show" crud-page ] 
+    curry dupd define-compound ;
+
+: define-edit ( class -- word )
+    dup "edit" crud-create swap
+    [ crud-lookup* <furnace-model> "edit" "Edit" crud-page ] 
+    curry dupd define-compound ;
+    
+: define-new ( class -- word )
+    dup "new" crud-create swap "edit" crud-word
+    [ f swap execute ]
+    curry dupd define-compound ;
+    
+: define-update ( class -- word )
+    dup "update" crud-create swap
+    [ 
+        tuck crud-lookup [ over get-global remove over set-global ] when* 
+        dup >r "constructor" word-prop execute
+        r> 2dup get-global swap add over set-global swap
+        crud-index swap "show" crud-word execute
+    ] curry dupd define-compound ;
+
+: define-delete ( class -- word )
+    dup "delete" crud-create swap
+    [ 
+        tuck crud-lookup [ over get-global remove over set-global ] when* 
+        "list" crud-word execute
+    ] curry dupd define-compound ;
+
+: define-lookup ( class -- )
+    dup "crud-index" word-prop ">" pick unparse 3append in get create
+    swap [ crud-lookup ] curry define-compound ;
+
+: define-lookup* ( class -- )
+    dup "crud-index" word-prop ">" pick unparse "*" append 3append 
+    in get create swap [ crud-lookup* ] curry define-compound ;
+
+: scaffold-params ( class -- array )
+    "crud-index" word-prop 1array 1array ;
+
+: scaffold ( class index realm -- )
+    -rot dupd "crud-index" set-word-prop
+    [ define-lookup ] keep [ define-lookup* ] keep
+    [ get-global [ { } over set-global ] unless ] keep
+    [ define-list { } rot define-authenticated-action ] 2keep
+    [ dup define-show swap scaffold-params rot 
+        define-authenticated-action ] 2keep
+    [ dup define-edit swap scaffold-params rot
+        define-authenticated-action ] 2keep
+    [ define-new { } rot define-authenticated-action ] 2keep
+    [ dup define-update swap "slot-names" word-prop 
+        "crud-index" add [ 1array ] map rot 
+        define-authenticated-action ] 2keep
+    dup define-delete swap scaffold-params rot
+    define-authenticated-action ;
+
+HELP: scaffold
+{ $values { "class" class } { "index" "an index" } { "realm" "a realm" } }
+"If realm is not f, then realm is used as the basic authentication realm for the scaffolding actions." ;
+
+ARTICLE: { "furnace" "crud" } "CRUD Scaffolding"
+{ $code 
+    "\"libs/furnace\" require"
+    "USING: furnace httpd threads ;"
+    "IN: furnace:crud-example"
+    "TUPLE: foo bar baz ;"
+    "\"crud-example\" \"foo-list\" f web-app"
+    "foo \"bar\" f scaffold"
+    "[ 8888 httpd ] in-thread"
+} ;
\ No newline at end of file