vitrine 0.0.16 → 0.0.17
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/README.md +23 -14
- data/lib/asset_compiler.rb +24 -40
- data/lib/server.rb +2 -1
- data/lib/version.rb +1 -1
- data/lib/vitrine.rb +0 -2
- data/vitrine.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fcf49c459400509a306d68ac41f7fa0eb330322
|
4
|
+
data.tar.gz: 18797aa7373fcd1dd90fc9274f14f8ee133baf0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c07c3645db4170a981d9ffc192222db4ee9f0b7456705c93facacf581f69fe4168926e0778c336d5055dbb8386491f203c8b126ab323ed62a4a0e2903938bc2
|
7
|
+
data.tar.gz: 2f53f0309e7775e470c5325e0dee47c2f7670ca7316e626cf6533bf4442c53d69cc4cab08570fb922d09aec9ef76acbd5d01effb51537a36acc3c009769c8017
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
A nimble web server one-liner for modern web-apps, a bit in the style of
|
2
|
-
[lineman](https://github.com/testdouble/lineman), [serve](https://github.com/visionmedia/serve),
|
3
|
-
|
2
|
+
[lineman](https://github.com/testdouble/lineman), [middleman](https://github.com/middleman/middleman), [serve](https://github.com/visionmedia/serve), another [serve](https://github.com/jlong/serve)
|
3
|
+
and such. Will display your precious stuff on port 9292.
|
4
|
+
|
5
|
+
It does some of what those other projects - only the stuff I need, with less.
|
4
6
|
|
5
7
|
## Core idea of Vitrine
|
6
8
|
|
@@ -34,8 +36,8 @@ to be able to just yank the file in there and carry on. THe compilation perks in
|
|
34
36
|
|
35
37
|
## Asset caching
|
36
38
|
|
37
|
-
Succesfully compiled assets will be
|
38
|
-
|
39
|
+
Succesfully compiled assets will be ETagged based on their mtime. You should run an HTTP caching
|
40
|
+
proxy on top of a Vitrine app in production.
|
39
41
|
|
40
42
|
## Automatic Ruby template pickup
|
41
43
|
|
@@ -43,8 +45,10 @@ If you have the "views" directory available, Vitrine will try to pick up any usa
|
|
43
45
|
From there on, it's going to try to render it with the automatically picked template engine using the
|
44
46
|
standard Sinatra facilities. You can use HAML, LESS, Slim, ERB, Builder or anything else you like.
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
+
### The "catch-all" template for single-page apps
|
49
|
+
|
50
|
+
If you are writing an SPA, you can make a template called `catch_all.erb` (or `.haml` or whatever really)
|
51
|
+
in your `views` which is going to be the fall-through template for all missing URLs _without_ extension.
|
48
52
|
|
49
53
|
## Automatic reload via Guard
|
50
54
|
|
@@ -55,14 +59,7 @@ If your project already has a Guardfile, Vitrine will inject live-reloading hook
|
|
55
59
|
|
56
60
|
Vitrine will `etag` all the precompiled assets for faster reloading.
|
57
61
|
|
58
|
-
##
|
59
|
-
|
60
|
-
At this point the best way to bake a Vitrine site is to crawl it externally, but we are going to implement
|
61
|
-
baking at some point. The idea is that you will end up upgrading the site to either a Node app or a Ruby app
|
62
|
-
with it's own `config.ru` - if after that point you still wish to use Vitrine, you can use it like a Rack
|
63
|
-
middleware.
|
64
|
-
|
65
|
-
## Using as a middleware
|
62
|
+
## Using the whole Vitrine as Rack middleware
|
66
63
|
|
67
64
|
Most actions in Vitrine will fall through to 404, so `Vitrine::App` can be used as a middleware handler.
|
68
65
|
Put Vitrine into your application stack and it will complement your main application very nicely. But don't
|
@@ -81,6 +78,18 @@ Note that you _need_ to have an `ExecJS` environment on your server for this:
|
|
81
78
|
vitrine.settings.set :root => File.dirname(__FILE__)
|
82
79
|
end
|
83
80
|
|
81
|
+
But you can also choose to have your JSON-serving API backend at the end of the Rack stack, and `Vitrine`
|
82
|
+
on top of it for assets and templating - the choice is entirelly up to you.
|
83
|
+
|
84
|
+
## Packaging and baking of assets
|
85
|
+
|
86
|
+
This is on the TODO list, primarilly because it's notoriously difficult to splice assets for minification
|
87
|
+
preserving their source maps.
|
88
|
+
|
89
|
+
The idea is that you will end up upgrading the site to either a Node app or a Ruby app
|
90
|
+
with it's own `config.ru` - if after that point you still wish to use Vitrine, you can use it like a Rack
|
91
|
+
middleware.
|
92
|
+
|
84
93
|
## Contributing to vitrine
|
85
94
|
|
86
95
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/lib/asset_compiler.rb
CHANGED
@@ -29,14 +29,14 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
29
29
|
# Try to find SCSS replacement for missing CSS
|
30
30
|
get /(.+)\.css/ do | basename |
|
31
31
|
begin
|
32
|
-
|
33
|
-
# TODO: has no handling for .sass
|
32
|
+
# TODO: handle .sass ext as well
|
34
33
|
scss_source_path = File.join(get_public, "#{basename}.scss")
|
35
|
-
mtime_cache(scss_source_path)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
mtime_cache(scss_source_path)
|
35
|
+
content_type 'text/css', :charset => 'utf-8'
|
36
|
+
|
37
|
+
# TODO: Examine http://sass-lang.com/documentation/file.SASS_REFERENCE.html
|
38
|
+
# It already has provisions for error display, among other things
|
39
|
+
Sass.compile_file(scss_source_path, cache_location: '/tmp/vitrine/sass-cache')
|
40
40
|
rescue Errno::ENOENT # Missing SCSS
|
41
41
|
forward_or_halt "No such CSS or SCSS file found"
|
42
42
|
rescue Exception => e # CSS syntax error or something alike
|
@@ -55,10 +55,9 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
55
55
|
get /(.+)\.js\.map$/ do | basename |
|
56
56
|
begin
|
57
57
|
coffee_source = File.join(get_public, "#{basename}.coffee")
|
58
|
+
mtime_cache(coffee_source)
|
58
59
|
content_type 'application/json', :charset => 'utf-8'
|
59
|
-
|
60
|
-
Vitrine.build_coffeescript_source_map_body(coffee_source, get_public)
|
61
|
-
end
|
60
|
+
Vitrine.build_coffeescript_source_map_body(coffee_source, get_public)
|
62
61
|
rescue Errno::ENOENT # Missing CoffeeScript
|
63
62
|
forward_or_halt "No coffeescript file found to generate the map for"
|
64
63
|
rescue Exception => e # CS syntax error or something alike
|
@@ -71,17 +70,16 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
71
70
|
# If this file is not found resort back to a coffeescript
|
72
71
|
begin
|
73
72
|
coffee_source = File.join(get_public, "#{basename}.coffee")
|
73
|
+
mtime_cache coffee_source
|
74
74
|
content_type 'text/javascript'
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
].join("\n")
|
84
|
-
end
|
75
|
+
source_body = File.read(coffee_source)
|
76
|
+
# We could have sent a header, but it's a nice idea to have the
|
77
|
+
# sourcemap header saved if we write out the compiled JS,
|
78
|
+
# whereas otherwise it would have been discarded
|
79
|
+
[
|
80
|
+
"//# sourceMappingURL=#{basename}.js.map",
|
81
|
+
Vitrine.compile_coffeescript(source_body)
|
82
|
+
].join("\n")
|
85
83
|
rescue Errno::ENOENT # Missing CoffeeScript
|
86
84
|
forward_or_halt "No such JS file and could not find a .coffee replacement"
|
87
85
|
rescue Exception => e # CS syntax error or something alike
|
@@ -92,31 +90,17 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
95
|
-
def mtime_cache(path
|
93
|
+
def mtime_cache(path)
|
96
94
|
# Mix in the request URL into the cache key so that we can hash
|
97
95
|
# .map sourcemaps and .js compiles based off of the same file path
|
98
96
|
# and mtime
|
99
97
|
key = [File.expand_path(path), File.mtime(path), request.path_info, get_public]
|
100
98
|
cache_sha = Digest::SHA1.hexdigest(Marshal.dump(key))
|
99
|
+
cache_control :public
|
100
|
+
etag cache_sha
|
101
101
|
|
102
|
-
|
103
|
-
FileUtils.mkdir_p '/tmp/vitrine'
|
104
|
-
p = '/tmp/vitrine/%s' % cache_sha
|
105
|
-
|
106
|
-
# Only write it out unless a file with the same SHA does not exist
|
107
|
-
unless File.exist?(p)
|
108
|
-
Vitrine.atomic_write(p) do |f|
|
109
|
-
log "---> Recompiling #{path} for #{request.path_info}"
|
110
|
-
f.write(yield)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# And send out the file that's been written
|
115
|
-
last_modified(File.mtime(p))
|
116
|
-
etag File.mtime(p).to_i.to_s
|
117
|
-
File.read(p)
|
102
|
+
log "---> Vitrine AC: Recompiling #{path} -> #{request.path_info}"
|
118
103
|
end
|
119
|
-
|
120
104
|
|
121
105
|
# Get path to the public directory, trying (in order:)
|
122
106
|
# self.public_dir reader
|
@@ -132,7 +116,7 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
132
116
|
choices.compact.shift
|
133
117
|
end
|
134
118
|
|
135
|
-
def forward_or_halt
|
119
|
+
def forward_or_halt(msg)
|
136
120
|
if @app
|
137
121
|
log "Forwarding, #{msg} -> pub #{get_public.inspect}"
|
138
122
|
forward
|
@@ -141,7 +125,7 @@ class Vitrine::AssetCompiler < Sinatra::Base
|
|
141
125
|
end
|
142
126
|
end
|
143
127
|
|
144
|
-
def log(
|
128
|
+
def log(msg)
|
145
129
|
env['captivity.logger'].debug(msg) if env['captivity.logger']
|
146
130
|
end
|
147
131
|
end
|
data/lib/server.rb
CHANGED
@@ -22,7 +22,7 @@ module Vitrine::Server
|
|
22
22
|
Rack::Builder.new do
|
23
23
|
use Rack::ShowStatus
|
24
24
|
use Rack::ShowExceptions
|
25
|
-
|
25
|
+
|
26
26
|
guardfile_path = options[:root] + '/Guardfile'
|
27
27
|
if File.exist?(guardfile_path)
|
28
28
|
$stderr.puts "Attaching LiveReload via Guardfile at #{guardfile_path.inspect}"
|
@@ -70,6 +70,7 @@ module Vitrine::Server
|
|
70
70
|
options = DEFAULTS.merge(passed_options)
|
71
71
|
check_dirs_present!(options)
|
72
72
|
|
73
|
+
$stderr.puts "Vitrine v.#{Vitrine::VERSION} booting in dev mode"
|
73
74
|
app = build_app(options)
|
74
75
|
start_server(app, options)
|
75
76
|
end
|
data/lib/version.rb
CHANGED
data/lib/vitrine.rb
CHANGED
data/vitrine.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "vitrine"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.17"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Julik Tarkhanov"]
|
12
|
-
s.date = "2014-01-
|
12
|
+
s.date = "2014-01-08"
|
13
13
|
s.description = " Serves ERB templates with live CoffeeScript and SASS "
|
14
14
|
s.email = "me@julik.nl"
|
15
15
|
s.executables = ["vitrine"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vitrine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|