utopia 2.14.0 → 2.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bake/utopia/{yarn.rb → node.rb} +11 -5
- data/lib/utopia/command.rb +2 -2
- data/lib/utopia/command/site.rb +1 -1
- data/lib/utopia/content.rb +7 -5
- data/lib/utopia/content/markup.rb +1 -1
- data/lib/utopia/content/node.rb +2 -2
- data/lib/utopia/content/response.rb +3 -3
- data/lib/utopia/controller.rb +0 -17
- data/lib/utopia/controller/base.rb +27 -3
- data/lib/utopia/controller/respond.rb +50 -107
- data/lib/utopia/extensions/array_split.rb +2 -2
- data/lib/utopia/http.rb +3 -3
- data/lib/utopia/middleware.rb +2 -2
- data/lib/utopia/path.rb +13 -5
- data/lib/utopia/redirection.rb +0 -2
- data/lib/utopia/responder.rb +76 -0
- data/lib/utopia/version.rb +1 -1
- data/setup/site/.gitignore +8 -7
- metadata +71 -396
- data/.codeclimate.yml +0 -5
- data/.github/workflows/development.yml +0 -62
- data/.gitignore +0 -8
- data/.rspec +0 -4
- data/.yardopts +0 -2
- data/Gemfile +0 -28
- data/README.md +0 -90
- data/benchmark/call_vs_check.rb +0 -38
- data/benchmark/const_vs_hash.rb +0 -35
- data/benchmark/hash_vs_openstruct.rb +0 -54
- data/benchmark/string_vs_symbol.rb +0 -14
- data/benchmark/struct_vs_class.rb +0 -91
- data/docs/.nojekyll +0 -0
- data/docs/_components/jquery-litebox/jquery.litebox.css +0 -23
- data/docs/_components/jquery-litebox/jquery.litebox.gallery.css +0 -48
- data/docs/_components/jquery-litebox/jquery.litebox.js +0 -30
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -12
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -4
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
- data/docs/_components/jquery-syntax/base/jquery.syntax.core.css +0 -58
- data/docs/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
- data/docs/_components/jquery-syntax/base/theme.js +0 -1
- data/docs/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
- data/docs/_components/jquery-syntax/bright/theme.js +0 -1
- data/docs/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -5
- data/docs/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -3
- data/docs/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -4
- data/docs/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -2
- data/docs/_components/jquery-syntax/jquery.syntax.cache.js +0 -7
- data/docs/_components/jquery-syntax/jquery.syntax.core.js +0 -34
- data/docs/_components/jquery-syntax/jquery.syntax.editor.js +0 -11
- data/docs/_components/jquery-syntax/jquery.syntax.js +0 -8
- data/docs/_components/jquery-syntax/jquery.syntax.min.js +0 -13
- data/docs/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
- data/docs/_components/jquery-syntax/paper/theme.js +0 -1
- data/docs/_components/jquery/jquery.js +0 -10872
- data/docs/_components/jquery/jquery.min.js +0 -2
- data/docs/_components/jquery/jquery.min.map +0 -1
- data/docs/_components/jquery/jquery.slim.js +0 -8777
- data/docs/_components/jquery/jquery.slim.min.js +0 -2
- data/docs/_components/jquery/jquery.slim.min.map +0 -1
- data/docs/_static/icon.png +0 -0
- data/docs/_static/site.css +0 -191
- data/docs/development-environment-setup/index.html +0 -54
- data/docs/faq/what-is-xnode/index.html +0 -73
- data/docs/index.html +0 -86
- data/docs/javascript/index.html +0 -108
- data/docs/middleware/content/index.html +0 -58
- data/docs/middleware/controller/actions/index.html +0 -111
- data/docs/middleware/controller/index.html +0 -98
- data/docs/middleware/controller/rewrite/index.html +0 -105
- data/docs/middleware/localization/index.html +0 -53
- data/docs/middleware/redirection/index.html +0 -55
- data/docs/middleware/session/index.html +0 -65
- data/docs/middleware/static/index.html +0 -51
- data/docs/server-setup/index.html +0 -87
- data/docs/testing/index.html +0 -53
- data/docs/updating-utopia/index.html +0 -102
- data/docs/your-first-page/index.html +0 -74
- data/materials/utopia.png +0 -0
- data/materials/utopia.svg +0 -1
- data/setup/site/.yarnrc +0 -1
- data/spec/mock_node.rb +0 -16
- data/spec/spec_helper.rb +0 -13
- data/spec/utopia/command_spec.rb +0 -164
- data/spec/utopia/content/document_spec.rb +0 -60
- data/spec/utopia/content/links/bar/index.xnode +0 -0
- data/spec/utopia/content/links/bar/parent/child/index.en.xnode +0 -0
- data/spec/utopia/content/links/bar/parent/child/index.ja.xnode +0 -0
- data/spec/utopia/content/links/bar/parent/links.yaml +0 -2
- data/spec/utopia/content/links/foo/index.xnode +0 -0
- data/spec/utopia/content/links/foo/links.yaml +0 -2
- data/spec/utopia/content/links/foo/test.de.xnode +0 -0
- data/spec/utopia/content/links/foo/test.en.xnode +0 -0
- data/spec/utopia/content/links/index.xnode +0 -0
- data/spec/utopia/content/links/links.yaml +0 -18
- data/spec/utopia/content/links/redirect/links.yaml +0 -2
- data/spec/utopia/content/links/welcome.xnode +0 -0
- data/spec/utopia/content/links_spec.rb +0 -218
- data/spec/utopia/content/localized/five/index.en.xnode +0 -0
- data/spec/utopia/content/localized/four/index.en.xnode +0 -0
- data/spec/utopia/content/localized/four/index.zh.xnode +0 -0
- data/spec/utopia/content/localized/four/links.yaml +0 -4
- data/spec/utopia/content/localized/links.yaml +0 -13
- data/spec/utopia/content/localized/one.xnode +0 -0
- data/spec/utopia/content/localized/three/index.xnode +0 -0
- data/spec/utopia/content/localized/two.en.xnode +0 -0
- data/spec/utopia/content/localized/two.zh.xnode +0 -0
- data/spec/utopia/content/markup_spec.rb +0 -96
- data/spec/utopia/content/namespace_spec.rb +0 -45
- data/spec/utopia/content/node/lookup/content.xnode +0 -1
- data/spec/utopia/content/node/lookup/index.xnode +0 -1
- data/spec/utopia/content/node/ordered/first.xnode +0 -0
- data/spec/utopia/content/node/ordered/index.xnode +0 -0
- data/spec/utopia/content/node/ordered/links.yaml +0 -4
- data/spec/utopia/content/node/ordered/second.xnode +0 -0
- data/spec/utopia/content/node/related/foo.en.xnode +0 -0
- data/spec/utopia/content/node/related/foo.ja.xnode +0 -0
- data/spec/utopia/content/node/related/links.yaml +0 -4
- data/spec/utopia/content/node_spec.rb +0 -97
- data/spec/utopia/content/response_spec.rb +0 -54
- data/spec/utopia/content/tags_spec.rb +0 -82
- data/spec/utopia/content_spec.rb +0 -100
- data/spec/utopia/content_spec.ru +0 -6
- data/spec/utopia/content_spec/_heading.xnode +0 -1
- data/spec/utopia/content_spec/content/_show-value.xnode +0 -1
- data/spec/utopia/content_spec/content/links.yaml +0 -2
- data/spec/utopia/content_spec/content/test-partial.xnode +0 -1
- data/spec/utopia/content_spec/index.xnode +0 -1
- data/spec/utopia/content_spec/node/index.xnode +0 -1
- data/spec/utopia/content_spec/test.xnode +0 -10
- data/spec/utopia/controller/actions_spec.rb +0 -62
- data/spec/utopia/controller/middleware_spec.rb +0 -88
- data/spec/utopia/controller/middleware_spec.ru +0 -6
- data/spec/utopia/controller/middleware_spec/controller/controller.rb +0 -27
- data/spec/utopia/controller/middleware_spec/controller/index.xnode +0 -1
- data/spec/utopia/controller/middleware_spec/controller/nested/controller.rb +0 -7
- data/spec/utopia/controller/middleware_spec/empty/controller.rb +0 -0
- data/spec/utopia/controller/middleware_spec/redirect/controller.rb +0 -12
- data/spec/utopia/controller/middleware_spec/redirect/test/controller.rb +0 -9
- data/spec/utopia/controller/respond_spec.rb +0 -174
- data/spec/utopia/controller/respond_spec.ru +0 -12
- data/spec/utopia/controller/respond_spec/api/controller.rb +0 -28
- data/spec/utopia/controller/respond_spec/errors/controller.rb +0 -14
- data/spec/utopia/controller/respond_spec/errors/file-not-found.xnode +0 -8
- data/spec/utopia/controller/respond_spec/html/controller.rb +0 -11
- data/spec/utopia/controller/respond_spec/rewrite/controller.rb +0 -13
- data/spec/utopia/controller/rewrite_spec.rb +0 -80
- data/spec/utopia/controller/sequence_spec.rb +0 -135
- data/spec/utopia/controller/variables_spec.rb +0 -59
- data/spec/utopia/controller/websocket_spec.rb +0 -68
- data/spec/utopia/controller/websocket_spec.ru +0 -5
- data/spec/utopia/controller/websocket_spec/server/controller.rb +0 -11
- data/spec/utopia/exceptions/handler_spec.rb +0 -47
- data/spec/utopia/exceptions/handler_spec.ru +0 -8
- data/spec/utopia/exceptions/handler_spec/controller.rb +0 -19
- data/spec/utopia/exceptions/mailer_spec.rb +0 -43
- data/spec/utopia/exceptions/mailer_spec.ru +0 -10
- data/spec/utopia/extensions_spec.rb +0 -73
- data/spec/utopia/http/status_spec.rb +0 -44
- data/spec/utopia/locale_spec.rb +0 -58
- data/spec/utopia/localization_spec.rb +0 -92
- data/spec/utopia/localization_spec.ru +0 -15
- data/spec/utopia/localization_spec/controller.rb +0 -21
- data/spec/utopia/localization_spec/localized.de.txt +0 -1
- data/spec/utopia/localization_spec/localized.en.txt +0 -1
- data/spec/utopia/localization_spec/localized.ja.txt +0 -1
- data/spec/utopia/localization_spec/test.txt +0 -1
- data/spec/utopia/middleware_spec.rb +0 -31
- data/spec/utopia/path/matcher_spec.rb +0 -66
- data/spec/utopia/path_spec.rb +0 -207
- data/spec/utopia/performance_spec.rb +0 -92
- data/spec/utopia/performance_spec/cache/head/readme.txt +0 -1
- data/spec/utopia/performance_spec/cache/meta/readme.txt +0 -1
- data/spec/utopia/performance_spec/config.ru +0 -35
- data/spec/utopia/performance_spec/lib/readme.txt +0 -1
- data/spec/utopia/performance_spec/pages/_heading.xnode +0 -2
- data/spec/utopia/performance_spec/pages/_page.xnode +0 -26
- data/spec/utopia/performance_spec/pages/api/controller.rb +0 -8
- data/spec/utopia/performance_spec/pages/errors/exception.xnode +0 -5
- data/spec/utopia/performance_spec/pages/errors/file-not-found.xnode +0 -5
- data/spec/utopia/performance_spec/pages/links.yaml +0 -2
- data/spec/utopia/performance_spec/pages/welcome/index.xnode +0 -17
- data/spec/utopia/rack_helper.rb +0 -32
- data/spec/utopia/redirection_spec.rb +0 -77
- data/spec/utopia/redirection_spec.ru +0 -27
- data/spec/utopia/session_spec.rb +0 -189
- data/spec/utopia/session_spec.ru +0 -24
- data/spec/utopia/setup_spec.rb +0 -56
- data/spec/utopia/static_spec.rb +0 -49
- data/spec/utopia/static_spec.ru +0 -5
- data/spec/utopia/static_spec/test.txt +0 -1
- data/utopia.gemspec +0 -52
- data/wiki/Gemfile +0 -9
- data/wiki/config.ru +0 -7
- data/wiki/pages/development-environment-setup/index.md +0 -16
- data/wiki/pages/faq/links.yaml +0 -2
- data/wiki/pages/faq/what-is-xnode/index.md +0 -37
- data/wiki/pages/faq/what-is-xnode/links.yaml +0 -2
- data/wiki/pages/index.md +0 -35
- data/wiki/pages/javascript/index.md +0 -77
- data/wiki/pages/javascript/links.yaml +0 -2
- data/wiki/pages/links.yaml +0 -2
- data/wiki/pages/middleware/content/index.md +0 -21
- data/wiki/pages/middleware/controller/actions/index.md +0 -76
- data/wiki/pages/middleware/controller/index.md +0 -62
- data/wiki/pages/middleware/controller/links.yaml +0 -4
- data/wiki/pages/middleware/controller/rewrite/index.md +0 -69
- data/wiki/pages/middleware/localization/index.md +0 -16
- data/wiki/pages/middleware/redirection/index.md +0 -17
- data/wiki/pages/middleware/session/index.md +0 -29
- data/wiki/pages/middleware/static/index.md +0 -13
- data/wiki/pages/server-setup/index.md +0 -52
- data/wiki/pages/testing/index.md +0 -15
- data/wiki/pages/updating-utopia/index.md +0 -63
- data/wiki/pages/your-first-page/index.md +0 -38
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# Controller::Rewrite
|
|
2
|
-
|
|
3
|
-
The <code class="language-ruby">Controller::Rewrite</code> layer can match and rewrite requests before they processed. This allows you to handle URLs like `/post/15/view` or `/blog/123-pictures-of-my-cat` easily. The basic rewrite operation is to extract some part of the path and optionally executes a block. That means that the path is modified before being passed on to the next layer in the controller, and controller instance variables may be set.
|
|
4
|
-
|
|
5
|
-
## Regular Expressions
|
|
6
|
-
|
|
7
|
-
In your `controller.rb`:
|
|
8
|
-
|
|
9
|
-
```ruby
|
|
10
|
-
prepend Rewrite, Actions
|
|
11
|
-
|
|
12
|
-
rewrite.extract_prefix permalink: /(?<id>\d+)-(?<title>.*)/ do |request, path, match|
|
|
13
|
-
# The rewrite matched, but there was no valid post, so we fail:
|
|
14
|
-
fail! unless @post = Post.find(@permalink[:id])
|
|
15
|
-
|
|
16
|
-
# If the path matched, but there was no suffix, we make it default to the post action:
|
|
17
|
-
if match.post_match.empty?
|
|
18
|
-
match.post_match.components << "post"
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
on 'post' do
|
|
23
|
-
# You can do further processing here.
|
|
24
|
-
fail! unless @post.published?
|
|
25
|
-
|
|
26
|
-
@comments = @post.comments.first(5)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
on 'edit' do
|
|
30
|
-
# You can do further processing here.
|
|
31
|
-
fail! unless @current_user&.editor?
|
|
32
|
-
end
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
In your `post.xnode`, as an example:
|
|
36
|
-
|
|
37
|
-
```trenni
|
|
38
|
-
<content:page>
|
|
39
|
-
<content:heading>Post #{attributes[:permalink][:id]} about #{attributes[:permalink][:title]}</content:heading>
|
|
40
|
-
|
|
41
|
-
<p>#{attributes[:post].content}</p>
|
|
42
|
-
</content:page>
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Keep in mind, that URLs like `/123-pictures-of-my-cat/edit` will work as expected, and hit the `edit` action of the controller.
|
|
46
|
-
|
|
47
|
-
## Restful Resources
|
|
48
|
-
|
|
49
|
-
Similar to the above, if we were solely interested in IDs, we could do the following:
|
|
50
|
-
|
|
51
|
-
```ruby
|
|
52
|
-
prepend Rewrite, Actions
|
|
53
|
-
|
|
54
|
-
rewrite.extract_prefix post_id: Integer do |request, path, match|
|
|
55
|
-
# The rewrite matched, but there was no valid post, so we fail:
|
|
56
|
-
fail! unless @post = Post.find(@post_id)
|
|
57
|
-
|
|
58
|
-
# If the path matched, but there was no suffix, we make it default to the post action:
|
|
59
|
-
if match.post_match.empty?
|
|
60
|
-
match.post_match.components << "post"
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
This will only match complete integers. Assuming this code is in `/blog/controller.rb`, it would match something like `/blog/123/view` and assign <code class="language-ruby">Integer("123")</code> to <code class="language-ruby">@post_id</code>.
|
|
66
|
-
|
|
67
|
-
### Matching.. other things
|
|
68
|
-
|
|
69
|
-
It's possible to match using <code class="language-ruby">Integer</code>, <code class="language-ruby">Float</code>, <code class="language-ruby">String</code>, and you can provide your own class which will be instantiated. If it doesn't match, raise an exception and the rewrite rule will fail.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Localization
|
|
2
|
-
|
|
3
|
-
The localization middleware uses the `Accept-Language` header to guess the preferred locale out of the given options. If a request path maps to a resource, that resource is returned. Otherwise, a localized request is made.
|
|
4
|
-
|
|
5
|
-
```ruby
|
|
6
|
-
use Utopia::Localization,
|
|
7
|
-
:default_locale => 'en',
|
|
8
|
-
:locales => ['en', 'de', 'ja', 'zh']
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Somewhere further down the chain, you can localize a resource:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
localization = Utopia::Localization[request]
|
|
15
|
-
show_welcome(localization.current_locale)
|
|
16
|
-
```
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Redirection
|
|
2
|
-
|
|
3
|
-
A set of flexible URI rewriting middleware which includes support for string mappings, regular expressions and status codes (e.g. 404 errors).
|
|
4
|
-
|
|
5
|
-
```ruby
|
|
6
|
-
# String (fast hash lookup) rewriting:
|
|
7
|
-
use Utopia::Redirection::Rewrite,
|
|
8
|
-
'/' => '/welcome/index'
|
|
9
|
-
|
|
10
|
-
# Redirect directories (e.g. /) to an index file (e.g. /index):
|
|
11
|
-
use Utopia::Redirection::DirectoryIndex,
|
|
12
|
-
index: 'index.html'
|
|
13
|
-
|
|
14
|
-
# Redirect (error) status codes to actual pages:
|
|
15
|
-
use Utopia::Redirection::Errors,
|
|
16
|
-
404 => '/errors/file-not-found'
|
|
17
|
-
```
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Session
|
|
2
|
-
|
|
3
|
-
The session management uses symmetric private key encryption to store data on the client and avoid tampering.
|
|
4
|
-
|
|
5
|
-
```ruby
|
|
6
|
-
use Utopia::Session,
|
|
7
|
-
:expires_after => 3600,
|
|
8
|
-
:secret => '40 or more random characters for your secret key'
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
All session data is stored on the client, but it's encrypted with a salt and the secret key. It would be hard for the client to decrypt the data without the secret.
|
|
12
|
-
|
|
13
|
-
## Using `environment.yaml`
|
|
14
|
-
|
|
15
|
-
The session secret should not be shared or ideally, not stored in source code. This can be easily achieved using an environment variable, stored in `environment.yaml` on the production server:
|
|
16
|
-
|
|
17
|
-
```ruby
|
|
18
|
-
use Utopia::Session,
|
|
19
|
-
:expires_after => 3600,
|
|
20
|
-
:secret => ENV['UTOPIA_SESSION_SECRET']
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
In development, the secret would be reset every time the server is restarted. To set a fixed secret on production, run the following:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
$ utopia server environment UTOPIA_SESSION_SECRET=$(head /dev/urandom | shasum | base64 | head -c 40)
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
This is done by default when using `utopia server create` and `utopia server update`.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Static
|
|
2
|
-
|
|
3
|
-
This middleware serves static files using the `mime-types` library. By default, it works with `Rack::Sendfile` and supports `ETag` based caching. Normally, you'd prefer to put static files into `public/_static` but it's also acceptable to put static content into `pages/` if it makes sense.
|
|
4
|
-
|
|
5
|
-
```ruby
|
|
6
|
-
use Utopia::Static,
|
|
7
|
-
# The root path to serve files from:
|
|
8
|
-
root: "path/to/root",
|
|
9
|
-
# The mime-types to recognize/serve:
|
|
10
|
-
types: [:default, :xiph],
|
|
11
|
-
# Cache-Control header for files:
|
|
12
|
-
cache_control: 'public, max-age=7200'
|
|
13
|
-
```
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# Server Setup
|
|
2
|
-
|
|
3
|
-
Utopia is designed to make deployment to remote servers easy.
|
|
4
|
-
|
|
5
|
-
## Deployment
|
|
6
|
-
|
|
7
|
-
The preferred method of deployment to a production server is via git. The `utopia` command assists with setup of a remote git repository on the server. It will setup a `git` `post-update` hook which will deploy the site correctly and restart the application server for that site.
|
|
8
|
-
|
|
9
|
-
To setup a server for deployment:
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
$ mkdir /srv/http/www.example.com
|
|
13
|
-
$ cd /srv/http/www.example.com
|
|
14
|
-
$ sudo -u http utopia server create
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
On your development machine, you should setup the git remote:
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
$ git remote add production ssh://remote/srv/http/www.example.com
|
|
21
|
-
$ git push --set-upstream production master
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Default Environment
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
```bash
|
|
29
|
-
$ sudo -u http utopia environment RACK_ENV=production DATABASE_ENV=production_cluster_primary
|
|
30
|
-
ENV["RACK_ENV"] will default to "production" unless otherwise specified.
|
|
31
|
-
ENV["DATABASE_ENV"] will default to "production_cluster_primary" unless otherwise specified.
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
To set a value, write `KEY=VALUE`. To unset a key, write `KEY`.
|
|
35
|
-
|
|
36
|
-
When you run `rake` tasks or spawn a server, the values in `config/environment.yaml` will be the defaults. You can override them by manually specifying them, e.g. `DATABASE_ENV=development rake db:info`.
|
|
37
|
-
|
|
38
|
-
## Platform
|
|
39
|
-
|
|
40
|
-
The best deployment platform for Utopia is Linux, using [falcon](https://github.com/socketry/falcon).
|
|
41
|
-
|
|
42
|
-
### Sudo Setup
|
|
43
|
-
|
|
44
|
-
Create a file `/etc/sudoers.d/http` with the following contents:
|
|
45
|
-
|
|
46
|
-
```sudoers
|
|
47
|
-
# Allow user samuel to check out code as user http using git:
|
|
48
|
-
%wheel ALL=(http) NOPASSWD: ALL
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
This allows the deploy task to correctly checkout code as user `http`.
|
|
52
|
-
|
data/wiki/pages/testing/index.md
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Testing
|
|
2
|
-
|
|
3
|
-
Utopia websites include a default set of tests, and associated `rake test` tasks. These specs can test against the actual running website. By default, [covered](https://github.com/socketry/covered) is included for coverage testing.
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
$ rake coverage test
|
|
7
|
-
|
|
8
|
-
my website
|
|
9
|
-
should have an accessible front page
|
|
10
|
-
|
|
11
|
-
Finished in 0.44849 seconds (files took 0.15547 seconds to load)
|
|
12
|
-
1 example, 0 failures
|
|
13
|
-
|
|
14
|
-
Coverage report generated for RSpec. 5 / 5 LOC (100.0%) covered.
|
|
15
|
-
```
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Updating Utopia
|
|
2
|
-
|
|
3
|
-
Utopia provides a model for both local development (`utopia site create`) and deployment (`utopia server create`). In addition, Utopia provides a basic upgrade path for existing sites when things within the framework change. These are not always automatic, so below are some recipes for how to update your site.
|
|
4
|
-
|
|
5
|
-
## Site Update
|
|
6
|
-
|
|
7
|
-
Utopia as a framework introduces changes and versions change according to semantic versioning.
|
|
8
|
-
|
|
9
|
-
### Controller Update 1.9.x to 2.x
|
|
10
|
-
|
|
11
|
-
The controller layer no longer automatically prepends the `Actions` layer. The following program does a best effort attempt to update existing controllers:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
#!/usr/bin/env ruby
|
|
15
|
-
|
|
16
|
-
paths = Dir.glob("**/controller.rb")
|
|
17
|
-
|
|
18
|
-
paths.each do |path|
|
|
19
|
-
lines = File.readlines(path)
|
|
20
|
-
|
|
21
|
-
prepend_line_index = lines.first(5).find_index{|line| line =~ /prepend/}
|
|
22
|
-
|
|
23
|
-
unless prepend_line_index
|
|
24
|
-
puts "Updating #{path}.."
|
|
25
|
-
File.open(path, "w") do |file|
|
|
26
|
-
file.puts "\nprepend Actions"
|
|
27
|
-
file.write lines.join
|
|
28
|
-
end
|
|
29
|
-
else
|
|
30
|
-
prepend_line = lines[prepend_line_index]
|
|
31
|
-
|
|
32
|
-
unless prepend_line =~ /Actions/
|
|
33
|
-
if lines.any?{|line| line =~ /on/}
|
|
34
|
-
lines[prepend_line_index] = "#{prepend_line.chomp}, Actions\n"
|
|
35
|
-
|
|
36
|
-
puts "Updating #{path}.."
|
|
37
|
-
File.open(path, "w") do |file|
|
|
38
|
-
file.write lines.join
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### View Update 1.9.x to 2.x
|
|
47
|
-
|
|
48
|
-
Dynamic tags in 2.x require namespaces. This affects all `.xnode` files, in particular the following 3 cases:
|
|
49
|
-
|
|
50
|
-
1. Rewrite `<(/?)(NAME)(\W)` to `<$1content:$2$3` where NAME is a tag which would expand using a `_NAME.xnode` file.
|
|
51
|
-
2. Rewrite `<content/>` to `<utopia:content/>`. This affects `<node>`, `<deferred>`, `<environment>` tags.
|
|
52
|
-
3. Rewrite `partial 'NAME'` to be `partial 'content:NAME'`.
|
|
53
|
-
|
|
54
|
-
## Server Update
|
|
55
|
-
|
|
56
|
-
The utopia server git hooks are updated occasionally to improve the deployment process or to handle changes in the underlying process.
|
|
57
|
-
|
|
58
|
-
You can run the update process on the server to bring the git hooks up to the latest version.
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
$ cd /srv/http/website
|
|
62
|
-
$ utopia server update
|
|
63
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Your First Page
|
|
2
|
-
|
|
3
|
-
To setup the default site, simply create a directory and use the `utopia` command:
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
$ mkdir www.example.com
|
|
7
|
-
$ cd www.example.com
|
|
8
|
-
$ utopia site create
|
|
9
|
-
$ rake server
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
You will now have a basic template site running on `https://localhost:9292`.
|
|
13
|
-
|
|
14
|
-
## Welcome Page
|
|
15
|
-
|
|
16
|
-
Utopia includes a redirection middleware to redirect all root-level requests to a given URI. The default being `/welcome/index`:
|
|
17
|
-
|
|
18
|
-
```ruby
|
|
19
|
-
# in config.ru
|
|
20
|
-
|
|
21
|
-
use Utopia::Redirection::Rewrite,
|
|
22
|
-
'/' => '/welcome/index'
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
This page includes a basic overview of Utopia. Most of it's standard HTML, except for the outer `<content:page>` tag. Utopia uses the name `page` to lookup the file-system hierarchy. First, it looks for `/welcome/_page.xnode`, and then it looks for `/_page.xnode` which it finds. This page template includes a tag `<utopia:content/>` which is replaced with the inner body of the `<content:page>` tag. This recursive lookup is the heart of Utopia.
|
|
26
|
-
|
|
27
|
-
## Links
|
|
28
|
-
|
|
29
|
-
Utopia is a content-centric web application platform. It leverages the file-system to provide a mapping between logical resources and files on disk. The primary mode of mapping incoming requests to specific nodes (content) is done using the `links.yaml` file.
|
|
30
|
-
|
|
31
|
-
The links file associates metadata with node names for a given directory. This can include things like redirects, titles, descriptions, etc. You can add any metadata you like, to support your specific use-case. The primary use of the links files is to provide site structure, e.g. menus. In addition, they can function as a rudimentary data-store for static information, e.g. a list of applications (each with it's own page), a list of features, etc.
|
|
32
|
-
|
|
33
|
-
You'll notice that there is a file `/links.yaml`. This file contains important metadata relating to the `errors` subdirectory. As we don't want these nodes showing up in a top level menu, we mark them as `display: false`
|
|
34
|
-
|
|
35
|
-
```yaml
|
|
36
|
-
errors:
|
|
37
|
-
display: false
|
|
38
|
-
```
|