evergreen 0.3.0 → 0.4.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.
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() {