utopia 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.codeclimate.yml +1 -0
- data/.travis.yml +3 -1
- data/Gemfile +2 -0
- data/README.md +2 -2
- data/Rakefile +19 -7
- data/docs/.nojekyll +0 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +6 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +5 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +8 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +6 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +10 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +3 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.css.css +14 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +16 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.html.css +5 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +3 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +2 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.python.css +6 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +2 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +18 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.core.css +62 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.editor.css +6 -0
- data/docs/_components/jquery-syntax/base/theme.js +1 -0
- data/docs/_components/jquery-syntax/bright/jquery.syntax.core.css +27 -0
- data/docs/_components/jquery-syntax/bright/theme.js +1 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.apache.js +41 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.applescript.js +57 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.assembly.js +37 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +67 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash.js +33 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.basic.js +51 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.clang.js +89 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.csharp.js +47 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.css.js +80 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.diff.js +24 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.go.js +47 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.haskell.js +45 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.html.js +66 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.io.js +45 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.java.js +45 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.javascript.js +40 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.kai.js +29 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lisp.js +34 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lua.js +44 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.nginx.js +31 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +73 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ooc.js +46 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.pascal.js +51 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.perl5.js +52 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php-script.js +48 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php.js +15 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.plain.js +10 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +43 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.python.js +44 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ruby.js +77 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.scala.js +44 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +29 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.sql.js +31 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +57 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.swift.js +55 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.trenni.js +35 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.xml.js +50 -0
- data/docs/_components/jquery-syntax/jquery.syntax.brush.yaml.js +29 -0
- data/docs/_components/jquery-syntax/jquery.syntax.cache.js +65 -0
- data/docs/_components/jquery-syntax/jquery.syntax.core.js +1098 -0
- data/docs/_components/jquery-syntax/jquery.syntax.editor.js +291 -0
- data/docs/_components/jquery-syntax/jquery.syntax.js +258 -0
- data/docs/_components/jquery-syntax/jquery.syntax.min.js +13 -0
- data/docs/_components/jquery-syntax/paper/jquery.syntax.core.css +31 -0
- data/docs/_components/jquery-syntax/paper/theme.js +1 -0
- data/docs/_components/jquery/core.js +482 -0
- data/docs/_components/jquery/jquery.js +10220 -0
- data/docs/_components/jquery/jquery.min.js +4 -0
- data/docs/_components/jquery/jquery.min.map +1 -0
- data/docs/_components/jquery/jquery.slim.js +8107 -0
- data/docs/_components/jquery/jquery.slim.min.js +4 -0
- data/docs/_components/jquery/jquery.slim.min.map +1 -0
- data/docs/_static/icon.png +0 -0
- data/docs/_static/site.css +205 -0
- data/docs/_static/utopia-background.svg +1 -0
- data/docs/_static/utopia.svg +1 -0
- data/docs/code/Utopia.html +511 -0
- data/docs/code/Utopia/Basename.html +654 -0
- data/docs/code/Utopia/Bootstrap.html +538 -0
- data/docs/code/Utopia/Command.html +207 -0
- data/docs/code/Utopia/Command/Environment.html +321 -0
- data/docs/code/Utopia/Command/Server.html +214 -0
- data/docs/code/Utopia/Command/Server/Create.html +222 -0
- data/docs/code/Utopia/Command/Server/Environment.html +236 -0
- data/docs/code/Utopia/Command/Server/Update.html +317 -0
- data/docs/code/Utopia/Command/Setup.html +145 -0
- data/docs/code/Utopia/Command/Setup/Server.html +298 -0
- data/docs/code/Utopia/Command/Setup/Site.html +180 -0
- data/docs/code/Utopia/Command/Site.html +279 -0
- data/docs/code/Utopia/Command/Site/Create.html +324 -0
- data/docs/code/Utopia/Command/Site/Update.html +407 -0
- data/docs/code/Utopia/Command/Top.html +279 -0
- data/docs/code/Utopia/Content.html +826 -0
- data/docs/code/Utopia/Content/Document.html +1818 -0
- data/docs/code/Utopia/Content/Document/State.html +1220 -0
- data/docs/code/Utopia/Content/Link.html +1286 -0
- data/docs/code/Utopia/Content/Links.html +841 -0
- data/docs/code/Utopia/Content/MarkupParser.html +881 -0
- data/docs/code/Utopia/Content/MarkupParser/ParsedTag.html +422 -0
- data/docs/code/Utopia/Content/MarkupParser/UnbalancedTagError.html +615 -0
- data/docs/code/Utopia/Content/Namespace.html +485 -0
- data/docs/code/Utopia/Content/Node.html +1188 -0
- data/docs/code/Utopia/Content/Node/Context.html +938 -0
- data/docs/code/Utopia/Content/Response.html +813 -0
- data/docs/code/Utopia/Content/SymbolicHash.html +419 -0
- data/docs/code/Utopia/Content/Tag.html +399 -0
- data/docs/code/Utopia/Content/Tags.html +136 -0
- data/docs/code/Utopia/Content/Tags/ContentTag.html +187 -0
- data/docs/code/Utopia/Content/Tags/DeferredTag.html +193 -0
- data/docs/code/Utopia/Content/Tags/Library.html +333 -0
- data/docs/code/Utopia/Content/Tags/NodeTag.html +193 -0
- data/docs/code/Utopia/Content/UnbalancedTagError.html +298 -0
- data/docs/code/Utopia/ContentLength.html +339 -0
- data/docs/code/Utopia/Controller.html +901 -0
- data/docs/code/Utopia/Controller/Actions.html +289 -0
- data/docs/code/Utopia/Controller/Actions/Action.html +978 -0
- data/docs/code/Utopia/Controller/Actions/ClassMethods.html +442 -0
- data/docs/code/Utopia/Controller/Base.html +1216 -0
- data/docs/code/Utopia/Controller/Respond.html +283 -0
- data/docs/code/Utopia/Controller/Respond/ClassMethods.html +236 -0
- data/docs/code/Utopia/Controller/Respond/Converter.html +256 -0
- data/docs/code/Utopia/Controller/Respond/Converter/Callback.html +484 -0
- data/docs/code/Utopia/Controller/Respond/Converter/ToJSON.html +375 -0
- data/docs/code/Utopia/Controller/Respond/Passthrough.html +291 -0
- data/docs/code/Utopia/Controller/Respond/Responder.html +529 -0
- data/docs/code/Utopia/Controller/Rewrite.html +290 -0
- data/docs/code/Utopia/Controller/Rewrite/ClassMethods.html +242 -0
- data/docs/code/Utopia/Controller/Rewrite/ExtractPrefixRule.html +364 -0
- data/docs/code/Utopia/Controller/Rewrite/Rewriter.html +464 -0
- data/docs/code/Utopia/Controller/Rewrite/Rule.html +209 -0
- data/docs/code/Utopia/Controller/Variables.html +550 -0
- data/docs/code/Utopia/Controllers.html +244 -0
- data/docs/code/Utopia/Exceptions.html +127 -0
- data/docs/code/Utopia/Exceptions/Handler.html +526 -0
- data/docs/code/Utopia/Exceptions/Mailer.html +476 -0
- data/docs/code/Utopia/Extensions.html +117 -0
- data/docs/code/Utopia/Extensions/ArraySplit.html +183 -0
- data/docs/code/Utopia/Extensions/DateTimeComparison.html +193 -0
- data/docs/code/Utopia/Extensions/TimeDateComparison.html +193 -0
- data/docs/code/Utopia/HTTP.html +244 -0
- data/docs/code/Utopia/HTTP/Status.html +415 -0
- data/docs/code/Utopia/Locale.html +606 -0
- data/docs/code/Utopia/Localization.html +1235 -0
- data/docs/code/Utopia/Localization/Wrapper.html +459 -0
- data/docs/code/Utopia/Logger.html +205 -0
- data/docs/code/Utopia/Logger/CompactFormatter.html +335 -0
- data/docs/code/Utopia/Path.html +3304 -0
- data/docs/code/Utopia/Path/Matcher.html +518 -0
- data/docs/code/Utopia/Path/Matcher/MatchData.html +475 -0
- data/docs/code/Utopia/Redirection.html +145 -0
- data/docs/code/Utopia/Redirection/ClientRedirect.html +717 -0
- data/docs/code/Utopia/Redirection/DirectoryIndex.html +298 -0
- data/docs/code/Utopia/Redirection/Errors.html +470 -0
- data/docs/code/Utopia/Redirection/Moved.html +312 -0
- data/docs/code/Utopia/Redirection/RequestFailure.html +226 -0
- data/docs/code/Utopia/Redirection/Rewrite.html +296 -0
- data/docs/code/Utopia/Session.html +883 -0
- data/docs/code/Utopia/Session/LazyHash.html +859 -0
- data/docs/code/Utopia/Setup.html +964 -0
- data/docs/code/Utopia/Static.html +690 -0
- data/docs/code/Utopia/Static/LocalFile.html +1098 -0
- data/docs/code/Utopia/Static/MimeTypeLoader.html +541 -0
- data/docs/code/Utopia/Static/MimeTypeLoader/ExpansionError.html +124 -0
- data/docs/code/Utopia/Tags.html +115 -0
- data/docs/code/Utopia/Tags/Environment.html +314 -0
- data/docs/code/Utopia/Tags/EnvironmentTag.html +314 -0
- data/docs/code/Utopia/Tags/Library.html +340 -0
- data/docs/code/_index.html +758 -0
- data/docs/code/class_list.html +51 -0
- data/docs/code/css/common.css +1 -0
- data/docs/code/css/full_list.css +58 -0
- data/docs/code/css/style.css +499 -0
- data/docs/code/file.README.html +169 -0
- data/docs/code/file_list.html +56 -0
- data/docs/code/frames.html +17 -0
- data/docs/code/index.html +169 -0
- data/docs/code/js/app.js +248 -0
- data/docs/code/js/full_list.js +216 -0
- data/docs/code/js/jquery.js +4 -0
- data/docs/code/materials/utopia.png +0 -0
- data/docs/code/materials/utopia.svg +1 -0
- data/docs/code/method_list.html +3443 -0
- data/docs/code/top-level-namespace.html +110 -0
- data/docs/index.html +92 -0
- data/docs/wiki.html +92 -0
- data/docs/wiki/bower-integration.html +74 -0
- data/docs/wiki/bower-integration/index.html +74 -0
- data/docs/wiki/development-environment-setup.html +60 -0
- data/docs/wiki/development-environment-setup/index.html +60 -0
- data/docs/wiki/edit.html +103 -0
- data/docs/wiki/faq/what-is-xnode.html +79 -0
- data/docs/wiki/faq/what-is-xnode/index.html +79 -0
- data/docs/wiki/middleware/content.html +64 -0
- data/docs/wiki/middleware/content/index.html +64 -0
- data/docs/wiki/middleware/controller.html +104 -0
- data/docs/wiki/middleware/controller/actions.html +117 -0
- data/docs/wiki/middleware/controller/actions/index.html +117 -0
- data/docs/wiki/middleware/controller/actions/rewrite/index.html +48 -0
- data/docs/wiki/middleware/controller/index.html +104 -0
- data/docs/wiki/middleware/controller/rewrite.html +111 -0
- data/docs/wiki/middleware/controller/rewrite/index.html +111 -0
- data/docs/wiki/middleware/localization.html +59 -0
- data/docs/wiki/middleware/localization/index.html +59 -0
- data/docs/wiki/middleware/redirection.html +61 -0
- data/docs/wiki/middleware/redirection/index.html +61 -0
- data/docs/wiki/middleware/session.html +71 -0
- data/docs/wiki/middleware/session/index.html +71 -0
- data/docs/wiki/middleware/static.html +57 -0
- data/docs/wiki/middleware/static/index.html +57 -0
- data/docs/wiki/server-setup.html +118 -0
- data/docs/wiki/server-setup/index.html +118 -0
- data/docs/wiki/testing.html +59 -0
- data/docs/wiki/testing/index.html +59 -0
- data/docs/wiki/updating-utopia.html +108 -0
- data/docs/wiki/updating-utopia/index.html +108 -0
- data/docs/wiki/your-first-page.html +80 -0
- data/docs/wiki/your-first-page/index.html +80 -0
- data/documentation/Guardfile +0 -12
- data/documentation/Rakefile +3 -0
- data/documentation/pages/_page.xnode +2 -0
- data/documentation/pages/wiki/content.md +1 -0
- data/documentation/pages/wiki/faq/what-is-xnode/content.md +37 -0
- data/documentation/pages/wiki/links.yaml +3 -1
- data/documentation/pages/wiki/server-setup/content.md +1 -1
- data/documentation/pages/wiki/show.xnode +2 -0
- data/documentation/pages/wiki/your-first-page/content.md +1 -1
- data/lib/utopia/command.rb +4 -4
- data/lib/utopia/command/environment.rb +73 -0
- data/lib/utopia/command/server.rb +19 -32
- data/lib/utopia/command/site.rb +26 -9
- data/lib/utopia/content/markup.rb +1 -1
- data/lib/utopia/setup.rb +49 -20
- data/lib/utopia/version.rb +1 -1
- data/setup/site/README.md +6 -7
- data/setup/site/Rakefile +3 -0
- data/setup/site/pages/_page.xnode +1 -1
- data/setup/site/public/_static/site.css +1 -1
- data/setup/site/tasks/bower.rake +3 -6
- data/setup/site/tasks/deploy.rake +1 -1
- data/setup/site/tasks/development.rake +1 -1
- data/setup/site/tasks/environment.rake +2 -2
- data/setup/site/tasks/static.rake +43 -0
- data/spec/utopia/command_spec.rb +170 -0
- data/spec/utopia/setup_spec.rb +20 -142
- metadata +225 -42
- data/documentation/public/_components/jquery-syntax/.sass-cache/040afc1428b286fb3c50151378b349a6149698d3/jquery.syntax.core.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.editor.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.fixed.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.inline.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.list.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.plain.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/098642d80a1682613dca2bba6fd0a3bc9fd2bf04/jquery.syntax.layout.table.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/10c58b30c53bf84f8360af8a864797092be26882/jquery.syntax.core.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/10c58b30c53bf84f8360af8a864797092be26882/jquery.syntax.layout.fixed.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/10c58b30c53bf84f8360af8a864797092be26882/jquery.syntax.layout.inline.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/_layout.scssc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.apache.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.applescript.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.assembly.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.bash-script.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.bash.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.clang.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.css.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.diff.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.html.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.ocaml.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.protobuf.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.python.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.ruby.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.brush.xml.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.core.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.editor.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.layout.editor.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.layout.fixed.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.layout.list.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.layout.plain.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/3c69ad94149e2a6d9f4ffda01814fee3947b1389/jquery.syntax.layout.table.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/8638ad407c5ea29f6547cf8ac6983da587354889/master.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/b7ab87e6269b4fe89f9475b7a260077391d3567b/jquery.syntax.layout.editor.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/b7ab87e6269b4fe89f9475b7a260077391d3567b/jquery.syntax.layout.fixed.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/b7ab87e6269b4fe89f9475b7a260077391d3567b/jquery.syntax.layout.inline.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/b7ab87e6269b4fe89f9475b7a260077391d3567b/jquery.syntax.layout.plain.sassc +0 -0
- data/documentation/public/_components/jquery-syntax/.sass-cache/e82f8cf4c8436da086a4506e01ef78755ebab1ce/master.scssc +0 -0
- data/lib/utopia/command/setup.rb +0 -78
data/documentation/Guardfile
CHANGED
@@ -6,16 +6,4 @@ group :development do
|
|
6
6
|
watch(%r{^config|lib|pages/.*})
|
7
7
|
notification :off
|
8
8
|
end
|
9
|
-
|
10
|
-
# # Open the documentation website when the command is run, once puma has started:
|
11
|
-
# require 'launchy'
|
12
|
-
# $first_time = true
|
13
|
-
#
|
14
|
-
# url_path = 'run/url.txt'
|
15
|
-
# watch(url_path) do
|
16
|
-
# if $first_time
|
17
|
-
# $first_time = false
|
18
|
-
# Launchy.open(File.read(url_path))
|
19
|
-
# end
|
20
|
-
# end
|
21
9
|
end
|
data/documentation/Rakefile
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
<title>Utopia</title>
|
10
10
|
<?r end ?>
|
11
11
|
|
12
|
+
<meta charset="UTF-8" />
|
13
|
+
|
12
14
|
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous" />
|
13
15
|
|
14
16
|
<link rel="icon" type="image/png" href="/_static/icon.png" />
|
@@ -9,6 +9,7 @@ Reading these pages in order will give you an overview of the design of Utopia,
|
|
9
9
|
- [Development Environment Setup](development-environment-setup/)
|
10
10
|
- [Server Setup](server-setup/)
|
11
11
|
- [Your First Page](your-first-page/)
|
12
|
+
- [What is `.xnode`?](faq/what-is-xnode/)
|
12
13
|
- [Installing JavaScript Libraries](bower-integration/)
|
13
14
|
- [Website Tests](testing/)
|
14
15
|
- [Updating Your Site](updating-utopia/)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# What Is `.xnode`?
|
2
|
+
|
3
|
+
Xnodes are the files on disk which are used as part of Utopia's content/view layer. Xnode templates are designed to maximise the ratio of content to markup. They improve separation of concerns and semantic organisation because repeated markup can be reused easily.
|
4
|
+
|
5
|
+
Here is a example of a blog post:
|
6
|
+
|
7
|
+
```xml
|
8
|
+
<content:entry title="My day as a fish">
|
9
|
+
<p>It was not very exciting</p>
|
10
|
+
</content:entry>
|
11
|
+
```
|
12
|
+
|
13
|
+
The `Utopia::Content` middleware is built on top of the [Trenni](https://github.com/ioquatix/trenni) template language which uses two-phase evaluation.
|
14
|
+
|
15
|
+
## Phase 1: Evaluation
|
16
|
+
|
17
|
+
Trenni processes the view content by evaluation `#{expressions}` and `<?r statements ?>`. This generates an output buffer. The output buffer should contain valid markup (i.e. balanced tags, no invalid characters).
|
18
|
+
|
19
|
+
## Phase 2: Markup
|
20
|
+
|
21
|
+
Once the template is evaluated to text, it is parsed again into an event stream which is used to generate the final output. The event stream contains things like "open tag", "attribute", "close tag", and so on, and these are fed into the `Utopia::Content` middleware which generates the actual content. Tags without namespaces are output verbatim, while tags with namespaces invoke the tag lookup machinery. This uses the tag name to invoke further behaviour, e.g. inserting more content. Here is a simple example of a basic page:
|
22
|
+
|
23
|
+
```xml
|
24
|
+
<content:page>
|
25
|
+
<content:heading>Welcome to my page</content:heading>
|
26
|
+
|
27
|
+
<p>This page is so awesome</p>
|
28
|
+
</content:page>
|
29
|
+
```
|
30
|
+
|
31
|
+
In order to render this, you will need two additional files, `_page.xnode` and `_heading.xnode`. As a short example, `_heading.xnode` might look like this:
|
32
|
+
|
33
|
+
```xml
|
34
|
+
<h1><utopia:content/></h1>
|
35
|
+
```
|
36
|
+
|
37
|
+
When the parser encounters `<content:heading>...` in the main page, it would evaluate the above template. `<utopia:content/>` is a special tag that evaluates to the content that the parent tag provided, so in this case: `"Welcome to my page"`. Thus, the final output is `<h1>Welcome to my page</h1>`.
|
@@ -26,7 +26,7 @@ $ git push --set-upstream production master
|
|
26
26
|
Utopia will load `config/environment.yaml` and update `ENV` before executing any code. You can set default environment values using the `utopia` command:
|
27
27
|
|
28
28
|
```bash
|
29
|
-
$ sudo -u http utopia
|
29
|
+
$ sudo -u http utopia environment RACK_ENV=production DATABASE_ENV=production_cluster_primary
|
30
30
|
ENV["RACK_ENV"] will default to "production" unless otherwise specified.
|
31
31
|
ENV["DATABASE_ENV"] will default to "production_cluster_primary" unless otherwise specified.
|
32
32
|
```
|
@@ -9,7 +9,7 @@ $ utopia site create
|
|
9
9
|
$ rake server
|
10
10
|
```
|
11
11
|
|
12
|
-
You will now have a basic template site running on
|
12
|
+
You will now have a basic template site running on `http://localhost:9292`.
|
13
13
|
|
14
14
|
## Welcome Page
|
15
15
|
|
data/lib/utopia/command.rb
CHANGED
@@ -22,6 +22,7 @@ require_relative 'version'
|
|
22
22
|
|
23
23
|
require_relative 'command/site'
|
24
24
|
require_relative 'command/server'
|
25
|
+
require_relative 'command/environment'
|
25
26
|
|
26
27
|
module Utopia
|
27
28
|
module Command
|
@@ -41,7 +42,8 @@ module Utopia
|
|
41
42
|
|
42
43
|
nested '<command>',
|
43
44
|
'site' => Site,
|
44
|
-
'server' => Server
|
45
|
+
'server' => Server,
|
46
|
+
'environment' => Environment
|
45
47
|
|
46
48
|
# The root directory for the site.
|
47
49
|
def root
|
@@ -54,9 +56,7 @@ module Utopia
|
|
54
56
|
elsif @options[:help] or @command.nil?
|
55
57
|
print_usage(program_name)
|
56
58
|
else
|
57
|
-
|
58
|
-
@command.invoke(self)
|
59
|
-
end
|
59
|
+
@command.invoke(self)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright, 2016, by Samuel G. D. Williams. <http://www.codeotaku.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require 'securerandom'
|
22
|
+
require 'yaml/store'
|
23
|
+
|
24
|
+
module Utopia
|
25
|
+
module Command
|
26
|
+
# Set environment variables within the server deployment.
|
27
|
+
class Environment < Samovar::Command
|
28
|
+
self.description = "Update environment variables in config/environment.yaml"
|
29
|
+
|
30
|
+
options do
|
31
|
+
option '-e/--environment-name <name>', "The environment file to modify.", default: 'environment'
|
32
|
+
end
|
33
|
+
|
34
|
+
many :variables, "A list of environment KEY=VALUE pairs to set."
|
35
|
+
|
36
|
+
# Setup `config/environment.yaml` according to specified options.
|
37
|
+
def update_environment(root, name = @options[:environment_name])
|
38
|
+
environment_path = File.join(root, "config", "#{name}.yaml")
|
39
|
+
FileUtils.mkpath File.dirname(environment_path)
|
40
|
+
|
41
|
+
store = YAML::Store.new(environment_path)
|
42
|
+
|
43
|
+
store.transaction do
|
44
|
+
yield store
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def invoke(parent)
|
49
|
+
destination_root = parent.root
|
50
|
+
|
51
|
+
update_environment(destination_root) do |store|
|
52
|
+
variables.each do |variable|
|
53
|
+
key, value = variable.split('=', 2)
|
54
|
+
|
55
|
+
if value
|
56
|
+
puts "ENV[#{key.inspect}] will default to #{value.inspect} unless otherwise specified."
|
57
|
+
store[key] = value
|
58
|
+
else
|
59
|
+
puts "ENV[#{key.inspect}] will be unset unless otherwise specified."
|
60
|
+
store.delete(key)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
store.roots.each do |key|
|
65
|
+
value = store[key]
|
66
|
+
|
67
|
+
puts "#{Rainbow(key).blue}: #{Rainbow(value.inspect).green}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -18,7 +18,11 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
require_relative '
|
21
|
+
require_relative 'site'
|
22
|
+
|
23
|
+
require 'fileutils'
|
24
|
+
|
25
|
+
require 'samovar'
|
22
26
|
|
23
27
|
module Utopia
|
24
28
|
module Command
|
@@ -46,6 +50,11 @@ module Utopia
|
|
46
50
|
class Update < Samovar::Command
|
47
51
|
self.description = "Update the git hooks in an existing server repository."
|
48
52
|
|
53
|
+
def template_root
|
54
|
+
# The root directory of the template server deployment:
|
55
|
+
File.join(SETUP_ROOT, 'server')
|
56
|
+
end
|
57
|
+
|
49
58
|
def invoke(parent)
|
50
59
|
destination_root = parent.root
|
51
60
|
|
@@ -64,49 +73,27 @@ module Utopia
|
|
64
73
|
# chmod g+s `find . -type d` # New files get group id of directory
|
65
74
|
end
|
66
75
|
|
67
|
-
|
76
|
+
# Set some useful defaults for the environment.
|
77
|
+
environment = Environment[]
|
78
|
+
environment.update_environment(destination_root) do |store|
|
79
|
+
store['RACK_ENV'] ||= 'production'
|
80
|
+
store['DATABASE_ENV'] ||= 'production'
|
81
|
+
store['UTOPIA_SESSION_SECRET'] ||= SecureRandom.hex(40)
|
82
|
+
end
|
68
83
|
|
69
84
|
# Copy git hooks:
|
70
|
-
system("cp", "-r", File.join(
|
85
|
+
system("cp", "-r", File.join(template_root, 'git', 'hooks'), File.join(destination_root, '.git')) or fail "could not copy git hooks"
|
71
86
|
# finally set everything in the .git directory to be group writable
|
72
87
|
# This failed for me and I had to do sudo chown http:http .git -R first.
|
73
88
|
system("chmod", "-Rf", "g+w", File.join(destination_root, '.git')) or fail "could not update permissions of .git directory"
|
74
89
|
end
|
75
90
|
end
|
76
91
|
|
77
|
-
# Set environment variables within the server deployment.
|
78
|
-
class Environment < Samovar::Command
|
79
|
-
self.description = "Update environment variables in config/environment.yaml"
|
80
|
-
|
81
|
-
many :variables, "A list of environment KEY=VALUE pairs to set."
|
82
|
-
|
83
|
-
def invoke(parent)
|
84
|
-
return if variables.empty?
|
85
|
-
|
86
|
-
destination_root = parent.root
|
87
|
-
|
88
|
-
Setup::Server.environment(destination_root) do |store|
|
89
|
-
variables.each do |variable|
|
90
|
-
key, value = variable.split('=', 2)
|
91
|
-
|
92
|
-
if value
|
93
|
-
puts "ENV[#{key.inspect}] will default to #{value.inspect} unless otherwise specified."
|
94
|
-
store[key] = value
|
95
|
-
else
|
96
|
-
puts "ENV[#{key.inspect}] will be unset unless otherwise specified."
|
97
|
-
store.delete(key)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
92
|
self.description = "Manage server deployments."
|
105
93
|
|
106
94
|
nested '<command>',
|
107
95
|
'create' => Create,
|
108
|
-
'update' => Update
|
109
|
-
'environment' => Environment
|
96
|
+
'update' => Update
|
110
97
|
|
111
98
|
def invoke(parent)
|
112
99
|
@command.invoke(parent)
|
data/lib/utopia/command/site.rb
CHANGED
@@ -18,29 +18,46 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
|
21
|
+
require 'fileutils'
|
22
|
+
require 'find'
|
23
|
+
|
24
|
+
require 'samovar'
|
22
25
|
|
23
26
|
module Utopia
|
24
27
|
module Command
|
28
|
+
# This path must point to utopia/setup in the gem source.
|
29
|
+
SETUP_ROOT = File.expand_path("../../../setup", __dir__)
|
30
|
+
|
25
31
|
# Local site setup commands.
|
26
32
|
class Site < Samovar::Command
|
33
|
+
# Configuration files which should be installed/updated:
|
34
|
+
CONFIGURATION_FILES = ['.bowerrc', '.gitignore', 'config.ru', 'config/environment.rb', 'Gemfile', 'Guardfile', 'Rakefile', 'tasks/bower.rake', 'tasks/deploy.rake', 'tasks/development.rake', 'tasks/environment.rake', 'tasks/log.rake']
|
35
|
+
|
36
|
+
# Directories that should exist:
|
37
|
+
DIRECTORIES = ["config", "lib", "pages", "public", "tasks"]
|
38
|
+
|
39
|
+
# Directories that should be removed during upgrade process:
|
40
|
+
OLD_PATHS = ["access_log", "cache", "tmp", 'tasks/test.rake', 'tasks/utopia.rake']
|
41
|
+
|
42
|
+
# The root directory of the template site:
|
43
|
+
ROOT = File.join(SETUP_ROOT, 'site')
|
44
|
+
|
27
45
|
# Create a local site.
|
28
46
|
class Create < Samovar::Command
|
29
47
|
self.description = "Create a new local Utopia website using the default template."
|
30
|
-
# self.example = "utopia --in www.example.com site create"
|
31
48
|
|
32
49
|
def invoke(parent)
|
33
50
|
destination_root = parent.root
|
34
51
|
|
35
52
|
$stderr.puts "Setting up initial site in #{destination_root} for Utopia v#{Utopia::VERSION}..."
|
36
53
|
|
37
|
-
|
54
|
+
DIRECTORIES.each do |directory|
|
38
55
|
FileUtils.mkdir_p(File.join(destination_root, directory))
|
39
56
|
end
|
40
57
|
|
41
|
-
Find.find(
|
58
|
+
Find.find(ROOT) do |source_path|
|
42
59
|
# What is this doing?
|
43
|
-
destination_path = File.join(destination_root, source_path[
|
60
|
+
destination_path = File.join(destination_root, source_path[ROOT.size..-1])
|
44
61
|
|
45
62
|
if File.directory?(source_path)
|
46
63
|
FileUtils.mkdir_p(destination_path)
|
@@ -51,7 +68,7 @@ module Utopia
|
|
51
68
|
end
|
52
69
|
end
|
53
70
|
|
54
|
-
|
71
|
+
CONFIGURATION_FILES.each do |configuration_file|
|
55
72
|
destination_path = File.join(destination_root, configuration_file)
|
56
73
|
|
57
74
|
buffer = File.read(destination_path).gsub('$UTOPIA_VERSION', Utopia::VERSION)
|
@@ -128,17 +145,17 @@ module Utopia
|
|
128
145
|
system('git', 'checkout', '-b', branch_name) or fail "could not change branch"
|
129
146
|
end
|
130
147
|
|
131
|
-
|
148
|
+
DIRECTORIES.each do |directory|
|
132
149
|
FileUtils.mkdir_p(File.join(destination_root, directory))
|
133
150
|
end
|
134
151
|
|
135
|
-
|
152
|
+
OLD_PATHS.each do |path|
|
136
153
|
path = File.join(destination_root, path)
|
137
154
|
$stderr.puts "\tRemoving #{path}..."
|
138
155
|
FileUtils.rm_rf(path)
|
139
156
|
end
|
140
157
|
|
141
|
-
|
158
|
+
CONFIGURATION_FILES.each do |configuration_file|
|
142
159
|
source_path = File.join(Setup::Site::ROOT, configuration_file)
|
143
160
|
destination_path = File.join(destination_root, configuration_file)
|
144
161
|
|
@@ -103,7 +103,7 @@ module Utopia
|
|
103
103
|
# This is for compatibility with the existing API which passes in a string:
|
104
104
|
buffer = Trenni::Buffer(buffer)
|
105
105
|
|
106
|
-
self.new(buffer, delegate).parse!
|
106
|
+
self.new(buffer, delegate, entities).parse!
|
107
107
|
end
|
108
108
|
|
109
109
|
def initialize(buffer, delegate, entities = Trenni::Entities::HTML5)
|
data/lib/utopia/setup.rb
CHANGED
@@ -18,55 +18,84 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
+
require 'yaml'
|
22
|
+
|
21
23
|
module Utopia
|
22
24
|
# Used for setting up a Utopia web application, typically via `config/environment.rb`
|
23
|
-
class
|
25
|
+
class Setup
|
24
26
|
def initialize(config_root, external_encoding: Encoding::UTF_8)
|
25
27
|
@config_root = config_root
|
26
28
|
|
27
29
|
@external_encoding = external_encoding
|
30
|
+
|
31
|
+
@environment = nil
|
28
32
|
end
|
29
33
|
|
30
|
-
|
31
|
-
|
34
|
+
attr :config_root
|
35
|
+
attr :external_encoding
|
36
|
+
attr :environment
|
37
|
+
|
38
|
+
ENVIRONMENT_KEY = 'UTOPIA_ENV'.freeze
|
39
|
+
DEFAULT_ENVIRONMENT = 'environment'.freeze
|
40
|
+
|
41
|
+
def explicit_environment_name
|
42
|
+
ENV[ENVIRONMENT_KEY]
|
43
|
+
end
|
44
|
+
|
45
|
+
def site_root
|
46
|
+
File.dirname(@config_root)
|
47
|
+
end
|
48
|
+
|
49
|
+
def apply
|
50
|
+
set_external_encoding
|
32
51
|
|
33
|
-
|
52
|
+
apply_environment
|
34
53
|
|
35
|
-
|
54
|
+
add_load_path('lib')
|
36
55
|
|
37
56
|
require_relative '../utopia'
|
38
57
|
end
|
39
58
|
|
40
|
-
def
|
41
|
-
|
59
|
+
def apply_environment
|
60
|
+
if name = explicit_environment_name
|
61
|
+
load_environment(name)
|
62
|
+
else
|
63
|
+
load_environment(DEFAULT_ENVIRONMENT)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def environment_path(name, root = @config_root)
|
68
|
+
File.expand_path("#{name}.yaml", root)
|
42
69
|
end
|
43
70
|
|
44
71
|
# If you don't specify these, it's possible to have issues when encodings mismatch on the server.
|
45
|
-
def
|
72
|
+
def set_external_encoding(encoding = Encoding::UTF_8)
|
46
73
|
# TODO: Deprecate and remove this setup - it should be the responsibility of the server to set this correctly.
|
47
|
-
if
|
48
|
-
warn "Updating Encoding.default_external from #{Encoding.default_external} to #{
|
49
|
-
Encoding.default_external =
|
74
|
+
if Encoding.default_external != encoding
|
75
|
+
warn "Updating Encoding.default_external from #{Encoding.default_external} to #{encoding}" if $VERBOSE
|
76
|
+
Encoding.default_external = encoding
|
50
77
|
end
|
51
78
|
end
|
52
79
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
80
|
+
# Load the named configuration file from the `config_root` directory.
|
81
|
+
def load_environment(*args)
|
82
|
+
path = environment_path(*args)
|
83
|
+
|
84
|
+
if File.exist?(path)
|
57
85
|
# Load the YAML environment file:
|
58
|
-
environment = YAML.load_file(
|
86
|
+
@environment = YAML.load_file(path)
|
59
87
|
|
60
88
|
# We update ENV but only when it's not already set to something:
|
61
|
-
ENV.update(environment) do |name, old_value, new_value|
|
89
|
+
ENV.update(@environment) do |name, old_value, new_value|
|
62
90
|
old_value || new_value
|
63
91
|
end
|
64
92
|
end
|
65
93
|
end
|
66
94
|
|
67
|
-
|
95
|
+
# Add the given path to $LOAD_PATH. If it's relative, make it absolute relative to `site_path`.
|
96
|
+
def add_load_path(path)
|
68
97
|
# Allow loading library code from lib directory:
|
69
|
-
$LOAD_PATH << File.expand_path(
|
98
|
+
$LOAD_PATH << File.expand_path(path, site_root)
|
70
99
|
end
|
71
100
|
end
|
72
101
|
|
@@ -77,6 +106,6 @@ module Utopia
|
|
77
106
|
config_root = File.dirname(caller[0])
|
78
107
|
end
|
79
108
|
|
80
|
-
|
109
|
+
Setup.new(config_root, **options).tap(&:apply)
|
81
110
|
end
|
82
111
|
end
|