evergreen 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/README.rdoc +30 -4
  2. data/config/routes.rb +1 -1
  3. data/lib/evergreen.rb +14 -50
  4. data/lib/evergreen/application.rb +46 -0
  5. data/lib/evergreen/cli.rb +2 -2
  6. data/lib/evergreen/rails.rb +4 -0
  7. data/lib/evergreen/resources/evergreen.css +3 -1
  8. data/lib/evergreen/resources/evergreen.js +3 -0
  9. data/lib/evergreen/runner.rb +124 -36
  10. data/lib/evergreen/server.rb +9 -18
  11. data/lib/evergreen/spec.rb +26 -14
  12. data/lib/evergreen/suite.rb +44 -0
  13. data/lib/evergreen/tasks.rb +6 -0
  14. data/lib/evergreen/template.rb +7 -10
  15. data/lib/evergreen/version.rb +1 -1
  16. data/lib/evergreen/views/layout.erb +1 -0
  17. data/lib/evergreen/views/list.erb +2 -2
  18. data/lib/evergreen/views/spec.erb +18 -10
  19. data/lib/jasmine/Gemfile +6 -0
  20. data/lib/jasmine/MIT.LICENSE +2 -2
  21. data/lib/jasmine/README.markdown +5 -459
  22. data/lib/jasmine/Rakefile +22 -16
  23. data/lib/jasmine/example/SpecRunner.html +1 -1
  24. data/lib/jasmine/jsdoc-template/allclasses.tmpl +17 -0
  25. data/lib/jasmine/jsdoc-template/allfiles.tmpl +56 -0
  26. data/lib/jasmine/jsdoc-template/class.tmpl +646 -0
  27. data/lib/jasmine/jsdoc-template/index.tmpl +39 -0
  28. data/lib/jasmine/jsdoc-template/publish.js +184 -0
  29. data/lib/jasmine/jsdoc-template/static/default.css +162 -0
  30. data/lib/jasmine/jsdoc-template/static/header.html +2 -0
  31. data/lib/jasmine/jsdoc-template/static/index.html +19 -0
  32. data/lib/jasmine/jsdoc-template/symbol.tmpl +35 -0
  33. data/lib/jasmine/lib/jasmine-html.js +12 -6
  34. data/lib/jasmine/lib/jasmine.js +122 -44
  35. data/lib/jasmine/spec/runner.html +0 -1
  36. data/lib/jasmine/spec/suites/CustomMatchersSpec.js +18 -9
  37. data/lib/jasmine/spec/suites/MatchersSpec.js +241 -162
  38. data/lib/jasmine/spec/suites/SpecRunningSpec.js +120 -62
  39. data/lib/jasmine/spec/suites/TrivialReporterSpec.js +3 -0
  40. data/lib/jasmine/spec/suites/WaitsForBlockSpec.js +9 -9
  41. data/lib/jasmine/src/Env.js +1 -0
  42. data/lib/jasmine/src/Matchers.js +35 -17
  43. data/lib/jasmine/src/Queue.js +6 -1
  44. data/lib/jasmine/src/Spec.js +34 -2
  45. data/lib/jasmine/src/WaitsForBlock.js +28 -13
  46. data/lib/jasmine/src/base.js +15 -8
  47. data/lib/jasmine/src/html/TrivialReporter.js +12 -6
  48. data/lib/jasmine/src/version.json +2 -2
  49. data/lib/tasks/evergreen.rake +1 -1
  50. data/spec/meta_spec.rb +21 -2
  51. data/spec/runner_spec.rb +16 -18
  52. data/spec/spec_helper.rb +12 -4
  53. data/spec/spec_spec.rb +4 -11
  54. data/spec/suite1/spec/javascripts/invalid_coffee_spec.coffee +1 -0
  55. data/spec/suite1/spec/javascripts/spec_helper.coffee +1 -1
  56. data/spec/suite2/config/evergreen.rb +5 -0
  57. data/spec/suite2/public_html/foo.js +1 -0
  58. data/spec/suite2/spec/awesome_spec.js +12 -0
  59. data/spec/suite2/spec/failing_spec.js +5 -0
  60. data/spec/suite2/templates/foo.html +1 -0
  61. data/spec/suite_spec.rb +26 -0
  62. data/spec/template_spec.rb +3 -9
  63. metadata +52 -20
  64. data/lib/jasmine/lib/consolex.js +0 -28
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}"" />
6
+
7
+ <title>JsDoc Reference - Index</title>
8
+ <meta name="generator" content="JsDoc Toolkit" />
9
+
10
+ <style type="text/css">
11
+ {+include("static/default.css")+}
12
+ </style>
13
+ </head>
14
+
15
+ <body>
16
+ {+include("static/header.html")+}
17
+
18
+ <div id="index">
19
+ {+publish.classesIndex+}
20
+ </div>
21
+
22
+ <div id="content">
23
+ <h1 class="classTitle">Class Index</h1>
24
+
25
+ <for each="thisClass" in="data">
26
+ <div>
27
+ <h2>{+(new Link().toSymbol(thisClass.alias))+}</h2>
28
+ {+resolveLinks(summarize(thisClass.classDesc))+}
29
+ </div>
30
+ <hr />
31
+ </for>
32
+
33
+ </div>
34
+ <div class="fineprint" style="clear:both">
35
+ <if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
36
+ Documentation generated by <a href="http://www.jsdoctoolkit.org/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
37
+ </div>
38
+ </body>
39
+ </html>
@@ -0,0 +1,184 @@
1
+ /** Called automatically by JsDoc Toolkit. */
2
+ function publish(symbolSet) {
3
+ publish.conf = { // trailing slash expected for dirs
4
+ ext: ".html",
5
+ outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/",
6
+ templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/",
7
+ symbolsDir: "symbols/",
8
+ srcDir: "symbols/src/"
9
+ };
10
+
11
+ // is source output is suppressed, just display the links to the source file
12
+ if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) {
13
+ Link.prototype._makeSrcLink = function(srcFilePath) {
14
+ return "&lt;"+srcFilePath+"&gt;";
15
+ }
16
+ }
17
+
18
+ // create the folders and subfolders to hold the output
19
+ IO.mkPath((publish.conf.outDir+"symbols/src").split("/"));
20
+
21
+ // used to allow Link to check the details of things being linked to
22
+ Link.symbolSet = symbolSet;
23
+
24
+ // create the required templates
25
+ try {
26
+ var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl");
27
+ var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl");
28
+ }
29
+ catch(e) {
30
+ print("Couldn't create the required templates: "+e);
31
+ quit();
32
+ }
33
+
34
+ // some ustility filters
35
+ function hasNoParent($) {return ($.memberOf == "")}
36
+ function isaFile($) {return ($.is("FILE"))}
37
+ function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)}
38
+
39
+ // get an array version of the symbolset, useful for filtering
40
+ var symbols = symbolSet.toArray();
41
+
42
+ // create the hilited source code files
43
+ var files = JSDOC.opt.srcFiles;
44
+ for (var i = 0, l = files.length; i < l; i++) {
45
+ var file = files[i];
46
+ var srcDir = publish.conf.outDir + "symbols/src/";
47
+ makeSrcFile(file, srcDir);
48
+ }
49
+
50
+ // get a list of all the classes in the symbolset
51
+ var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
52
+
53
+ // create a class index, displayed in the left-hand column of every class page
54
+ Link.base = "../";
55
+ publish.classesIndex = classesTemplate.process(classes); // kept in memory
56
+
57
+ // create each of the class pages
58
+ for (var i = 0, l = classes.length; i < l; i++) {
59
+ var symbol = classes[i];
60
+
61
+ symbol.events = symbol.getEvents(); // 1 order matters
62
+ symbol.methods = symbol.getMethods(); // 2
63
+
64
+ var output = "";
65
+ output = classTemplate.process(symbol);
66
+
67
+ IO.saveFile(publish.conf.outDir+"symbols/", symbol.alias+publish.conf.ext, output);
68
+ }
69
+
70
+ // regenerate the index with different relative links, used in the index pages
71
+ Link.base = "";
72
+ publish.classesIndex = classesTemplate.process(classes);
73
+
74
+ // create the class index page
75
+ try {
76
+ var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl");
77
+ }
78
+ catch(e) { print(e.message); quit(); }
79
+
80
+ var classesIndex = classesindexTemplate.process(classes);
81
+ IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex);
82
+ classesindexTemplate = classesIndex = classes = null;
83
+
84
+ // create the file index page
85
+ try {
86
+ var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl");
87
+ }
88
+ catch(e) { print(e.message); quit(); }
89
+
90
+ var documentedFiles = symbols.filter(isaFile); // files that have file-level docs
91
+ var allFiles = []; // not all files have file-level docs, but we need to list every one
92
+
93
+ for (var i = 0; i < files.length; i++) {
94
+ allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */")));
95
+ }
96
+
97
+ for (var i = 0; i < documentedFiles.length; i++) {
98
+ var offset = files.indexOf(documentedFiles[i].alias);
99
+ allFiles[offset] = documentedFiles[i];
100
+ }
101
+
102
+ allFiles = allFiles.sort(makeSortby("name"));
103
+
104
+ // output the file index page
105
+ var filesIndex = fileindexTemplate.process(allFiles);
106
+ IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex);
107
+ fileindexTemplate = filesIndex = files = null;
108
+ }
109
+
110
+
111
+ /** Just the first sentence (up to a full stop). Should not break on dotted variable names. */
112
+ function summarize(desc) {
113
+ if (typeof desc != "undefined")
114
+ return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc;
115
+ }
116
+
117
+ /** Make a symbol sorter by some attribute. */
118
+ function makeSortby(attribute) {
119
+ return function(a, b) {
120
+ if (a[attribute] != undefined && b[attribute] != undefined) {
121
+ a = a[attribute].toLowerCase();
122
+ b = b[attribute].toLowerCase();
123
+ if (a < b) return -1;
124
+ if (a > b) return 1;
125
+ return 0;
126
+ }
127
+ }
128
+ }
129
+
130
+ /** Pull in the contents of an external file at the given path. */
131
+ function include(path) {
132
+ var path = publish.conf.templatesDir+path;
133
+ return IO.readFile(path);
134
+ }
135
+
136
+ /** Turn a raw source file into a code-hilited page in the docs. */
137
+ function makeSrcFile(path, srcDir, name) {
138
+ if (JSDOC.opt.s) return;
139
+
140
+ if (!name) {
141
+ name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
142
+ name = name.replace(/\:/g, "_");
143
+ }
144
+
145
+ var src = {path: path, name:name, charset: IO.encoding, hilited: ""};
146
+
147
+ if (defined(JSDOC.PluginManager)) {
148
+ JSDOC.PluginManager.run("onPublishSrc", src);
149
+ }
150
+
151
+ if (src.hilited) {
152
+ IO.saveFile(srcDir, name+publish.conf.ext, src.hilited);
153
+ }
154
+ }
155
+
156
+ /** Build output for displaying function parameters. */
157
+ function makeSignature(params) {
158
+ if (!params) return "()";
159
+ var signature = "("
160
+ +
161
+ params.filter(
162
+ function($) {
163
+ return $.name.indexOf(".") == -1; // don't show config params in signature
164
+ }
165
+ ).map(
166
+ function($) {
167
+ return $.name;
168
+ }
169
+ ).join(", ")
170
+ +
171
+ ")";
172
+ return signature;
173
+ }
174
+
175
+ /** Find symbol {@link ...} strings in text and turn into html links */
176
+ function resolveLinks(str, from) {
177
+ str = str.replace(/\{@link ([^} ]+) ?\}/gi,
178
+ function(match, symbolName) {
179
+ return new Link().toSymbol(symbolName);
180
+ }
181
+ );
182
+
183
+ return str;
184
+ }
@@ -0,0 +1,162 @@
1
+ /* default.css */
2
+ body
3
+ {
4
+ font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
5
+ width: 800px;
6
+ }
7
+
8
+ .header
9
+ {
10
+ clear: both;
11
+ background-color: #ccc;
12
+ padding: 8px;
13
+ }
14
+
15
+ h1
16
+ {
17
+ font-size: 150%;
18
+ font-weight: bold;
19
+ padding: 0;
20
+ margin: 1em 0 0 .3em;
21
+ }
22
+
23
+ hr
24
+ {
25
+ border: none 0;
26
+ border-top: 1px solid #7F8FB1;
27
+ height: 1px;
28
+ }
29
+
30
+ pre.code
31
+ {
32
+ display: block;
33
+ padding: 8px;
34
+ border: 1px dashed #ccc;
35
+ }
36
+
37
+ #index
38
+ {
39
+ margin-top: 24px;
40
+ float: left;
41
+ width: 160px;
42
+ position: absolute;
43
+ left: 8px;
44
+ background-color: #F3F3F3;
45
+ padding: 8px;
46
+ }
47
+
48
+ #content
49
+ {
50
+ margin-left: 190px;
51
+ width: 600px;
52
+ }
53
+
54
+ .classList
55
+ {
56
+ list-style-type: none;
57
+ padding: 0;
58
+ margin: 0 0 0 8px;
59
+ font-family: arial, sans-serif;
60
+ font-size: 1em;
61
+ overflow: auto;
62
+ }
63
+
64
+ .classList li
65
+ {
66
+ padding: 0;
67
+ margin: 0 0 8px 0;
68
+ }
69
+
70
+ .summaryTable { width: 100%; }
71
+
72
+ h1.classTitle
73
+ {
74
+ font-size:170%;
75
+ line-height:130%;
76
+ }
77
+
78
+ h2 { font-size: 110%; }
79
+ caption, div.sectionTitle
80
+ {
81
+ background-color: #7F8FB1;
82
+ color: #fff;
83
+ font-size:130%;
84
+ text-align: left;
85
+ padding: 2px 6px 2px 6px;
86
+ border: 1px #7F8FB1 solid;
87
+ }
88
+
89
+ div.sectionTitle { margin-bottom: 8px; }
90
+ .summaryTable thead { display: none; }
91
+
92
+ .summaryTable td
93
+ {
94
+ vertical-align: top;
95
+ padding: 4px;
96
+ border-bottom: 1px #7F8FB1 solid;
97
+ border-right: 1px #7F8FB1 solid;
98
+ }
99
+
100
+ /*col#summaryAttributes {}*/
101
+ .summaryTable td.attributes
102
+ {
103
+ border-left: 1px #7F8FB1 solid;
104
+ width: 140px;
105
+ text-align: right;
106
+ }
107
+
108
+ td.attributes, .fixedFont
109
+ {
110
+ line-height: 15px;
111
+ color: #002EBE;
112
+ font-family: "Courier New",Courier,monospace;
113
+ font-size: 13px;
114
+ }
115
+
116
+ .summaryTable td.nameDescription
117
+ {
118
+ text-align: left;
119
+ font-size: 13px;
120
+ line-height: 15px;
121
+ }
122
+
123
+ .summaryTable td.nameDescription, .description
124
+ {
125
+ line-height: 15px;
126
+ padding: 4px;
127
+ padding-left: 4px;
128
+ }
129
+
130
+ .summaryTable { margin-bottom: 8px; }
131
+
132
+ ul.inheritsList
133
+ {
134
+ list-style: square;
135
+ margin-left: 20px;
136
+ padding-left: 0;
137
+ }
138
+
139
+ .detailList {
140
+ margin-left: 20px;
141
+ line-height: 15px;
142
+ }
143
+ .detailList dt { margin-left: 20px; }
144
+
145
+ .detailList .heading
146
+ {
147
+ font-weight: bold;
148
+ padding-bottom: 6px;
149
+ margin-left: 0;
150
+ }
151
+
152
+ .light, td.attributes, .light a:link, .light a:visited
153
+ {
154
+ color: #777;
155
+ font-style: italic;
156
+ }
157
+
158
+ .fineprint
159
+ {
160
+ text-align: right;
161
+ font-size: 10px;
162
+ }
@@ -0,0 +1,2 @@
1
+ <div id="header">
2
+ </div>
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <title>Generated Javascript Documentation</title>
7
+ </head>
8
+ <frameset cols="20%,80%">
9
+ <frame src="allclasses-frame.html" name="packageFrame" />
10
+ <frame src="splash.html" name="classFrame" />
11
+ <noframes>
12
+ <body>
13
+ <p>
14
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
15
+ </p>
16
+ </body>
17
+ </noframes>
18
+ </frameset>
19
+ </html>
@@ -0,0 +1,35 @@
1
+ <symbol alias="{+data.alias+}">
2
+ <name>{+data.name+}</name>
3
+ <memberOf>{+data.memberOf+}</memberOf>
4
+ <isStatic>{+data.isStatic+}</isStatic>
5
+ <isa>{+data.isa+}</isa>
6
+ <desc>{+data.desc+}</desc>
7
+ <classDesc>{+data.classDesc+}</classDesc>
8
+
9
+ <methods><for each="method" in="data.methods">
10
+ <method>
11
+ <name>{+method.name+}</name>
12
+ <memberOf>{+method.memberOf+}</memberOf>
13
+ <isStatic>{+method.isStatic+}</isStatic>
14
+ <desc>{+method.desc+}</desc>
15
+ <params><for each="param" in="method.params">
16
+ <param>
17
+ <type>{+param.type+}</type>
18
+ <name>{+param.name+}</name>
19
+ <desc>{+param.desc+}</desc>
20
+ <defaultValue>{+param.defaultValue+}</defaultValue>
21
+ </param></for>
22
+ </params>
23
+ </method></for>
24
+ </methods>
25
+
26
+ <properties><for each="property" in="data.properties">
27
+ <property>
28
+ <name>{+property.name+}</name>
29
+ <memberOf>{+property.memberOf+}</memberOf>
30
+ <isStatic>{+property.isStatic+}</isStatic>
31
+ <desc>{+property.desc+}</desc>
32
+ <type>{+property.type+}</type>
33
+ </property></for>
34
+ </properties>
35
+ </symbol>
@@ -34,7 +34,7 @@ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
34
34
  this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
35
35
  this.createDom('div', { className: 'banner' },
36
36
  this.createDom('div', { className: 'logo' },
37
- "Jasmine",
37
+ this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
38
38
  this.createDom('span', { className: 'version' }, runner.env.versionString())),
39
39
  this.createDom('div', { className: 'options' },
40
40
  "Show ",
@@ -70,16 +70,16 @@ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
70
70
  this.startedAt = new Date();
71
71
 
72
72
  var self = this;
73
- showPassed.onchange = function(evt) {
74
- if (evt.target.checked) {
73
+ showPassed.onclick = function(evt) {
74
+ if (showPassed.checked) {
75
75
  self.outerDiv.className += ' show-passed';
76
76
  } else {
77
77
  self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
78
78
  }
79
79
  };
80
80
 
81
- showSkipped.onchange = function(evt) {
82
- if (evt.target.checked) {
81
+ showSkipped.onclick = function(evt) {
82
+ if (showSkipped.checked) {
83
83
  self.outerDiv.className += ' show-skipped';
84
84
  } else {
85
85
  self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
@@ -162,7 +162,13 @@ jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
162
162
 
163
163
  jasmine.TrivialReporter.prototype.log = function() {
164
164
  var console = jasmine.getGlobal().console;
165
- if (console && console.log) console.log.apply(console, arguments);
165
+ if (console && console.log) {
166
+ if (console.log.apply) {
167
+ console.log.apply(console, arguments);
168
+ } else {
169
+ console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
170
+ }
171
+ }
166
172
  };
167
173
 
168
174
  jasmine.TrivialReporter.prototype.getLocation = function() {