sibilant 0.0.3 → 0.0.4
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.
- data/lib/sibilant.rb +13 -5
- data/lib/sibilant/sinatra.rb +24 -0
- data/lib/sibilant/version.rb +1 -1
- data/spec/sibilant_spec.rb +14 -0
- data/spec/sinatra_helper_spec.rb +37 -0
- metadata +2 -2
data/lib/sibilant.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require "sibilant/version"
|
2
2
|
require 'json'
|
3
|
+
require 'open3'
|
3
4
|
|
4
5
|
module Sibilant
|
6
|
+
class CompilationError < RuntimeError; end
|
7
|
+
|
5
8
|
class << self
|
6
9
|
def [](sibilant_code)
|
7
10
|
Sibilant::Compiler.new.translate sibilant_code
|
@@ -30,11 +33,16 @@ module Sibilant
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def translate(sibilant_code)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
Open3.popen3 sibilant_cli, '-i' do |i,o,e,t|
|
37
|
+
i.puts sibilant_code
|
38
|
+
i.close_write
|
39
|
+
|
40
|
+
if t.value.success?
|
41
|
+
o.read.strip
|
42
|
+
else
|
43
|
+
raise Sibilant::CompilationError.new(e.read.strip)
|
44
|
+
end
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
40
48
|
end
|
data/lib/sibilant/sinatra.rb
CHANGED
@@ -5,6 +5,30 @@ module Sinatra
|
|
5
5
|
def sibilant(*args)
|
6
6
|
content_type 'application/javascript'
|
7
7
|
render :sibilant, *args
|
8
|
+
rescue ::Sibilant::CompilationError => error
|
9
|
+
if settings.development?
|
10
|
+
display_sibilant_compilation_error error
|
11
|
+
else
|
12
|
+
500
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def display_sibilant_compilation_error(error)
|
17
|
+
<<-END_JS
|
18
|
+
;(function() {
|
19
|
+
var pre = document.createElement('PRE');
|
20
|
+
pre.innerHTML = '<h1>Sibilant Compilation Error</h1><code>' +
|
21
|
+
'#{Rack::Utils.escape_html(error.message).gsub("'", "\\'").gsub("\n", "\\n")}' +
|
22
|
+
'</code>';
|
23
|
+
pre.style.background = 'rgba(255,0,0,0.5)';
|
24
|
+
pre.style.position = 'absolute';
|
25
|
+
pre.style.padding = '25px';
|
26
|
+
pre.style.top = '10px';
|
27
|
+
pre.style.left = '10px';
|
28
|
+
pre.style.margin = '0';
|
29
|
+
document.body.appendChild(pre);
|
30
|
+
})();
|
31
|
+
END_JS
|
8
32
|
end
|
9
33
|
end
|
10
34
|
end
|
data/lib/sibilant/version.rb
CHANGED
data/spec/sibilant_spec.rb
CHANGED
@@ -34,5 +34,19 @@ describe Sibilant do
|
|
34
34
|
@compiler.should_receive(:package_json).once.and_return version: test_version
|
35
35
|
@compiler.version.should eq(test_version)
|
36
36
|
end
|
37
|
+
|
38
|
+
describe 'on compilation failure' do
|
39
|
+
it 'should raise a Sibilant::CompilationError' do
|
40
|
+
expect { @compiler.translate('(foo') }.to raise_error(Sibilant::CompilationError)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should pass through the error message' do
|
44
|
+
begin
|
45
|
+
@compiler.translate('(foo')
|
46
|
+
rescue => error
|
47
|
+
error.message.should match(/Error: unexpected EOF, probably missing a \)/)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
37
51
|
end
|
38
52
|
end
|
data/spec/sinatra_helper_spec.rb
CHANGED
@@ -8,6 +8,7 @@ class SibilantApp < Sinatra::Base
|
|
8
8
|
set :views, ->{ root }
|
9
9
|
get('/fixture.js') { sibilant :fixture }
|
10
10
|
get('/inline.js') { sibilant '(alert "hello world")' }
|
11
|
+
get('/compilation-error.js') { sibilant '(defun' }
|
11
12
|
end
|
12
13
|
|
13
14
|
describe SibilantApp do
|
@@ -45,4 +46,40 @@ describe SibilantApp do
|
|
45
46
|
last_response.body.should == 'thisIsSibilantCode((1 + 2 + 3));'
|
46
47
|
end
|
47
48
|
end
|
49
|
+
|
50
|
+
describe 'error handling' do
|
51
|
+
describe 'in development mode' do
|
52
|
+
before :each do
|
53
|
+
app.set :environment, :development
|
54
|
+
get '/compilation-error.js'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should succeed' do
|
58
|
+
last_response.should be_ok
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should display the error' do
|
62
|
+
last_response.body.should match(/unexpected EOF/)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should still render javascript' do
|
66
|
+
last_response.content_type.should match('application/javascript')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should display a nice header message' do
|
70
|
+
last_response.body.should match('Sibilant Compilation Error')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'in production mode' do
|
75
|
+
before :each do
|
76
|
+
app.set :environment, :production
|
77
|
+
get '/compilation-error.js'
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should error' do
|
81
|
+
last_response.should_not be_ok
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
48
85
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sibilant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|