seaweed 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/seaweed +23 -50
- data/lib/Spec/ObjectExtensions.coffee +53 -0
- data/lib/Spec/WindowExtensions.coffee +252 -0
- data/lib/Spec.coffee +127 -239
- data/lib/seaweed/runner.rb +31 -0
- data/lib/seaweed/server.rb +33 -0
- data/lib/seaweed/version.rb +3 -0
- data/lib/seaweed.rb +121 -0
- data/public/ie.js +5 -0
- data/{server/public/jquery-1.5.js → public/jquery-1.5.2.js} +771 -573
- data/public/jsdiff.js +161 -0
- data/public/spec.css +29 -0
- data/views/index.slim +15 -0
- metadata +113 -113
- data/lib/required_files.rb +0 -62
- data/server/public/spec.css +0 -9
- data/server/server.rb +0 -88
- data/server/views/index.slim +0 -11
data/public/jsdiff.js
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
/*
|
2
|
+
* Javascript Diff Algorithm
|
3
|
+
* By John Resig (http://ejohn.org/)
|
4
|
+
* Modified by Chu Alan "sprite"
|
5
|
+
*
|
6
|
+
* Released under the MIT license.
|
7
|
+
*
|
8
|
+
* More Info:
|
9
|
+
* http://ejohn.org/projects/javascript-diff-algorithm/
|
10
|
+
*/
|
11
|
+
|
12
|
+
function escape(s) {
|
13
|
+
var n = s;
|
14
|
+
n = n.replace(/&/g, "&");
|
15
|
+
n = n.replace(/</g, "<");
|
16
|
+
n = n.replace(/>/g, ">");
|
17
|
+
n = n.replace(/"/g, """);
|
18
|
+
|
19
|
+
return n;
|
20
|
+
}
|
21
|
+
|
22
|
+
function diffString( o, n ) {
|
23
|
+
o = o.replace(/\s+$/, '');
|
24
|
+
n = n.replace(/\s+$/, '');
|
25
|
+
|
26
|
+
var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/) );
|
27
|
+
var str = "";
|
28
|
+
|
29
|
+
var oSpace = o.match(/\s+/g);
|
30
|
+
if (oSpace == null) {
|
31
|
+
oSpace = ["\n"];
|
32
|
+
} else {
|
33
|
+
oSpace.push("\n");
|
34
|
+
}
|
35
|
+
var nSpace = n.match(/\s+/g);
|
36
|
+
if (nSpace == null) {
|
37
|
+
nSpace = ["\n"];
|
38
|
+
} else {
|
39
|
+
nSpace.push("\n");
|
40
|
+
}
|
41
|
+
|
42
|
+
if (out.n.length == 0) {
|
43
|
+
for (var i = 0; i < out.o.length; i++) {
|
44
|
+
str += '<del>' + escape(out.o[i]) + oSpace[i] + "</del>";
|
45
|
+
}
|
46
|
+
} else {
|
47
|
+
if (out.n[0].text == null) {
|
48
|
+
for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
|
49
|
+
str += '<del>' + escape(out.o[n]) + oSpace[n] + "</del>";
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
for ( var i = 0; i < out.n.length; i++ ) {
|
54
|
+
if (out.n[i].text == null) {
|
55
|
+
str += '<ins>' + escape(out.n[i]) + nSpace[i] + "</ins>";
|
56
|
+
} else {
|
57
|
+
var pre = "";
|
58
|
+
|
59
|
+
for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
|
60
|
+
pre += '<del>' + escape(out.o[n]) + oSpace[n] + "</del>";
|
61
|
+
}
|
62
|
+
str += " " + out.n[i].text + nSpace[i] + pre;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
return str;
|
68
|
+
}
|
69
|
+
|
70
|
+
function randomColor() {
|
71
|
+
return "rgb(" + (Math.random() * 100) + "%, " +
|
72
|
+
(Math.random() * 100) + "%, " +
|
73
|
+
(Math.random() * 100) + "%)";
|
74
|
+
}
|
75
|
+
function diffString2( o, n ) {
|
76
|
+
o = o.replace(/\s+$/, '');
|
77
|
+
n = n.replace(/\s+$/, '');
|
78
|
+
|
79
|
+
var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/) );
|
80
|
+
|
81
|
+
var oSpace = o.match(/\s+/g);
|
82
|
+
if (oSpace == null) {
|
83
|
+
oSpace = ["\n"];
|
84
|
+
} else {
|
85
|
+
oSpace.push("\n");
|
86
|
+
}
|
87
|
+
var nSpace = n.match(/\s+/g);
|
88
|
+
if (nSpace == null) {
|
89
|
+
nSpace = ["\n"];
|
90
|
+
} else {
|
91
|
+
nSpace.push("\n");
|
92
|
+
}
|
93
|
+
|
94
|
+
var os = "";
|
95
|
+
var colors = new Array();
|
96
|
+
for (var i = 0; i < out.o.length; i++) {
|
97
|
+
colors[i] = randomColor();
|
98
|
+
|
99
|
+
if (out.o[i].text != null) {
|
100
|
+
os += '<span style="background-color: ' +colors[i]+ '">' +
|
101
|
+
escape(out.o[i].text) + oSpace[i] + "</span>";
|
102
|
+
} else {
|
103
|
+
os += "<del>" + escape(out.o[i]) + oSpace[i] + "</del>";
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
var ns = "";
|
108
|
+
for (var i = 0; i < out.n.length; i++) {
|
109
|
+
if (out.n[i].text != null) {
|
110
|
+
ns += '<span style="background-color: ' +colors[out.n[i].row]+ '">' +
|
111
|
+
escape(out.n[i].text) + nSpace[i] + "</span>";
|
112
|
+
} else {
|
113
|
+
ns += "<ins>" + escape(out.n[i]) + nSpace[i] + "</ins>";
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
return { o : os , n : ns };
|
118
|
+
}
|
119
|
+
|
120
|
+
function diff( o, n ) {
|
121
|
+
var ns = new Object();
|
122
|
+
var os = new Object();
|
123
|
+
|
124
|
+
for ( var i = 0; i < n.length; i++ ) {
|
125
|
+
if ( ns[ n[i] ] == null )
|
126
|
+
ns[ n[i] ] = { rows: new Array(), o: null };
|
127
|
+
ns[ n[i] ].rows.push( i );
|
128
|
+
}
|
129
|
+
|
130
|
+
for ( var i = 0; i < o.length; i++ ) {
|
131
|
+
if ( os[ o[i] ] == null )
|
132
|
+
os[ o[i] ] = { rows: new Array(), n: null };
|
133
|
+
os[ o[i] ].rows.push( i );
|
134
|
+
}
|
135
|
+
|
136
|
+
for ( var i in ns ) {
|
137
|
+
if ( ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1 ) {
|
138
|
+
n[ ns[i].rows[0] ] = { text: n[ ns[i].rows[0] ], row: os[i].rows[0] };
|
139
|
+
o[ os[i].rows[0] ] = { text: o[ os[i].rows[0] ], row: ns[i].rows[0] };
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
for ( var i = 0; i < n.length - 1; i++ ) {
|
144
|
+
if ( n[i].text != null && n[i+1].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
|
145
|
+
n[i+1] == o[ n[i].row + 1 ] ) {
|
146
|
+
n[i+1] = { text: n[i+1], row: n[i].row + 1 };
|
147
|
+
o[n[i].row+1] = { text: o[n[i].row+1], row: i + 1 };
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
for ( var i = n.length - 1; i > 0; i-- ) {
|
152
|
+
if ( n[i].text != null && n[i-1].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
|
153
|
+
n[i-1] == o[ n[i].row - 1 ] ) {
|
154
|
+
n[i-1] = { text: n[i-1], row: n[i].row - 1 };
|
155
|
+
o[n[i].row-1] = { text: o[n[i].row-1], row: i - 1 };
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
return { o: o, n: n };
|
160
|
+
}
|
161
|
+
|
data/public/spec.css
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
.failed {
|
2
|
+
color: #900;
|
3
|
+
}
|
4
|
+
.passed {
|
5
|
+
color: #090;
|
6
|
+
}
|
7
|
+
.pending {
|
8
|
+
color: #990;
|
9
|
+
}
|
10
|
+
.errors {
|
11
|
+
border-collapse: collapse;
|
12
|
+
}
|
13
|
+
.errors td, .errors th {
|
14
|
+
padding: 4px;
|
15
|
+
}
|
16
|
+
.errors th {
|
17
|
+
text-align: left;
|
18
|
+
background: #eee;
|
19
|
+
}
|
20
|
+
del, ins {
|
21
|
+
margin: 0 0.2em;
|
22
|
+
font-weight: bold;
|
23
|
+
}
|
24
|
+
del {
|
25
|
+
color: #900;
|
26
|
+
}
|
27
|
+
ins {
|
28
|
+
color: #090;
|
29
|
+
}
|
data/views/index.slim
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
doctype html
|
2
|
+
head
|
3
|
+
script type="text/javascript" src="ie.js"
|
4
|
+
script type="text/javascript" src="jquery-1.5.2.js"
|
5
|
+
script type="text/javascript" src="jsdiff.js"
|
6
|
+
link rel="stylesheet" href="spec.css" type="text/css"
|
7
|
+
script type="text/javascript" src="/assets/Spec.js"
|
8
|
+
|
9
|
+
body
|
10
|
+
javascript:
|
11
|
+
Spec.initializeEnvironment();
|
12
|
+
- @scripts.each do |file_name|
|
13
|
+
script type="text/javascript" src="/assets/#{{file_name.sub /\.coffee$/, '.js'}}"
|
14
|
+
javascript:
|
15
|
+
Spec.finalize();
|
metadata
CHANGED
@@ -1,156 +1,156 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: seaweed
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 0.1.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Tobias Cohen
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-06-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: coffee-script
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: json
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
39
33
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
47
38
|
type: :runtime
|
48
|
-
version_requirements: *id002
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: celerity
|
51
39
|
prerelease: false
|
52
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
41
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: sprockets
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
61
54
|
type: :runtime
|
62
|
-
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: sinatra
|
65
55
|
prerelease: false
|
66
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: sinatra
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
67
65
|
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
75
70
|
type: :runtime
|
76
|
-
version_requirements: *id004
|
77
|
-
- !ruby/object:Gem::Dependency
|
78
|
-
name: slim
|
79
71
|
prerelease: false
|
80
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: slim
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
segments:
|
87
|
-
- 0
|
88
|
-
version: "0"
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
89
86
|
type: :runtime
|
90
|
-
version_requirements: *id005
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: watchr
|
93
87
|
prerelease: false
|
94
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
89
|
none: false
|
96
|
-
requirements:
|
97
|
-
- -
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: watchr
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
103
102
|
type: :runtime
|
104
|
-
|
105
|
-
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Seaweed is Coffeescript behavioral testing framework, with a command
|
111
|
+
line tool that can be used to run specs automatically.
|
106
112
|
email: me@tobiascohen.com
|
107
|
-
executables:
|
113
|
+
executables:
|
108
114
|
- seaweed
|
109
115
|
extensions: []
|
110
|
-
|
111
116
|
extra_rdoc_files: []
|
112
|
-
|
113
|
-
files:
|
117
|
+
files:
|
114
118
|
- bin/seaweed
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
118
|
-
-
|
119
|
-
- lib/
|
119
|
+
- lib/seaweed/runner.rb
|
120
|
+
- lib/seaweed/server.rb
|
121
|
+
- lib/seaweed/version.rb
|
122
|
+
- lib/seaweed.rb
|
123
|
+
- lib/Spec/ObjectExtensions.coffee
|
124
|
+
- lib/Spec/WindowExtensions.coffee
|
120
125
|
- lib/Spec.coffee
|
121
|
-
|
126
|
+
- public/ie.js
|
127
|
+
- public/jquery-1.5.2.js
|
128
|
+
- public/jsdiff.js
|
129
|
+
- public/spec.css
|
130
|
+
- views/index.slim
|
122
131
|
homepage: https://github.com/tobico/seaweed
|
123
|
-
licenses:
|
132
|
+
licenses:
|
124
133
|
- MIT
|
125
134
|
post_install_message:
|
126
135
|
rdoc_options: []
|
127
|
-
|
128
|
-
require_paths:
|
136
|
+
require_paths:
|
129
137
|
- lib
|
130
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
139
|
none: false
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
|
136
|
-
|
137
|
-
- 0
|
138
|
-
version: "0"
|
139
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
145
|
none: false
|
141
|
-
requirements:
|
142
|
-
- -
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
|
145
|
-
segments:
|
146
|
-
- 0
|
147
|
-
version: "0"
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
148
150
|
requirements: []
|
149
|
-
|
150
151
|
rubyforge_project:
|
151
|
-
rubygems_version: 1.
|
152
|
+
rubygems_version: 1.8.23
|
152
153
|
signing_key:
|
153
154
|
specification_version: 3
|
154
155
|
summary: Coffeescript testing framework
|
155
156
|
test_files: []
|
156
|
-
|
data/lib/required_files.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'tsort'
|
2
|
-
|
3
|
-
class RequiredFiles < Hash
|
4
|
-
include TSort
|
5
|
-
|
6
|
-
attr_accessor :paths
|
7
|
-
|
8
|
-
# Adds a file to required list, and recursively scans and adds all other
|
9
|
-
# files required by this file
|
10
|
-
def add name
|
11
|
-
file_name = full_path name
|
12
|
-
if file_name && !self[name.to_sym]
|
13
|
-
directives = parse_directives file_name
|
14
|
-
self[name.to_sym] = {
|
15
|
-
:file_name => file_name,
|
16
|
-
:requires => directives['require']
|
17
|
-
}
|
18
|
-
requested = (directives['require'] | directives['request'])
|
19
|
-
requested.each{ |file| add file }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Gets an array of file paths sorted in dependency order
|
24
|
-
def sorted_files
|
25
|
-
tsort.map{ |key| self[key][:file_name] }
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
# Searches for file in path with given name and returns full file path,
|
30
|
-
# or nil if not found
|
31
|
-
def full_path name
|
32
|
-
file_path = @paths.find { |path| File.exists? "#{path}/#{name}.coffee" }
|
33
|
-
raise "File not found: #{name}" unless file_path
|
34
|
-
file_path && "#{file_path}/#{name}.coffee"
|
35
|
-
end
|
36
|
-
|
37
|
-
# Scans a coffeescript file for #require and #request directives.
|
38
|
-
#
|
39
|
-
# Example requirement directives:
|
40
|
-
# #require ST
|
41
|
-
# #require ST/Model/Index
|
42
|
-
def parse_directives name
|
43
|
-
directives = {
|
44
|
-
'require' => [],
|
45
|
-
'request' => []
|
46
|
-
}
|
47
|
-
File.open name do |file|
|
48
|
-
file.each do |line|
|
49
|
-
if line.match /^#(require|request)\s+(\S+)\s*$/
|
50
|
-
directives[$1] << $2
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
directives
|
55
|
-
end
|
56
|
-
|
57
|
-
# Callback functions for tsort
|
58
|
-
alias tsort_each_node each_key
|
59
|
-
def tsort_each_child node
|
60
|
-
self[node][:requires].each{ |name| yield name.to_sym }
|
61
|
-
end
|
62
|
-
end
|
data/server/public/spec.css
DELETED
data/server/server.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'sinatra'
|
3
|
-
require 'slim'
|
4
|
-
require 'coffee-script'
|
5
|
-
|
6
|
-
# Patch in Sinatra support for Slim
|
7
|
-
module Sinatra
|
8
|
-
module Templates
|
9
|
-
def slim(template, options={}, locals={})
|
10
|
-
render :slim, template, options, locals
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# Configure slim for prettier code formatting
|
16
|
-
Slim::Engine.set_default_options :pretty => true
|
17
|
-
|
18
|
-
# Hide redundant log messages
|
19
|
-
disable :logging
|
20
|
-
|
21
|
-
# Dynamically compiles coffeescript, first checking to see if it has changed
|
22
|
-
def compile source, target
|
23
|
-
begin
|
24
|
-
# Get modified time of source file
|
25
|
-
mtime = File.mtime source
|
26
|
-
|
27
|
-
# If compled JavaScript file already exists and is up to date, return the
|
28
|
-
# existing file instead of compiling again
|
29
|
-
return File.read target if File.exists?(target) && File.mtime(target) == mtime
|
30
|
-
|
31
|
-
# Create base dir for compiled file
|
32
|
-
dir = target.sub /\/[^\/]+$/, ''
|
33
|
-
Dir.mkdir dir unless File.exists? dir
|
34
|
-
|
35
|
-
# Compile CoffeeScript to JavaScript file
|
36
|
-
File.open target, 'w' do |f|
|
37
|
-
f.write CoffeeScript.compile(File.read source)
|
38
|
-
end
|
39
|
-
|
40
|
-
# Mark compiled file with same modified date as source
|
41
|
-
File.utime mtime, mtime, target
|
42
|
-
|
43
|
-
# Return our newly compiled JavaScript
|
44
|
-
File.read target
|
45
|
-
rescue CoffeeScript::CompilationError => e
|
46
|
-
# Display CoffeeScript compilation error in a prettier format
|
47
|
-
message = if e.message.match /^SyntaxError: (.*) on line (\d+)\D*$/
|
48
|
-
"#{source}:#{$2}".ljust(40) + " #{$1}"
|
49
|
-
elsif e.message.match /^Parse error on line (\d+): (.*)$/
|
50
|
-
"#{source}:#{$1}".ljust(40) + " #{$2}"
|
51
|
-
else
|
52
|
-
"#{source} - #{e.message}"
|
53
|
-
end
|
54
|
-
puts "\e[31m#{message}\e[0m"
|
55
|
-
|
56
|
-
# Generate JS to display compilation error on HTML page
|
57
|
-
html = "<pre class=\"failed\">#{message}</pre>"
|
58
|
-
"$(function(){$(document.body).prepend(#{html.to_json});});"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Processes request for seaweed Spec library
|
63
|
-
get "/Spec.js" do
|
64
|
-
compile File.expand_path('../../lib/Spec.coffee', __FILE__), "compiled/spec.js"
|
65
|
-
end
|
66
|
-
|
67
|
-
# Processes request for project lib files
|
68
|
-
get %r{^/lib/(.+)\.js$} do |file|
|
69
|
-
compile "lib/#{file}.coffee", "compiled/#{file}.js"
|
70
|
-
end
|
71
|
-
|
72
|
-
# Processes request for project spec files
|
73
|
-
get %r{^/spec/(.+)\.js$} do |file|
|
74
|
-
compile "spec/#{file}.coffee", "compiled/#{file}.js"
|
75
|
-
end
|
76
|
-
|
77
|
-
# Processes request for page index
|
78
|
-
get "/" do
|
79
|
-
# Build ordered list of required files to run all specs
|
80
|
-
requirements = RequiredFiles.new
|
81
|
-
requirements.paths = ['spec', 'lib']
|
82
|
-
Dir['spec/**/*.spec.coffee'].each do |file|
|
83
|
-
requirements.add $1 if file.match /^spec\/(.*).coffee$/
|
84
|
-
end
|
85
|
-
@scripts = requirements.sorted_files
|
86
|
-
|
87
|
-
slim :index
|
88
|
-
end
|
data/server/views/index.slim
DELETED