utopia 2.0.3 → 2.1.0
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/.rspec +0 -1
- data/.travis.yml +5 -5
- data/README.md +6 -0
- data/bin/utopia +1 -1
- data/documentation/Gemfile +1 -4
- data/documentation/Guardfile +13 -12
- data/documentation/config.ru +0 -2
- data/documentation/pages/_page.xnode +0 -2
- data/documentation/pages/wiki/updating-utopia/content.md +9 -1
- data/lib/utopia/command.rb +4 -0
- data/lib/utopia/content.rb +3 -3
- data/lib/utopia/content/document.rb +1 -1
- data/lib/utopia/content/link.rb +1 -1
- data/lib/utopia/path.rb +16 -52
- data/lib/utopia/redirection.rb +7 -1
- data/lib/utopia/version.rb +1 -1
- data/setup/site/.rspec +0 -1
- data/setup/site/Gemfile +2 -3
- data/setup/site/Guardfile +16 -4
- data/setup/site/public/_static/site.css +5 -1
- data/spec/utopia/controller/respond_spec.rb +20 -0
- data/spec/utopia/controller/respond_spec.ru +3 -0
- data/spec/utopia/controller/respond_spec/rewrite/controller.rb +12 -0
- data/spec/utopia/path_spec.rb +100 -110
- data/spec/utopia/setup_spec.rb +7 -5
- data/utopia.gemspec +2 -1
- metadata +8 -6
- data/documentation/config/puma.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0f3495be3876412f9a11d21c4b836197905a1f4
|
4
|
+
data.tar.gz: cf908f69663dd5ed3319d3197445008b1afa4068
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8e165f8e46e805d86abdbaeb91188b62e1d6ee900b41184741912c32b88c00085cc90e36f4494048d0d02c705b3a1729059571c9c7ffd16ded1f3e75e39f689
|
7
|
+
data.tar.gz: a032b62905906e418ad36d946725208cf07080332050cb78fa655624700d5e47d9be65513e9eaa4364ab532bae9383f7b52cc564870b929afd956269686d5966
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
@@ -6,16 +6,16 @@ before_install:
|
|
6
6
|
# For testing purposes:
|
7
7
|
- git config --global user.email "samuel@oriontransfer.net"
|
8
8
|
- git config --global user.name "Samuel Williams"
|
9
|
+
# https://github.com/rubygems/rubygems/issues/1448
|
10
|
+
- gem update --system
|
9
11
|
rvm:
|
10
|
-
- 2.2
|
11
|
-
- 2.3
|
12
|
-
- 2.4
|
12
|
+
- 2.2
|
13
|
+
- 2.3
|
14
|
+
- 2.4
|
13
15
|
- jruby-head
|
14
16
|
- ruby-head
|
15
|
-
- rbx-3.65
|
16
17
|
env: COVERAGE=true BENCHMARK=true
|
17
18
|
matrix:
|
18
19
|
allow_failures:
|
19
|
-
- rvm: rbx-3.65
|
20
20
|
- rvm: ruby-head
|
21
21
|
- rvm: jruby-head
|
data/README.md
CHANGED
@@ -54,12 +54,18 @@ There is an excellent documentation wiki included with the source code. Simply c
|
|
54
54
|
- [Trenni](https://github.com/ioquatix/trenni) — Template and markup parsers, markup generation.
|
55
55
|
- [Trenni::Formatters](https://github.com/ioquatix/trenni-formatters) — Helpers for HTML generation including views and forms.
|
56
56
|
- [Utopia::Gallery](https://github.com/ioquatix/utopia-gallery) — A fast photo gallery based on [libvips](https://github.com/jcupitt/libvips).
|
57
|
+
- [Utopia::Analytics](https://github.com/ioquatix/utopia-analytics) — Simple integration with Google Analytics.
|
57
58
|
- [Rack::Freeze](https://github.com/ioquatix/rack-freeze) — Multi-thread safety in Rack.
|
58
59
|
- [HTTP::Accept](https://github.com/ioquatix/http-accept) — RFC compliant header parser.
|
59
60
|
- [Samovar](https://github.com/ioquatix/samovar) — Command line parser used by Utopia.
|
60
61
|
- [Mapping](https://github.com/ioquatix/mapping) — Provide structured conversions for web interfaces.
|
61
62
|
- [Rack::Test::Body](https://github.com/ioquatix/rack-test-body) — Provide convenient helpers for testing web interfaces.
|
62
63
|
|
64
|
+
### Applications
|
65
|
+
|
66
|
+
- [Financier](https://github.com/ioquatix/financier) — A small business management platform.
|
67
|
+
- [mail.oriontransfer.net](https://github.com/oriontransfer/mail.oriontransfer.net) - Mail server account management.
|
68
|
+
|
63
69
|
## License
|
64
70
|
|
65
71
|
Released under the MIT license.
|
data/bin/utopia
CHANGED
data/documentation/Gemfile
CHANGED
@@ -12,8 +12,7 @@ gem "kramdown"
|
|
12
12
|
|
13
13
|
group :development do
|
14
14
|
# For `rake server`:
|
15
|
-
gem "
|
16
|
-
gem "guard-puma"
|
15
|
+
gem "guard-falcon"
|
17
16
|
|
18
17
|
# For `rake console`:
|
19
18
|
gem "pry"
|
@@ -22,8 +21,6 @@ group :development do
|
|
22
21
|
# For `rspec` testing:
|
23
22
|
gem "rspec"
|
24
23
|
gem "simplecov"
|
25
|
-
|
26
|
-
gem "launchy"
|
27
24
|
end
|
28
25
|
|
29
26
|
group :production do
|
data/documentation/Guardfile
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
|
2
2
|
group :development do
|
3
|
-
guard :
|
3
|
+
guard :falcon do
|
4
4
|
watch('Gemfile.lock')
|
5
5
|
watch('config.ru')
|
6
6
|
watch(%r{^config|lib|pages/.*})
|
7
|
+
notification :off
|
7
8
|
end
|
8
9
|
|
9
|
-
# Open the documentation website when the command is run, once puma has started:
|
10
|
-
require 'launchy'
|
11
|
-
$first_time = true
|
12
|
-
|
13
|
-
url_path = 'run/url.txt'
|
14
|
-
watch(url_path) do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
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
|
20
21
|
end
|
data/documentation/config.ru
CHANGED
@@ -9,8 +9,6 @@
|
|
9
9
|
<title>Utopia</title>
|
10
10
|
<?r end ?>
|
11
11
|
|
12
|
-
<base href="#{first.node.uri_path}"/>
|
13
|
-
|
14
12
|
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous" />
|
15
13
|
|
16
14
|
<link rel="icon" type="image/png" href="/_static/icon.png" />
|
@@ -6,7 +6,7 @@ Utopia provides a model for both local development (`utopia site create`) and de
|
|
6
6
|
|
7
7
|
Utopia as a framework introduces changes and versions change according to semantic versioning.
|
8
8
|
|
9
|
-
### Controller Update 1.9.x to 2.
|
9
|
+
### Controller Update 1.9.x to 2.x
|
10
10
|
|
11
11
|
The controller layer no longer automatically prepends the `Actions` layer. The following program does a best effort attempt to update existing controllers:
|
12
12
|
|
@@ -43,6 +43,14 @@ paths.each do |path|
|
|
43
43
|
end
|
44
44
|
```
|
45
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
|
+
|
46
54
|
## Server Update
|
47
55
|
|
48
56
|
The utopia server git hooks are updated occasionally to improve the deployment process or to handle changes in the underlying process.
|
data/lib/utopia/command.rb
CHANGED
@@ -25,6 +25,10 @@ require_relative 'command/server'
|
|
25
25
|
|
26
26
|
module Utopia
|
27
27
|
module Command
|
28
|
+
def self.parse(*args)
|
29
|
+
Top.parse(*args)
|
30
|
+
end
|
31
|
+
|
28
32
|
# The top level utopia command.
|
29
33
|
class Top < Samovar::Command
|
30
34
|
self.description = "A website development and deployment framework."
|
data/lib/utopia/content.rb
CHANGED
@@ -104,11 +104,11 @@ module Utopia
|
|
104
104
|
|
105
105
|
# Check if the request is to a non-specific index. This only works for requests with a given name:
|
106
106
|
basename = path.basename
|
107
|
-
directory_path = File.join(@root, path.dirname.components, basename
|
107
|
+
directory_path = File.join(@root, path.dirname.components, basename)
|
108
108
|
|
109
|
-
# If the request for /foo/bar
|
109
|
+
# If the request for /foo/bar is actually a directory, rewrite it to /foo/bar/index:
|
110
110
|
if File.directory? directory_path
|
111
|
-
index_path = [basename
|
111
|
+
index_path = [basename, INDEX]
|
112
112
|
|
113
113
|
return [307, {HTTP::LOCATION => path.dirname.join(index_path).to_s}, []]
|
114
114
|
end
|
@@ -24,7 +24,7 @@ require_relative 'markup'
|
|
24
24
|
|
25
25
|
module Utopia
|
26
26
|
class Content
|
27
|
-
# This error is
|
27
|
+
# This error is raised if a tag doesn't match up when parsing.
|
28
28
|
class UnbalancedTagError < StandardError
|
29
29
|
def initialize(tag)
|
30
30
|
@tag = tag
|
data/lib/utopia/content/link.rb
CHANGED
data/lib/utopia/path.rb
CHANGED
@@ -19,52 +19,6 @@
|
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
21
|
module Utopia
|
22
|
-
class Basename
|
23
|
-
# A basename represents a file name with an optional extension. You can specify a specific extension to identify or specify true to select any extension after the last trailing dot.
|
24
|
-
def initialize(name, extension = false)
|
25
|
-
if extension
|
26
|
-
if extension == true
|
27
|
-
offset = name.rindex('.')
|
28
|
-
else
|
29
|
-
offset = name.rindex(extension) - 1
|
30
|
-
end
|
31
|
-
|
32
|
-
@name = name[0...offset]
|
33
|
-
@extension = name[offset+1..-1]
|
34
|
-
else
|
35
|
-
@name = name
|
36
|
-
@extension = nil
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def rename(name)
|
41
|
-
copy = self.dup
|
42
|
-
|
43
|
-
copy.send(:instance_variable_set, :@name, name)
|
44
|
-
|
45
|
-
return copy
|
46
|
-
end
|
47
|
-
|
48
|
-
attr :name
|
49
|
-
attr :extension
|
50
|
-
|
51
|
-
def parts
|
52
|
-
@parts ||= @name.split('.')
|
53
|
-
end
|
54
|
-
|
55
|
-
def locale
|
56
|
-
parts.last if parts.size > 1
|
57
|
-
end
|
58
|
-
|
59
|
-
def to_str
|
60
|
-
"#{name}#{extension}"
|
61
|
-
end
|
62
|
-
|
63
|
-
def to_s
|
64
|
-
to_str
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
22
|
# Represents a path as an array of path components. Useful for efficient URL manipulation.
|
69
23
|
class Path
|
70
24
|
include Comparable
|
@@ -143,6 +97,14 @@ module Utopia
|
|
143
97
|
self.new(unescape(string).split(SEPARATOR, -1))
|
144
98
|
end
|
145
99
|
|
100
|
+
def self.load(value)
|
101
|
+
from_string(value) if value
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.dump(instance)
|
105
|
+
instance.to_s if instance
|
106
|
+
end
|
107
|
+
|
146
108
|
def self.create(path)
|
147
109
|
case path
|
148
110
|
when Path
|
@@ -155,7 +117,11 @@ module Utopia
|
|
155
117
|
return self.new([path])
|
156
118
|
end
|
157
119
|
end
|
158
|
-
|
120
|
+
|
121
|
+
def replace(other_path)
|
122
|
+
@components = other_path.components.dup
|
123
|
+
end
|
124
|
+
|
159
125
|
def include?(*args)
|
160
126
|
@components.include?(*args)
|
161
127
|
end
|
@@ -200,9 +166,7 @@ module Utopia
|
|
200
166
|
end
|
201
167
|
end
|
202
168
|
|
203
|
-
|
204
|
-
to_str
|
205
|
-
end
|
169
|
+
alias to_s to_str
|
206
170
|
|
207
171
|
def to_a
|
208
172
|
@components
|
@@ -267,8 +231,8 @@ module Utopia
|
|
267
231
|
return self.class.new(result)
|
268
232
|
end
|
269
233
|
|
270
|
-
def basename
|
271
|
-
|
234
|
+
def basename
|
235
|
+
@components.last
|
272
236
|
end
|
273
237
|
|
274
238
|
def dirname(count = 1)
|
data/lib/utopia/redirection.rb
CHANGED
@@ -52,10 +52,16 @@ module Utopia
|
|
52
52
|
super
|
53
53
|
end
|
54
54
|
|
55
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
56
|
+
|
57
|
+
def unhandled_error?(response)
|
58
|
+
response[0] >= 400 && !response[1].include?(CONTENT_TYPE)
|
59
|
+
end
|
60
|
+
|
55
61
|
def call(env)
|
56
62
|
response = @app.call(env)
|
57
63
|
|
58
|
-
if response
|
64
|
+
if unhandled_error?(response) && location = @codes[response[0]]
|
59
65
|
error_request = env.merge(Rack::PATH_INFO => location, Rack::REQUEST_METHOD => Rack::GET)
|
60
66
|
error_response = @app.call(error_request)
|
61
67
|
|
data/lib/utopia/version.rb
CHANGED
data/setup/site/.rspec
CHANGED
data/setup/site/Gemfile
CHANGED
@@ -3,7 +3,7 @@ source "https://rubygems.org"
|
|
3
3
|
|
4
4
|
gem "utopia", "~> $UTOPIA_VERSION"
|
5
5
|
# gem "utopia-gallery"
|
6
|
-
# gem "utopia-
|
6
|
+
# gem "utopia-analytics"
|
7
7
|
|
8
8
|
gem "rake"
|
9
9
|
gem "bundler"
|
@@ -12,8 +12,7 @@ gem "rack-freeze", "~> 1.2"
|
|
12
12
|
|
13
13
|
group :development do
|
14
14
|
# For `rake server`:
|
15
|
-
gem "
|
16
|
-
gem "guard-puma", require: false
|
15
|
+
gem "guard-falcon", require: false
|
17
16
|
gem 'guard-rspec', require: false
|
18
17
|
|
19
18
|
# For `rake console`:
|
data/setup/site/Guardfile
CHANGED
@@ -1,17 +1,29 @@
|
|
1
1
|
|
2
2
|
group :development do
|
3
|
-
guard :
|
3
|
+
guard :falcon, bind: "tcp://localhost:8080" do
|
4
4
|
watch('Gemfile.lock')
|
5
5
|
watch('config.ru')
|
6
6
|
watch(%r{^config|lib|pages/.*})
|
7
|
+
|
8
|
+
notification :off
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
12
|
group :test do
|
11
13
|
guard :rspec, cmd: 'rspec' do
|
14
|
+
# Notifications can get a bit tedious:
|
15
|
+
# notification :off
|
16
|
+
|
17
|
+
# Re-run specs if they are changed:
|
12
18
|
watch(%r{^spec/.+_spec\.rb$})
|
13
|
-
watch(
|
14
|
-
|
15
|
-
|
19
|
+
watch('spec/spec_helper.rb') {'spec'}
|
20
|
+
|
21
|
+
# Run relevent specs if files in `lib/` or `pages/` are changed:
|
22
|
+
watch(%r{^lib/(.+)\.rb$}) {|match| "spec/lib/#{match[1]}_spec.rb" }
|
23
|
+
watch(%r{^pages/(.+)\.(rb|xnode)$}) {|match| "spec/pages/#{match[1]}_spec.rb"}
|
24
|
+
watch(%r{^pages/(.+)controller\.rb$}) {|match| Dir.glob("spec/pages/#{match[1]}*_spec.rb")}
|
25
|
+
|
26
|
+
# If any files in pages changes, ensure the website still works:
|
27
|
+
watch(%r{^pages/.*}) {'spec/website_spec.rb'}
|
16
28
|
end
|
17
29
|
end
|
@@ -138,5 +138,25 @@ module Utopia::Controller::RespondSpec
|
|
138
138
|
expect(last_response.headers['Content-Type']).to be == 'application/json; charset=utf-8'
|
139
139
|
expect(last_response.body).to be == '{}'
|
140
140
|
end
|
141
|
+
|
142
|
+
it "should give record as JSON" do
|
143
|
+
header 'Accept', 'application/json'
|
144
|
+
|
145
|
+
get '/rewrite/2/show'
|
146
|
+
|
147
|
+
expect(last_response.status).to be == 200
|
148
|
+
expect(last_response.headers['Content-Type']).to be == 'application/json; charset=utf-8'
|
149
|
+
expect(last_response.body).to be == '{"id":2,"foo":"bar"}'
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should give error as JSON" do
|
153
|
+
header 'Accept', 'application/json'
|
154
|
+
|
155
|
+
get '/rewrite/1/show'
|
156
|
+
|
157
|
+
expect(last_response.status).to be == 404
|
158
|
+
expect(last_response.headers['Content-Type']).to be == 'application/json; charset=utf-8'
|
159
|
+
expect(last_response.body).to be == '{"message":"Could not find record"}'
|
160
|
+
end
|
141
161
|
end
|
142
162
|
end
|
data/spec/utopia/path_spec.rb
CHANGED
@@ -22,131 +22,121 @@
|
|
22
22
|
|
23
23
|
require 'utopia/path'
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
expect(root.components).to be == ['', '']
|
31
|
-
expect(root.to_local_path).to be == '/'
|
32
|
-
end
|
25
|
+
RSpec.describe Utopia::Path do
|
26
|
+
context "coder" do
|
27
|
+
subject {"foo/bar/baz"}
|
28
|
+
let(:instance) {described_class.load(subject)}
|
33
29
|
|
34
|
-
it "
|
35
|
-
|
36
|
-
|
37
|
-
expect(root).to be_absolute
|
38
|
-
expect(root + Utopia::Path["foo/bar"]).to be == Utopia::Path["/foo/bar"]
|
30
|
+
it "loads a string" do
|
31
|
+
expect(instance).to be_a described_class
|
39
32
|
end
|
40
33
|
|
41
|
-
it "
|
42
|
-
|
43
|
-
|
44
|
-
descendants = root.descend.to_a
|
45
|
-
|
46
|
-
expect(descendants[0].components).to be == [""]
|
47
|
-
expect(descendants[1].components).to be == ["", "foo"]
|
48
|
-
expect(descendants[2].components).to be == ["", "foo", "bar"]
|
49
|
-
|
50
|
-
ascendants = root.ascend.to_a
|
51
|
-
|
52
|
-
expect(descendants.reverse).to be == ascendants
|
34
|
+
it "dump generates the original string" do
|
35
|
+
expect(described_class.dump(instance)).to be == subject
|
53
36
|
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be root path" do
|
40
|
+
root = Utopia::Path["/"]
|
54
41
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
42
|
+
expect(root.components).to be == ['', '']
|
43
|
+
expect(root.to_local_path).to be == '/'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should concatenate absolute paths" do
|
47
|
+
root = Utopia::Path["/"]
|
62
48
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
expect(basename.extension).to be == 'html'
|
70
|
-
end
|
49
|
+
expect(root).to be_absolute
|
50
|
+
expect(root + Utopia::Path["foo/bar"]).to be == Utopia::Path["/foo/bar"]
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should compute all descendant paths" do
|
54
|
+
root = Utopia::Path["/foo/bar"]
|
71
55
|
|
72
|
-
|
73
|
-
path = Utopia::Path["foo/bar"]
|
74
|
-
|
75
|
-
expect(path).to_not be_directory
|
76
|
-
|
77
|
-
expect(path.to_directory).to be_directory
|
78
|
-
|
79
|
-
dir_path = path.to_directory
|
80
|
-
expect(dir_path.to_directory).to be == dir_path
|
81
|
-
end
|
56
|
+
descendants = root.descend.to_a
|
82
57
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
expect(path.start_with?(path.dirname)).to be true
|
87
|
-
end
|
58
|
+
expect(descendants[0].components).to be == [""]
|
59
|
+
expect(descendants[1].components).to be == ["", "foo"]
|
60
|
+
expect(descendants[2].components).to be == ["", "foo", "bar"]
|
88
61
|
|
89
|
-
|
90
|
-
path = Utopia::Path["/a/b/c/d/e"]
|
91
|
-
|
92
|
-
expect(path.split('c')).to be == [Utopia::Path['/a/b'], Utopia::Path['d/e']]
|
93
|
-
end
|
62
|
+
ascendants = root.ascend.to_a
|
94
63
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
expect{path[0] = 'bob'}.to raise_exception(RuntimeError)
|
103
|
-
end
|
64
|
+
expect(descendants.reverse).to be == ascendants
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should be able to remove relative path entries" do
|
68
|
+
path = Utopia::Path["/foo/bar/../baz/."]
|
69
|
+
expect(path.simplify.components).to be == ['', 'foo', 'baz']
|
104
70
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
71
|
+
path = Utopia::Path["/foo/bar/../baz/./"]
|
72
|
+
expect(path.simplify.components).to be == ['', 'foo', 'baz', '']
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should be able to convert into a directory" do
|
76
|
+
path = Utopia::Path["foo/bar"]
|
110
77
|
|
111
|
-
|
112
|
-
path = Utopia::Path["foo"]
|
113
|
-
|
114
|
-
expect(path.basename.locale).to be == nil
|
115
|
-
end
|
78
|
+
expect(path).to_not be_directory
|
116
79
|
|
117
|
-
|
118
|
-
root = Utopia::Path['/root']
|
119
|
-
path = Utopia::Path["dir/foo.html"]
|
120
|
-
|
121
|
-
expect(path.expand(root)).to be == (root + path)
|
122
|
-
end
|
80
|
+
expect(path.to_directory).to be_directory
|
123
81
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
82
|
+
dir_path = path.to_directory
|
83
|
+
expect(dir_path.to_directory).to be == dir_path
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should start with the given path" do
|
87
|
+
path = Utopia::Path["/a/b/c/d/e"]
|
129
88
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
expect(short.components).to be == ["..", "..", "index"]
|
137
|
-
|
138
|
-
expect((output + short).simplify).to be == input
|
139
|
-
end
|
89
|
+
expect(path.start_with?(path.dirname)).to be true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should split at the specified point" do
|
93
|
+
path = Utopia::Path["/a/b/c/d/e"]
|
140
94
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
95
|
+
expect(path.split('c')).to be == [Utopia::Path['/a/b'], Utopia::Path['d/e']]
|
96
|
+
end
|
97
|
+
|
98
|
+
it "shouldn't be able to modify frozen paths" do
|
99
|
+
path = Utopia::Path["dir/foo.html"]
|
100
|
+
|
101
|
+
path.freeze
|
102
|
+
|
103
|
+
expect(path.frozen?).to be true
|
104
|
+
|
105
|
+
expect{path[0] = 'bob'}.to raise_exception(RuntimeError)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should expand relative paths" do
|
109
|
+
root = Utopia::Path['/root']
|
110
|
+
path = Utopia::Path["dir/foo.html"]
|
111
|
+
|
112
|
+
expect(path.expand(root)).to be == (root + path)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "shouldn't expand absolute paths" do
|
116
|
+
root = Utopia::Path['/root']
|
117
|
+
|
118
|
+
expect(root.expand(root)).to be == root
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should give the shortest path for outer paths" do
|
122
|
+
input = Utopia::Path.create("/a/b/c/index")
|
123
|
+
output = Utopia::Path.create("/a/b/c/d/e/")
|
124
|
+
|
125
|
+
short = input.shortest_path(output)
|
126
|
+
|
127
|
+
expect(short.components).to be == ["..", "..", "index"]
|
128
|
+
|
129
|
+
expect((output + short).simplify).to be == input
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should give the shortest path for inner paths" do
|
133
|
+
input = Utopia::Path.create("/a/b/c/index")
|
134
|
+
output = Utopia::Path.create("/a/")
|
135
|
+
|
136
|
+
short = input.shortest_path(output)
|
137
|
+
|
138
|
+
expect(short.components).to be == ["b", "c", "index"]
|
139
|
+
|
140
|
+
expect((output + short).simplify).to be == input
|
151
141
|
end
|
152
142
|
end
|
data/spec/utopia/setup_spec.rb
CHANGED
@@ -22,6 +22,8 @@ require 'fileutils'
|
|
22
22
|
require 'tmpdir'
|
23
23
|
require 'yaml'
|
24
24
|
|
25
|
+
require 'open3'
|
26
|
+
|
25
27
|
RSpec.describe "utopia executable" do
|
26
28
|
let(:utopia) {File.expand_path("../../bin/utopia", __dir__)}
|
27
29
|
let(:gemspec) {Gem::Specification.load File.expand_path("../../utopia.gemspec", __dir__)}
|
@@ -37,6 +39,9 @@ RSpec.describe "utopia executable" do
|
|
37
39
|
|
38
40
|
around(:each) do |example|
|
39
41
|
Bundler.with_clean_env do
|
42
|
+
# If we don't delete this, when running on travis, it will try submit the coverage report.
|
43
|
+
ENV.delete('COVERAGE')
|
44
|
+
|
40
45
|
# This allows the utopia command to load the correct library:
|
41
46
|
ENV['RUBYLIB'] = File.expand_path("../../lib", __dir__)
|
42
47
|
|
@@ -45,14 +50,11 @@ RSpec.describe "utopia executable" do
|
|
45
50
|
end
|
46
51
|
|
47
52
|
def sh_status(*args)
|
48
|
-
|
49
|
-
system(*args)
|
50
|
-
return $?
|
53
|
+
system(*args) ? 0 : false
|
51
54
|
end
|
52
55
|
|
53
56
|
def sh_stdout(*args)
|
54
|
-
|
55
|
-
output = %x[#{args.join ' '}]
|
57
|
+
output, status = Open3.capture2(*args)
|
56
58
|
return output
|
57
59
|
end
|
58
60
|
|
data/utopia.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
EOF
|
15
15
|
spec.summary = %q{Utopia is a framework for building dynamic content-driven websites.}
|
16
16
|
spec.homepage = 'https://github.com/ioquatix/utopia'
|
17
|
+
spec.license = "MIT"
|
17
18
|
|
18
19
|
spec.files = `git ls-files`.split($/)
|
19
20
|
spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -37,7 +38,7 @@ Gem::Specification.new do |spec|
|
|
37
38
|
spec.add_dependency 'concurrent-ruby', '~> 1.0'
|
38
39
|
|
39
40
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
40
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
41
|
+
spec.add_development_dependency 'rspec', '~> 3.6'
|
41
42
|
spec.add_development_dependency 'puma'
|
42
43
|
spec.add_development_dependency 'rake'
|
43
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utopia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trenni
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '3.
|
145
|
+
version: '3.6'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '3.
|
152
|
+
version: '3.6'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: puma
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -211,7 +211,6 @@ files:
|
|
211
211
|
- documentation/config.ru
|
212
212
|
- documentation/config/README.md
|
213
213
|
- documentation/config/environment.rb
|
214
|
-
- documentation/config/puma.rb
|
215
214
|
- documentation/lib/readme.txt
|
216
215
|
- documentation/pages/_editor.xnode
|
217
216
|
- documentation/pages/_heading.xnode
|
@@ -486,6 +485,7 @@ files:
|
|
486
485
|
- spec/utopia/controller/respond_spec/api/controller.rb
|
487
486
|
- spec/utopia/controller/respond_spec/errors/controller.rb
|
488
487
|
- spec/utopia/controller/respond_spec/errors/file-not-found.xnode
|
488
|
+
- spec/utopia/controller/respond_spec/rewrite/controller.rb
|
489
489
|
- spec/utopia/controller/rewrite_spec.rb
|
490
490
|
- spec/utopia/controller/sequence_spec.rb
|
491
491
|
- spec/utopia/controller/variables_spec.rb
|
@@ -530,7 +530,8 @@ files:
|
|
530
530
|
- spec/utopia/static_spec/test.txt
|
531
531
|
- utopia.gemspec
|
532
532
|
homepage: https://github.com/ioquatix/utopia
|
533
|
-
licenses:
|
533
|
+
licenses:
|
534
|
+
- MIT
|
534
535
|
metadata: {}
|
535
536
|
post_install_message:
|
536
537
|
rdoc_options: []
|
@@ -608,6 +609,7 @@ test_files:
|
|
608
609
|
- spec/utopia/controller/respond_spec/api/controller.rb
|
609
610
|
- spec/utopia/controller/respond_spec/errors/controller.rb
|
610
611
|
- spec/utopia/controller/respond_spec/errors/file-not-found.xnode
|
612
|
+
- spec/utopia/controller/respond_spec/rewrite/controller.rb
|
611
613
|
- spec/utopia/controller/rewrite_spec.rb
|
612
614
|
- spec/utopia/controller/sequence_spec.rb
|
613
615
|
- spec/utopia/controller/variables_spec.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
|
2
|
-
# Configure "min" to be the minimum number of threads to use to answer
|
3
|
-
# requests and "max" the maximum.
|
4
|
-
threads 0,4
|
5
|
-
|
6
|
-
# Preload the application before starting the workers; this conflicts with
|
7
|
-
# phased restart feature. (off by default)
|
8
|
-
preload_app!
|
9
|
-
|
10
|
-
# This writes run/url.txt which allows us to watch and load the URL once puma has started.
|
11
|
-
get(:binds).tap do |binds|
|
12
|
-
urls = binds.grep(/tcp:\/\/0.0.0.0:(\d+)/).collect do
|
13
|
-
"http://localhost:#{$1}"
|
14
|
-
end
|
15
|
-
|
16
|
-
run_path = File.expand_path('../run', __dir__)
|
17
|
-
|
18
|
-
FileUtils.mkdir_p run_path
|
19
|
-
File.write(File.join(run_path, 'url.txt'), urls.first)
|
20
|
-
end
|