jasmine-multi_json 1.3.1.1

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 (91) hide show
  1. data/.gitignore +13 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +58 -0
  4. data/Gemfile +8 -0
  5. data/HOW_TO_TEST.markdown +9 -0
  6. data/MIT.LICENSE +20 -0
  7. data/README.markdown +77 -0
  8. data/RELEASE.markdown +22 -0
  9. data/RELEASE_NOTES.markdown +6 -0
  10. data/Rakefile +62 -0
  11. data/generators/jasmine/jasmine_generator.rb +24 -0
  12. data/generators/jasmine/templates/INSTALL +9 -0
  13. data/generators/jasmine/templates/jasmine-example/SpecRunner.html +54 -0
  14. data/generators/jasmine/templates/jasmine-example/spec/PlayerSpec.js +58 -0
  15. data/generators/jasmine/templates/jasmine-example/spec/SpecHelper.js +9 -0
  16. data/generators/jasmine/templates/jasmine-example/src/Player.js +22 -0
  17. data/generators/jasmine/templates/jasmine-example/src/Song.js +7 -0
  18. data/generators/jasmine/templates/lib/tasks/jasmine.rake +8 -0
  19. data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +81 -0
  20. data/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +74 -0
  21. data/jasmine.gemspec +74 -0
  22. data/lib/generators/jasmine/examples/USAGE +11 -0
  23. data/lib/generators/jasmine/examples/examples_generator.rb +19 -0
  24. data/lib/generators/jasmine/examples/templates/app/assets/javascripts/jasmine_examples/Player.js +22 -0
  25. data/lib/generators/jasmine/examples/templates/app/assets/javascripts/jasmine_examples/Song.js +7 -0
  26. data/lib/generators/jasmine/examples/templates/spec/javascripts/helpers/SpecHelper.js +9 -0
  27. data/lib/generators/jasmine/examples/templates/spec/javascripts/jasmine_examples/PlayerSpec.js +58 -0
  28. data/lib/generators/jasmine/install/USAGE +11 -0
  29. data/lib/generators/jasmine/install/install_generator.rb +18 -0
  30. data/lib/generators/jasmine/install/templates/spec/javascripts/helpers/.gitkeep +0 -0
  31. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +76 -0
  32. data/lib/jasmine.rb +31 -0
  33. data/lib/jasmine/application.rb +21 -0
  34. data/lib/jasmine/asset_expander.rb +19 -0
  35. data/lib/jasmine/asset_pipeline_mapper.rb +16 -0
  36. data/lib/jasmine/asset_pipeline_utility.rb +19 -0
  37. data/lib/jasmine/base.rb +54 -0
  38. data/lib/jasmine/command_line_tool.rb +70 -0
  39. data/lib/jasmine/config.rb +85 -0
  40. data/lib/jasmine/configuration.rb +83 -0
  41. data/lib/jasmine/core_configuration.rb +28 -0
  42. data/lib/jasmine/dependencies.rb +59 -0
  43. data/lib/jasmine/firebug/firebug-1.6.2.xpi +0 -0
  44. data/lib/jasmine/firebug/firebug-1.7.0.xpi +0 -0
  45. data/lib/jasmine/firebug/firebug-license.txt +30 -0
  46. data/lib/jasmine/firebug/firebug.rb +30 -0
  47. data/lib/jasmine/javascripts/boot.js +28 -0
  48. data/lib/jasmine/page.rb +11 -0
  49. data/lib/jasmine/path_expander.rb +18 -0
  50. data/lib/jasmine/path_mapper.rb +29 -0
  51. data/lib/jasmine/railtie.rb +21 -0
  52. data/lib/jasmine/results.rb +19 -0
  53. data/lib/jasmine/results_processor.rb +38 -0
  54. data/lib/jasmine/rspec_formatter.rb +92 -0
  55. data/lib/jasmine/run.html.erb +18 -0
  56. data/lib/jasmine/run_specs.rb +36 -0
  57. data/lib/jasmine/runners/http.rb +71 -0
  58. data/lib/jasmine/selenium_driver.rb +41 -0
  59. data/lib/jasmine/server.rb +20 -0
  60. data/lib/jasmine/tasks/jasmine.rake +55 -0
  61. data/lib/jasmine/tasks/jasmine_rails3.rake +1 -0
  62. data/lib/jasmine/version.rb +3 -0
  63. data/lib/jasmine/yaml_config_parser.rb +54 -0
  64. data/lib/rack/jasmine/cache_control.rb +20 -0
  65. data/lib/rack/jasmine/focused_suite.rb +17 -0
  66. data/lib/rack/jasmine/runner.rb +27 -0
  67. data/spec/application_integration_spec.rb +15 -0
  68. data/spec/application_spec.rb +44 -0
  69. data/spec/asset_expander_spec.rb +42 -0
  70. data/spec/asset_pipeline_mapper_spec.rb +19 -0
  71. data/spec/base_spec.rb +14 -0
  72. data/spec/configuration_spec.rb +163 -0
  73. data/spec/dependencies_spec.rb +315 -0
  74. data/spec/fixture/Rakefile +4 -0
  75. data/spec/jasmine_command_line_tool_rakeless_spec.rb +20 -0
  76. data/spec/jasmine_command_line_tool_spec.rb +29 -0
  77. data/spec/jasmine_pojs_spec.rb +47 -0
  78. data/spec/jasmine_rails2_spec.rb +89 -0
  79. data/spec/jasmine_rails3_spec.rb +69 -0
  80. data/spec/jasmine_self_test_spec.rb +29 -0
  81. data/spec/page_spec.rb +23 -0
  82. data/spec/path_expander_spec.rb +96 -0
  83. data/spec/path_mapper_spec.rb +33 -0
  84. data/spec/rack/jasmine/runner_spec.rb +25 -0
  85. data/spec/results_processor_spec.rb +3 -0
  86. data/spec/results_spec.rb +27 -0
  87. data/spec/rspec_formatter_spec.rb +88 -0
  88. data/spec/server_spec.rb +48 -0
  89. data/spec/spec_helper.rb +55 -0
  90. data/spec/yaml_config_parser_spec.rb +182 -0
  91. metadata +310 -0
@@ -0,0 +1,30 @@
1
+ Software License Agreement (BSD License)
2
+
3
+ Copyright (c) 2007, Parakey Inc.
4
+ All rights reserved.
5
+
6
+ Redistribution and use of this software in source and binary forms, with or without modification,
7
+ are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above
10
+ copyright notice, this list of conditions and the
11
+ following disclaimer.
12
+
13
+ * Redistributions in binary form must reproduce the above
14
+ copyright notice, this list of conditions and the
15
+ following disclaimer in the documentation and/or other
16
+ materials provided with the distribution.
17
+
18
+ * Neither the name of Parakey Inc. nor the names of its
19
+ contributors may be used to endorse or promote products
20
+ derived from this software without specific prior
21
+ written permission of Parakey Inc.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
24
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
25
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
26
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
29
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,30 @@
1
+ require 'selenium/webdriver'
2
+
3
+ class Selenium::WebDriver::Firefox::Profile
4
+ def self.firebug_version
5
+ @firebug_version ||= '1.6.2'
6
+ end
7
+
8
+ def self.firebug_version=(version)
9
+ @firebug_version = version
10
+ end
11
+
12
+ def enable_firebug(version = nil)
13
+ version ||= Selenium::WebDriver::Firefox::Profile.firebug_version
14
+ add_extension(File.expand_path("../firebug-#{version}.xpi", __FILE__))
15
+
16
+ # Prevent "Welcome!" tab
17
+ self["extensions.firebug.currentVersion"] = "999"
18
+
19
+ # Enable for all sites.
20
+ self["extensions.firebug.allPagesActivation"] = "on"
21
+
22
+ # Enable all features.
23
+ ['console', 'net', 'script'].each do |feature|
24
+ self["extensions.firebug.#{feature}.enableSites"] = true
25
+ end
26
+
27
+ # Open by default.
28
+ self["extensions.firebug.previousPlacement"] = 1
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ var jsApiReporter;
2
+ (function() {
3
+ var jasmineEnv = jasmine.getEnv();
4
+
5
+ jsApiReporter = new jasmine.JsApiReporter();
6
+ var htmlReporter = new jasmine.HtmlReporter();
7
+
8
+ jasmineEnv.addReporter(jsApiReporter);
9
+ jasmineEnv.addReporter(htmlReporter);
10
+
11
+ jasmineEnv.specFilter = function(spec) {
12
+ return htmlReporter.specFilter(spec);
13
+ };
14
+
15
+ var currentWindowOnload = window.onload;
16
+
17
+ window.onload = function() {
18
+ if (currentWindowOnload) {
19
+ currentWindowOnload();
20
+ }
21
+ execJasmine();
22
+ };
23
+
24
+ function execJasmine() {
25
+ jasmineEnv.execute();
26
+ }
27
+
28
+ })();
@@ -0,0 +1,11 @@
1
+ module Jasmine
2
+ class Page
3
+ def initialize(context)
4
+ @context = context
5
+ end
6
+
7
+ def render
8
+ ERB.new(::Jasmine.runner_template).result(@context.instance_eval { binding })
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Jasmine
2
+ class PathExpander
3
+
4
+ def self.expand(base_directory, patterns, globber = Dir.method(:glob))
5
+ negative, positive = patterns.partition {|pattern| /^!/ =~ pattern}
6
+ chosen, negated = [positive, negative].collect do |patterns|
7
+ patterns.map do |path|
8
+ files = globber.call(File.join(base_directory, path.gsub(/^!/, '')))
9
+ if files.empty? && !(path =~ /\*|^\!/)
10
+ files = [File.join(base_directory, path)]
11
+ end
12
+ files
13
+ end.flatten.uniq
14
+ end
15
+ chosen - negated
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module Jasmine
2
+ class PathMapper
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
+
7
+ def map_src_paths(paths)
8
+ map(paths, @config.src_dir, @config.src_path)
9
+ end
10
+
11
+ def map_spec_paths(paths)
12
+ map(paths, @config.spec_dir, @config.spec_path)
13
+ end
14
+
15
+ def map_boot_paths(paths)
16
+ map(paths, @config.boot_dir, @config.boot_path)
17
+ end
18
+
19
+ def map_jasmine_paths(paths)
20
+ map(paths, @config.jasmine_dir, @config.jasmine_path)
21
+ end
22
+
23
+ private
24
+ def map(paths, remove_path, add_path)
25
+ paths.map { |path| File.join(add_path, (path.gsub(remove_path, ''))) }
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require "rails/railtie"
2
+ module Jasmine
3
+ class Railtie < Rails::Railtie
4
+
5
+ config.before_configuration do
6
+ old_jasmine_rakefile = ::Rails.root.join('lib', 'tasks', 'jasmine.rake')
7
+ if old_jasmine_rakefile.exist? && !ENV["USE_JASMINE_RAKE"]
8
+ puts %Q{
9
+ You no longer need to have jasmine.rake in your project, as it is now automatically loaded
10
+ from the Jasmine gem. To silence this warning, set "USE_JASMINE_RAKE=true" in your environment
11
+ or remove jasmine.rake.
12
+ }
13
+ end
14
+ end
15
+
16
+ rake_tasks do
17
+ load "jasmine/tasks/jasmine.rake"
18
+ load "jasmine/tasks/jasmine_rails3.rake"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Jasmine
2
+ class Results
3
+
4
+ attr_reader :suites
5
+ def initialize(result_hash, suite_hash, example_locations)
6
+ @suites = suite_hash
7
+ @results = result_hash
8
+ @example_locations = example_locations
9
+ end
10
+
11
+ def for_spec_id(id)
12
+ @results[id]
13
+ end
14
+
15
+ def example_location_for(spec_description)
16
+ @example_locations[spec_description]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ module Jasmine
2
+ class ResultsProcessor
3
+
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def process(results_hash, suites_hash)
9
+ return Jasmine::Results.new(results_hash, suites_hash, example_locations)
10
+ end
11
+
12
+ def example_locations
13
+ # example_locations = {}
14
+ # example_name_parts = []
15
+ # previous_indent_level = 0
16
+ # @config.spec_files_full_paths.each do |filename|
17
+ # line_number = 1
18
+ # File.open(filename, "r") do |file|
19
+ # file.readlines.each do |line|
20
+ # match = /^(\s*)(describe|it)\s*\(\s*["'](.*)["']\s*,\s*function/.match(line)
21
+ # if (match)
22
+ # indent_level = match[1].length / 2
23
+ # example_name = match[3]
24
+ # example_name_parts[indent_level] = example_name
25
+
26
+ # full_example_name = example_name_parts.slice(0, indent_level + 1).join(" ")
27
+ # example_locations[full_example_name] = "#{filename}:#{line_number}: in `it'"
28
+ # end
29
+ # line_number += 1
30
+ # end
31
+ # end
32
+ # end
33
+ # example_locations
34
+ {}
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,92 @@
1
+ require 'enumerator'
2
+
3
+ module Jasmine
4
+ class RspecFormatter
5
+
6
+ def format_results(results)
7
+ @results = results
8
+ declare_suites(@results.suites)
9
+ end
10
+
11
+ def declare_suites(suites)
12
+ suites.each do |suite|
13
+ #empty block for rspec 1
14
+ group = example_group(suite["name"]) {}
15
+ process_children(group, suite["children"])
16
+ end
17
+ end
18
+
19
+ def process_children(parent, children)
20
+ children.each do |suite_or_spec|
21
+ type = suite_or_spec["type"]
22
+ if type == "suite"
23
+ process_children(parent.describe(suite_or_spec["name"]), suite_or_spec["children"])
24
+ elsif type == "spec"
25
+ declare_spec(parent, suite_or_spec)
26
+ else
27
+ raise "unknown type #{type} for #{suite_or_spec.inspect}"
28
+ end
29
+ end
30
+ end
31
+
32
+ def declare_spec(parent, spec)
33
+ me = self
34
+ example_name = spec["name"]
35
+ backtrace = @results.example_location_for(parent.description + " " + example_name)
36
+ if Jasmine::Dependencies.rspec2?
37
+ parent.it example_name, {} do
38
+ me.report_spec(spec["id"])
39
+ end
40
+ else
41
+ parent.it example_name, {}, backtrace do
42
+ me.report_spec(spec["id"])
43
+ end
44
+ end
45
+ end
46
+
47
+ def report_spec(spec_id)
48
+ spec_results = results_for(spec_id)
49
+ out = ""
50
+ messages = spec_results['messages'].each do |message|
51
+ case
52
+ when message["type"] == "log"
53
+ puts message["text"]
54
+ puts "\n"
55
+ else
56
+ unless message["message"] =~ /^Passed.$/
57
+ STDERR << message["message"]
58
+ STDERR << "\n"
59
+
60
+ out << message["message"]
61
+ out << "\n"
62
+ end
63
+
64
+ if !message["passed"] && message["trace"]["stack"]
65
+ stack_trace = message["trace"]["stack"].gsub(/<br \/>/, "\n").gsub(/<\/?b>/, " ")
66
+ STDERR << stack_trace.gsub(/\(.*\)@http:\/\/localhost:[0-9]+\/specs\//, "/spec/")
67
+ STDERR << "\n"
68
+ end
69
+ end
70
+
71
+ end
72
+ fail out unless spec_results['result'] == 'passed'
73
+ puts out unless out.empty?
74
+ end
75
+
76
+ private
77
+
78
+ def example_group(*args, &block)
79
+ if Jasmine::Dependencies.rspec2?
80
+ RSpec::Core::ExampleGroup.describe(*args, &block).register
81
+ else
82
+ Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
83
+ end
84
+ end
85
+
86
+ def results_for(spec_id)
87
+ @results.for_spec_id(spec_id.to_s)
88
+ end
89
+
90
+
91
+ end
92
+ end
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2
+ <html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
5
+ <title>Jasmine suite</title>
6
+ <link rel="shortcut icon" type="image/png" href="/__JASMINE_ROOT__/images/jasmine_favicon.png">
7
+ <% css_files.each do |css_file| %>
8
+ <link rel="stylesheet" href="<%= css_file %>" type="text/css" media="screen"/>
9
+ <% end %>
10
+ <% js_files.each do |js_file| %>
11
+ <script src="<%= js_file %>" type="text/javascript"></script>
12
+ <% end %>
13
+
14
+ </head>
15
+ <body>
16
+ <div id="jasmine_content"></div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,36 @@
1
+ $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
+
3
+ require 'rubygems'
4
+ require 'jasmine'
5
+ if Jasmine::Dependencies.rspec2?
6
+ require 'rspec'
7
+ else
8
+ require 'spec'
9
+ end
10
+
11
+ jasmine_yml = File.join(Dir.pwd, 'spec', 'javascripts', 'support', 'jasmine.yml')
12
+ if File.exist?(jasmine_yml)
13
+ end
14
+
15
+ Jasmine.load_configuration_from_yaml
16
+
17
+ config = Jasmine.config
18
+
19
+ server = Jasmine::Server.new(config.port, Jasmine::Application.app(config))
20
+ driver = Jasmine::SeleniumDriver.new(config.browser, "#{config.host}:#{config.port}/")
21
+ t = Thread.new do
22
+ begin
23
+ server.start
24
+ rescue ChildProcess::TimeoutError
25
+ end
26
+ # # ignore bad exits
27
+ end
28
+ t.abort_on_exception = true
29
+ Jasmine::wait_for_listener(config.port, "jasmine server")
30
+ puts "jasmine server started."
31
+
32
+ results_processor = Jasmine::ResultsProcessor.new(config)
33
+ results = Jasmine::Runners::HTTP.new(driver, results_processor, config.result_batch_size).run
34
+ formatter = Jasmine::RspecFormatter.new
35
+ formatter.format_results(results)
36
+
@@ -0,0 +1,71 @@
1
+ module Jasmine
2
+ module Runners
3
+ class HTTP
4
+ attr_accessor :suites
5
+
6
+ def initialize(client, results_processor, result_batch_size)
7
+ @client = client
8
+ @results_processor = results_processor
9
+ @result_batch_size = result_batch_size
10
+ end
11
+
12
+ def run
13
+ @client.connect
14
+ load_suite_info
15
+ wait_for_suites_to_finish_running
16
+ results = @results_processor.process(results_hash, suites)
17
+ @client.disconnect
18
+ results
19
+ end
20
+
21
+ private
22
+
23
+ def load_suite_info
24
+ started = Time.now
25
+ while !eval_js('return jsApiReporter && jsApiReporter.started') do
26
+ raise "couldn't connect to Jasmine after 60 seconds" if (started + 60 < Time.now)
27
+ sleep 0.1
28
+ end
29
+
30
+ @suites = eval_js("var result = jsApiReporter.suites(); if (window.Prototype && Object.toJSON) { return Object.toJSON(result) } else { return JSON.stringify(result) }")
31
+ end
32
+
33
+ def results_hash
34
+ spec_results = {}
35
+ spec_ids.each_slice(@result_batch_size) do |slice|
36
+ spec_results.merge!(eval_js("var result = jsApiReporter.resultsForSpecs(#{json_generate(slice)}); if (window.Prototype && Object.toJSON) { return Object.toJSON(result) } else { return JSON.stringify(result) }"))
37
+ end
38
+ spec_results
39
+ end
40
+
41
+ def spec_ids
42
+ map_spec_ids = lambda do |suites|
43
+ suites.map do |suite_or_spec|
44
+ if suite_or_spec['type'] == 'spec'
45
+ suite_or_spec['id']
46
+ else
47
+ map_spec_ids.call(suite_or_spec['children'])
48
+ end
49
+ end
50
+ end
51
+ map_spec_ids.call(@suites).compact.flatten
52
+ end
53
+
54
+ def wait_for_suites_to_finish_running
55
+ puts "Waiting for suite to finish in browser ..."
56
+ while !eval_js('return jsApiReporter.finished') do
57
+ sleep 0.1
58
+ end
59
+ end
60
+
61
+ def eval_js(script)
62
+ @client.eval_js(script)
63
+ end
64
+
65
+ def json_generate(obj)
66
+ @client.json_generate(obj)
67
+ end
68
+
69
+ end
70
+ end
71
+ end