rails31-evergreen 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. data/README.rdoc +193 -0
  2. data/bin/evergreen +18 -0
  3. data/config/routes.rb +3 -0
  4. data/lib/evergreen.rb +41 -0
  5. data/lib/evergreen/application.rb +43 -0
  6. data/lib/evergreen/cli.rb +23 -0
  7. data/lib/evergreen/rails.rb +12 -0
  8. data/lib/evergreen/reports.rb +79 -0
  9. data/lib/evergreen/resources/evergreen.css +64 -0
  10. data/lib/evergreen/resources/evergreen.js +80 -0
  11. data/lib/evergreen/resources/jasmine-html.js +190 -0
  12. data/lib/evergreen/resources/jasmine.css +166 -0
  13. data/lib/evergreen/resources/jasmine.js +2477 -0
  14. data/lib/evergreen/resources/json2.js +478 -0
  15. data/lib/evergreen/resources/version.rb +6 -0
  16. data/lib/evergreen/runner.rb +148 -0
  17. data/lib/evergreen/server.rb +22 -0
  18. data/lib/evergreen/spec.rb +52 -0
  19. data/lib/evergreen/suite.rb +44 -0
  20. data/lib/evergreen/tasks.rb +6 -0
  21. data/lib/evergreen/template.rb +32 -0
  22. data/lib/evergreen/version.rb +3 -0
  23. data/lib/evergreen/views/layout.erb +19 -0
  24. data/lib/evergreen/views/list.erb +9 -0
  25. data/lib/evergreen/views/spec.erb +40 -0
  26. data/lib/jasmine/Gemfile +6 -0
  27. data/lib/jasmine/MIT.LICENSE +20 -0
  28. data/lib/jasmine/README.markdown +28 -0
  29. data/lib/jasmine/Rakefile +182 -0
  30. data/lib/jasmine/cruise_config.rb +21 -0
  31. data/lib/jasmine/example/SpecRunner.html +27 -0
  32. data/lib/jasmine/example/spec/PlayerSpec.js +58 -0
  33. data/lib/jasmine/example/spec/SpecHelper.js +9 -0
  34. data/lib/jasmine/example/src/Player.js +22 -0
  35. data/lib/jasmine/example/src/Song.js +7 -0
  36. data/lib/jasmine/images/fail-16.png +0 -0
  37. data/lib/jasmine/images/fail.png +0 -0
  38. data/lib/jasmine/images/go-16.png +0 -0
  39. data/lib/jasmine/images/go.png +0 -0
  40. data/lib/jasmine/images/pending-16.png +0 -0
  41. data/lib/jasmine/images/pending.png +0 -0
  42. data/lib/jasmine/images/question-bk.png +0 -0
  43. data/lib/jasmine/images/questionbk-16.png +0 -0
  44. data/lib/jasmine/images/spinner.gif +0 -0
  45. data/lib/jasmine/jsdoc-template/allclasses.tmpl +17 -0
  46. data/lib/jasmine/jsdoc-template/allfiles.tmpl +56 -0
  47. data/lib/jasmine/jsdoc-template/class.tmpl +646 -0
  48. data/lib/jasmine/jsdoc-template/index.tmpl +39 -0
  49. data/lib/jasmine/jsdoc-template/publish.js +184 -0
  50. data/lib/jasmine/jsdoc-template/static/default.css +162 -0
  51. data/lib/jasmine/jsdoc-template/static/header.html +2 -0
  52. data/lib/jasmine/jsdoc-template/static/index.html +19 -0
  53. data/lib/jasmine/jsdoc-template/symbol.tmpl +35 -0
  54. data/lib/jasmine/lib/jasmine-html.js +188 -0
  55. data/lib/jasmine/lib/jasmine.css +166 -0
  56. data/lib/jasmine/lib/jasmine.js +2421 -0
  57. data/lib/jasmine/lib/json2.js +478 -0
  58. data/lib/jasmine/spec/runner.html +80 -0
  59. data/lib/jasmine/spec/suites/BaseSpec.js +27 -0
  60. data/lib/jasmine/spec/suites/CustomMatchersSpec.js +97 -0
  61. data/lib/jasmine/spec/suites/EnvSpec.js +158 -0
  62. data/lib/jasmine/spec/suites/ExceptionsSpec.js +107 -0
  63. data/lib/jasmine/spec/suites/JsApiReporterSpec.js +103 -0
  64. data/lib/jasmine/spec/suites/MatchersSpec.js +795 -0
  65. data/lib/jasmine/spec/suites/MockClockSpec.js +38 -0
  66. data/lib/jasmine/spec/suites/MultiReporterSpec.js +45 -0
  67. data/lib/jasmine/spec/suites/NestedResultsSpec.js +54 -0
  68. data/lib/jasmine/spec/suites/PrettyPrintSpec.js +93 -0
  69. data/lib/jasmine/spec/suites/QueueSpec.js +23 -0
  70. data/lib/jasmine/spec/suites/ReporterSpec.js +56 -0
  71. data/lib/jasmine/spec/suites/RunnerSpec.js +267 -0
  72. data/lib/jasmine/spec/suites/SpecRunningSpec.js +1253 -0
  73. data/lib/jasmine/spec/suites/SpecSpec.js +124 -0
  74. data/lib/jasmine/spec/suites/SpySpec.js +201 -0
  75. data/lib/jasmine/spec/suites/SuiteSpec.js +120 -0
  76. data/lib/jasmine/spec/suites/TrivialReporterSpec.js +238 -0
  77. data/lib/jasmine/spec/suites/UtilSpec.js +40 -0
  78. data/lib/jasmine/spec/suites/WaitsForBlockSpec.js +87 -0
  79. data/lib/jasmine/src/Block.js +22 -0
  80. data/lib/jasmine/src/Env.js +264 -0
  81. data/lib/jasmine/src/JsApiReporter.js +102 -0
  82. data/lib/jasmine/src/Matchers.js +354 -0
  83. data/lib/jasmine/src/MultiReporter.js +35 -0
  84. data/lib/jasmine/src/NestedResults.js +80 -0
  85. data/lib/jasmine/src/PrettyPrinter.js +122 -0
  86. data/lib/jasmine/src/Queue.js +99 -0
  87. data/lib/jasmine/src/Reporter.js +31 -0
  88. data/lib/jasmine/src/Runner.js +77 -0
  89. data/lib/jasmine/src/Spec.js +242 -0
  90. data/lib/jasmine/src/Suite.js +82 -0
  91. data/lib/jasmine/src/WaitsBlock.js +13 -0
  92. data/lib/jasmine/src/WaitsForBlock.js +52 -0
  93. data/lib/jasmine/src/base.js +589 -0
  94. data/lib/jasmine/src/html/TrivialReporter.js +188 -0
  95. data/lib/jasmine/src/html/jasmine.css +166 -0
  96. data/lib/jasmine/src/mock-timeout.js +183 -0
  97. data/lib/jasmine/src/util.js +67 -0
  98. data/lib/jasmine/src/version.json +5 -0
  99. data/lib/tasks/evergreen.rake +54 -0
  100. data/spec/evergreen_spec.rb +29 -0
  101. data/spec/meta_spec.rb +50 -0
  102. data/spec/runner_spec.rb +33 -0
  103. data/spec/spec_helper.rb +49 -0
  104. data/spec/spec_spec.rb +28 -0
  105. data/spec/suite1/public/jquery.js +152 -0
  106. data/spec/suite1/public/styles.css +3 -0
  107. data/spec/suite1/spec/javascripts/bar_spec.js +0 -0
  108. data/spec/suite1/spec/javascripts/coffeescript_spec.coffee +7 -0
  109. data/spec/suite1/spec/javascripts/failing_spec.js +12 -0
  110. data/spec/suite1/spec/javascripts/foo_spec.js +0 -0
  111. data/spec/suite1/spec/javascripts/invalid_coffee_spec.coffee +1 -0
  112. data/spec/suite1/spec/javascripts/libs/lucid_spec.js +0 -0
  113. data/spec/suite1/spec/javascripts/models/game_spec.js +0 -0
  114. data/spec/suite1/spec/javascripts/slow_spec.coffee +8 -0
  115. data/spec/suite1/spec/javascripts/spec_helper.coffee +1 -0
  116. data/spec/suite1/spec/javascripts/spec_helper.js +1 -0
  117. data/spec/suite1/spec/javascripts/templates/another_template.html +1 -0
  118. data/spec/suite1/spec/javascripts/templates/escape.html +1 -0
  119. data/spec/suite1/spec/javascripts/templates/one_template.html +1 -0
  120. data/spec/suite1/spec/javascripts/templates/script_tags.html +3 -0
  121. data/spec/suite1/spec/javascripts/templates_spec.js +55 -0
  122. data/spec/suite1/spec/javascripts/testing_spec.js +11 -0
  123. data/spec/suite1/spec/javascripts/transactions_spec.js +14 -0
  124. data/spec/suite1/spec/javascripts/with_helper_spec.js +9 -0
  125. data/spec/suite2/config/evergreen.rb +5 -0
  126. data/spec/suite2/public_html/foo.js +1 -0
  127. data/spec/suite2/spec/awesome_spec.js +12 -0
  128. data/spec/suite2/spec/failing_spec.js +5 -0
  129. data/spec/suite2/templates/foo.html +1 -0
  130. data/spec/suite_spec.rb +26 -0
  131. data/spec/template_spec.rb +32 -0
  132. metadata +296 -0
@@ -0,0 +1,6 @@
1
+ module Jasmine
2
+ module Core
3
+ VERSION = "1.1.0.rc3"
4
+ end
5
+ end
6
+
@@ -0,0 +1,148 @@
1
+ module Evergreen
2
+ class Runner
3
+ class Example
4
+ def initialize(row)
5
+ @row = row
6
+ end
7
+
8
+ def passed?
9
+ @row['passed']
10
+ end
11
+
12
+ def failure_message
13
+ unless passed?
14
+ msg = []
15
+ msg << " Failed: #{@row['name']}"
16
+ msg << " #{@row['message']}"
17
+ msg << " in #{@row['trace']['fileName']}:#{@row['trace']['lineNumber']}" if @row['trace']
18
+ msg.join("\n")
19
+ end
20
+ end
21
+ end
22
+
23
+ class SpecRunner
24
+ attr_reader :runner, :spec
25
+
26
+ def initialize(runner, spec)
27
+ @runner = runner
28
+ @spec = spec
29
+ end
30
+
31
+ def session
32
+ runner.session
33
+ end
34
+
35
+ def io
36
+ runner.io
37
+ end
38
+
39
+ def run
40
+ io.puts dots
41
+ io.puts failure_messages
42
+ io.puts "\n#{examples.size} examples, #{failed_examples.size} failures"
43
+ passed?
44
+ end
45
+
46
+ def examples
47
+ @results ||= begin
48
+ session.visit(spec.url)
49
+
50
+ previous_results = ""
51
+
52
+ session.wait_until(180) do
53
+ dots = session.evaluate_script('Evergreen.dots')
54
+ io.print dots.sub(/^#{Regexp.escape(previous_results)}/, '')
55
+ io.flush
56
+ previous_results = dots
57
+ session.evaluate_script('Evergreen.done')
58
+ end
59
+
60
+ dots = session.evaluate_script('Evergreen.dots')
61
+ io.print dots.sub(/^#{Regexp.escape(previous_results)}/, '')
62
+
63
+ JSON.parse(session.evaluate_script('Evergreen.getResults()')).map do |row|
64
+ Example.new(row)
65
+ end
66
+ end
67
+ end
68
+
69
+ def failed_examples
70
+ examples.select { |example| not example.passed? }
71
+ end
72
+
73
+ def passed?
74
+ examples.all? { |example| example.passed? }
75
+ end
76
+
77
+ def dots
78
+ examples; ""
79
+ end
80
+
81
+ def failure_messages
82
+ unless passed?
83
+ examples.map { |example| example.failure_message }.compact.join("\n\n")
84
+ end
85
+ end
86
+ end
87
+
88
+ attr_reader :suite, :io
89
+
90
+ def initialize(suite, io=STDOUT)
91
+ @suite = suite
92
+ @io = io
93
+ end
94
+
95
+ def spec_runner(spec)
96
+ SpecRunner.new(self, spec)
97
+ end
98
+
99
+ def run
100
+ before = Time.now
101
+
102
+ io.puts ""
103
+ io.puts dots.to_s
104
+ io.puts ""
105
+ if failure_messages
106
+ io.puts failure_messages
107
+ io.puts ""
108
+ end
109
+
110
+ seconds = "%.2f" % (Time.now - before)
111
+ io.puts "Finished in #{seconds} seconds"
112
+ io.puts "#{examples.size} examples, #{failed_examples.size} failures"
113
+ passed?
114
+ end
115
+
116
+ def examples
117
+ spec_runners.map { |spec_runner| spec_runner.examples }.flatten
118
+ end
119
+
120
+ def failed_examples
121
+ examples.select { |example| not example.passed? }
122
+ end
123
+
124
+ def passed?
125
+ spec_runners.all? { |spec_runner| spec_runner.passed? }
126
+ end
127
+
128
+ def dots
129
+ spec_runners.map { |spec_runner| spec_runner.dots }.join
130
+ end
131
+
132
+ def failure_messages
133
+ unless passed?
134
+ spec_runners.map { |spec_runner| spec_runner.failure_messages }.compact.join("\n\n")
135
+ end
136
+ end
137
+
138
+ def session
139
+ @session ||= Capybara::Session.new(Evergreen.driver, suite.application)
140
+ end
141
+
142
+ protected
143
+
144
+ def spec_runners
145
+ @spec_runners ||= suite.specs.map { |spec| SpecRunner.new(self, spec) }
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,22 @@
1
+ module Evergreen
2
+ class Server
3
+ attr_reader :suite
4
+
5
+ def initialize(suite)
6
+ @suite = suite
7
+ end
8
+
9
+ def serve
10
+ server.boot
11
+ Launchy.open(server.url('/'))
12
+ sleep
13
+ end
14
+
15
+ protected
16
+
17
+ def server
18
+ @server ||= Capybara::Server.new(suite.application)
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,52 @@
1
+ require 'open3'
2
+
3
+ module Evergreen
4
+ class Spec
5
+ attr_reader :name, :suite
6
+
7
+ def initialize(suite, name)
8
+ @suite = suite
9
+ @name = name
10
+ end
11
+
12
+ def root
13
+ suite.root
14
+ end
15
+
16
+ def full_path
17
+ File.join(root, Evergreen.spec_dir, name)
18
+ end
19
+
20
+ def read
21
+ if full_path =~ /\.coffee$/
22
+ require 'coffee-script'
23
+ CoffeeScript.compile(File.read(full_path))
24
+ else
25
+ File.read(full_path)
26
+ end
27
+ end
28
+ alias_method :contents, :read
29
+
30
+ def url
31
+ "/run/#{name}"
32
+ end
33
+
34
+ def passed?
35
+ runner.passed?
36
+ end
37
+
38
+ def failure_messages
39
+ runner.failure_messages
40
+ end
41
+
42
+ def exist?
43
+ File.exist?(full_path)
44
+ end
45
+
46
+ protected
47
+
48
+ def runner
49
+ @runner ||= suite.runner.spec_runner(self)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,44 @@
1
+ module Evergreen
2
+ class Suite
3
+ attr_reader :root, :runner, :server, :driver, :application
4
+
5
+ def initialize(root)
6
+ @root = root
7
+
8
+ paths = [
9
+ File.expand_path("config/evergreen.rb", root),
10
+ File.expand_path(".evergreen", root),
11
+ "#{ENV["HOME"]}/.evergreen"
12
+ ]
13
+ paths.each { |path| load(path) if File.exist?(path) }
14
+
15
+ @runner = Runner.new(self)
16
+ @server = Server.new(self)
17
+ @application = Evergreen.application(self)
18
+ end
19
+
20
+ def run
21
+ runner.run
22
+ end
23
+
24
+ def serve
25
+ server.serve
26
+ end
27
+
28
+ def get_spec(name)
29
+ Spec.new(self, name)
30
+ end
31
+
32
+ def specs
33
+ Dir.glob(File.join(root, Evergreen.spec_dir, '**/*_spec.{js,coffee}')).map do |path|
34
+ Spec.new(self, path.gsub(File.join(root, Evergreen.spec_dir, ''), ''))
35
+ end
36
+ end
37
+
38
+ def templates
39
+ Dir.glob(File.join(root, Evergreen.template_dir, '*')).map do |path|
40
+ Template.new(self, File.basename(path))
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ require 'evergreen'
2
+
3
+ Dir[File.join(File.dirname(__FILE__), '..', 'tasks', '*.rake')].each do |f|
4
+ load f
5
+ end
6
+
@@ -0,0 +1,32 @@
1
+ module Evergreen
2
+ class Template
3
+ attr_reader :name, :suite
4
+
5
+ def initialize(suite, name)
6
+ @suite = suite
7
+ @name = name
8
+ end
9
+
10
+ def root
11
+ suite.root
12
+ end
13
+
14
+ def full_path
15
+ File.join(root, Evergreen.template_dir, name)
16
+ end
17
+
18
+ def read
19
+ File.read(full_path)
20
+ end
21
+ alias_method :contents, :read
22
+
23
+ def escaped_contents
24
+ contents.to_json.gsub("<script>", %{<scr" + "ipt>}).gsub("</script>", %{</scr" + "ipt>})
25
+ end
26
+
27
+ def exist?
28
+ File.exist?(full_path)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module Evergreen
2
+ VERSION = '0.4.1'
3
+ end
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>Evergreen</title>
6
+ <link rel="stylesheet" type="text/css" href="<%= url('/resources/jasmine.css') %>"/>
7
+ <link rel="stylesheet" type="text/css" href="<%= url('/resources/evergreen.css') %>"/>
8
+ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
9
+ </head>
10
+ <body>
11
+ <%= yield %>
12
+
13
+ <div id="footer">
14
+ Powered by <a href="http://github.com/jnicklas/evergreen">Evergreen</a>.
15
+ Evergreen is sponsored by <a href="http://elabs.se">Elabs</a>.
16
+ </div>
17
+ </body>
18
+ </html>
19
+
@@ -0,0 +1,9 @@
1
+ <div id="page">
2
+ <h1>Evergreen</h1>
3
+
4
+ <ul id="specs">
5
+ <% @suite.specs.each do |spec| %>
6
+ <li><a href="<%= url(spec.url) %>"><%= spec.name %></a></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
@@ -0,0 +1,40 @@
1
+ <script type="text/javascript" src="<%= url("/resources/jasmine.js") %>"></script>
2
+ <script type="text/javascript" src="<%= url("/resources/jasmine-html.js") %>"></script>
3
+ <script type="text/javascript" src="<%= url("/resources/evergreen.js") %>"></script>
4
+ <script type="text/javascript">
5
+ // <![CDATA[
6
+ <% begin %>
7
+ <%= @js_spec_helper.read.to_s + ";" if @js_spec_helper.exist? %>
8
+ <%= @coffee_spec_helper.read.to_s + ";" if @coffee_spec_helper.exist? %>
9
+ <%= @spec.read %>;
10
+ <% rescue StandardError => e %>
11
+ describe("failure", function() {
12
+ it("should not fail", function() {
13
+ throw(<%= "#{e.class}: #{e.message}".to_json %>);
14
+ });
15
+ });
16
+ <% end %>
17
+ // ]]>
18
+ </script>
19
+
20
+ <div id="page">
21
+ <h1>Evergreen</h1>
22
+ <a class="back" href="<%= url("/") %>">Back to list</a>
23
+ </div>
24
+
25
+ <div id="test"></div>
26
+
27
+ <script type="text/javascript">
28
+ // <![CDATA[
29
+ (function() {
30
+ Evergreen.driver = <%= Evergreen.driver.to_json %>;
31
+ <% @suite.templates.each do |template| %>
32
+ Evergreen.templates[<%= template.name.to_json %>] = <%= template.escaped_contents %>;
33
+ <% end %>
34
+ var jasmineEnv = jasmine.getEnv();
35
+ jasmineEnv.addReporter(new jasmine.TrivialReporter());
36
+ jasmineEnv.addReporter(new Evergreen.ReflectiveReporter());
37
+ jasmineEnv.execute();
38
+ })();
39
+ // ]]>
40
+ </script>
@@ -0,0 +1,6 @@
1
+ source :gemcutter
2
+
3
+ gem "jekyll", "0.6.2"
4
+ gem "json_pure", "~>1.4.3"
5
+ gem "ragaskar-jsdoc_helper"
6
+ gem "rake", "0.8.7"
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008-2010 Pivotal Labs
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,28 @@
1
+ <a name="README">[Jasmine](http://pivotal.github.com/jasmine/)</a>
2
+ =======
3
+ **A JavaScript Testing Framework**
4
+
5
+ Want to use Jasmine in a project? Go HERE: [http://pivotal.github.com/jasmine/](http://pivotal.github.com/jasmine/)
6
+
7
+ Want to contribute to Jasmine? Read on...
8
+
9
+ <i>(More developer docs to come...)</i>
10
+
11
+ ## Support
12
+ We now have a Google Group for support & discussion.
13
+
14
+ * Discussion: [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js)
15
+ * Group email: [jasmine-js@googlegroups.com](jasmine-js@googlegroups.com)
16
+ * Current build status of Jasmine is visible at [ci.pivotallabs.com](http://ci.pivotallabs.com)
17
+ * Pivotal Tracker project: [http://www.pivotaltracker.com/projects/10606](http://www.pivotaltracker.com/projects/10606)
18
+ * Twitter: [@JasmineBDD](http://twitter.com/JasmineBDD)
19
+
20
+ ## Maintainers
21
+ * [Davis W. Frank](mailto:dwfrank@pivotallabs.com), Pivotal Labs
22
+ * [Rajan Agaskar](mailto:rajan@pivotallabs.com), Pivotal Labs
23
+ * [Christian Williams](mailto:xian@pivotallabs.com), Pivotal Labs
24
+
25
+ ## Developers
26
+ We welcome your contributions! Jasmine is currently maintained by Davis Frank ([infews](http://github.com/infews)), Rajan Agaskar ([ragaskar](http://github.com/ragaskar)), and Christian Williams ([Xian](http://github.com/Xian)). You can help us by removing all other recipients from your pull request.
27
+
28
+ Copyright (c) 2008-2010 Pivotal Labs. This software is licensed under the MIT License.