From edc2bfae93208ebf30824a2842f06b543f82fc10 Mon Sep 17 00:00:00 2001 From: "Davis W. Frank" Date: Sun, 24 Mar 2013 09:41:42 -0700 Subject: [PATCH] All Jasmine file manipulation/development moved from Thor to Grunt. Thor has been removed completely. Run `grunt --help` to see available tasks. Canonical Jasmine version now lives in `package.json` (Node formatted) and is copied into Jasmine source (JavaScript and Ruby) Jasmine distribution now has MIT license and Pivotal Labs copyright at the top of each distributed file. --- Contribute.markdown | 51 ++++++-- Gruntfile.js | 20 ++- README.markdown | 9 +- Rakefile | 39 ------ dist/jasmine-standalone-2.0.0-alpha.zip | Bin 0 -> 22715 bytes grunt/config/compress.js | 2 +- grunt/config/concat.js | 15 +++ grunt/tasks/build_standalone.js | 8 +- grunt/tasks/spec.js | 7 ++ grunt/tasks/version.js | 14 +++ {lib => grunt}/templates/SpecRunner.html.jst | 0 grunt/templates/licenseBanner.js.jst | 22 ++++ grunt/templates/version.rb.jst | 9 ++ jasmine-core.gemspec | 5 - jasmine_dev.thor | 1 - lib/jasmine-core/boot.js | 126 +++++++++++++++++++ lib/jasmine-core/boot/boot.js | 1 + lib/jasmine-core/jasmine-html.js | 22 ++++ lib/jasmine-core/jasmine.js | 35 ++++-- lib/jasmine-core/version.rb | 7 +- package.json | 3 +- spec/runner.html | 50 -------- spec/spec_helper.rb | 2 - spec/tasks/build_github_pages_spec.rb | 60 --------- spec/tasks/count_specs_spec.rb | 26 ---- spec/tasks/execute_specs_spec.rb | 81 ------------ spec/tasks/release_spec.rb | 39 ------ src/html/jasmine.css | 55 +++++++- tasks/docs.rb | 17 --- tasks/jasmine_dev.rb | 12 -- tasks/jasmine_dev/base.rb | 54 -------- tasks/jasmine_dev/build_github_pages.rb | 28 ----- tasks/jasmine_dev/count_specs.rb | 29 ----- tasks/jasmine_dev/execute_specs.rb | 54 -------- tasks/jasmine_dev/release.rb | 13 -- 35 files changed, 367 insertions(+), 549 deletions(-) create mode 100644 dist/jasmine-standalone-2.0.0-alpha.zip create mode 100644 grunt/tasks/spec.js create mode 100644 grunt/tasks/version.js rename {lib => grunt}/templates/SpecRunner.html.jst (100%) create mode 100644 grunt/templates/licenseBanner.js.jst create mode 100644 grunt/templates/version.rb.jst delete mode 100644 jasmine_dev.thor create mode 100644 lib/jasmine-core/boot.js delete mode 100644 spec/runner.html delete mode 100644 spec/tasks/build_github_pages_spec.rb delete mode 100644 spec/tasks/count_specs_spec.rb delete mode 100644 spec/tasks/execute_specs_spec.rb delete mode 100644 spec/tasks/release_spec.rb delete mode 100644 tasks/docs.rb delete mode 100644 tasks/jasmine_dev.rb delete mode 100644 tasks/jasmine_dev/base.rb delete mode 100644 tasks/jasmine_dev/build_github_pages.rb delete mode 100644 tasks/jasmine_dev/count_specs.rb delete mode 100644 tasks/jasmine_dev/execute_specs.rb delete mode 100644 tasks/jasmine_dev/release.rb diff --git a/Contribute.markdown b/Contribute.markdown index 8c0ffd18..a0491368 100644 --- a/Contribute.markdown +++ b/Contribute.markdown @@ -4,6 +4,36 @@ We welcome your contributions - Thanks for helping make Jasmine a better project for everyone. Please review the backlog and discussion lists (the main group - [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js) and the developer's list - [http://groups.google.com/group/jasmine-js-dev](http://groups.google.com/group/jasmine-js-dev)) before starting work - what you're looking for may already have been done. If it hasn't, the community can help make your contribution better. +## General Workflow + +Please submit pull requests via feature branches using the semi-standard workflow of: + +1. Fork it +1. Create your feature branch (`git checkout -b my-new-feature`) +1. Commit your changes (`git commit -am 'Add some feature'`) +1. Push to the branch (`git push origin my-new-feature`) +1. Create new Pull Request + +## Install Dependencies + +Jasmine Core relies on Ruby and Node.js. + +To install the Ruby dependencies, you will need Ruby, Rubygems, and Bundler available. Then: + + $ bundle + +...will install all of the Ruby dependencies. + +To install the Node dependencies, you will need Node.js, Npm, and [Grunt](http://gruntjs.com/) (including the grunt-cli). + + $ npm install --local + +...will install all of the node modules locally. If when you run + + $ grunt + +...you see that JSHint runs your system is ready. + ## How to write new Jasmine code Or, How to make a successful pull request @@ -12,24 +42,29 @@ Or, How to make a successful pull request * _Be environment agnostic_ - server-side developers are just as important as browser developers * _Be browser agnostic_ - if you must rely on browser-specific functionality, please write it in a way that degrades gracefully * _Write specs_ - Jasmine's a testing framework; don't add functionality without test-driving it +* _Write code in the style of the rest of the repo_ - Jasmine should look like a cohesive whole * _Ensure the *entire* test suite is green_ in all the big browsers, Node, and JSHint - your contribution shouldn't break Jasmine for other users Follow these tips and your pull request, patch, or suggestion is much more likely to be integrated. -## Environment - -Ruby, RubyGems and Rake are used in order to script the various file interactions. You will need to run on a system that supports Ruby in order to run Jasmine's specs. - -Node.js is used to run most of the specs (the HTML-independent code) and should be present. Additionally, the JS Hint project scrubs the source code as part of the spec process. - ## Development All source code belongs in `src/`. The `core/` directory contains the bulk of Jasmine's functionality. This code should remain browser- and environment-agnostic. If your feature or fix cannot be, as mentioned above, please degrade gracefully. Any code that should only be in a non-browser environment should live in `src/console/`. Any code that depends on a browser (specifically, it expects `window` to be the global or `document` is present) should live in `src/html/`. -Please respect the code patterns as possible. For example, using `jasmine.getGlobal()` to get the global object so as to remain environment agnostic. - ## Running Specs +Jasmine uses the Jasmine Ruby gem to test itself in browser. + + $ rake jasmine + +...and then visit `http://localhost:8888` to run specs. + +Jasmine uses a Node + + and uses a custom runner for node. + +Tests in Bro + As in all good projects, the `spec/` directory mirrors `src/` and follows the same rules. The browser runner will include and attempt to run all specs. The node runner will exclude any html-dependent specs (those in `spec/html/`). You will notice that all specs are run against the built `jasmine.js` instead of the component source files. This is intentional as a way to ensure that the concatenation code is working correctly. diff --git a/Gruntfile.js b/Gruntfile.js index cf27b91f..1dc6824d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -17,18 +17,24 @@ module.exports = function(grunt) { grunt.registerTask('default', ['jshint:all']); + var version = require('./grunt/tasks/version.js'); + var standaloneBuilder = require('./grunt/tasks/build_standalone.js'); + + grunt.registerTask('build:copyVersionToGem', + "Propagates the version from package.json to version.rb", + version.copyToGem); + grunt.registerTask('buildDistribution', 'Builds and lints jasmine.js, jasmine-html.js, jasmine.css', [ 'compass', 'jshint:beforeConcat', 'concat', - 'jshint:afterConcat' + 'jshint:afterConcat', + 'build:copyVersionToGem' ] ); - var standaloneBuilder = require('./grunt/tasks/build_standalone.js'); - grunt.registerTask("build:compileSpecRunner", "Processes the spec runner template and writes to a tmp file", standaloneBuilder.compileSpecRunner @@ -47,4 +53,12 @@ module.exports = function(grunt) { "build:cleanSpecRunner" ] ); + + var spec = require('./grunt/tasks/spec.js'); + + grunt.registerTask("execSpecsInNode", + "Run Jasmine core specs in Node.js", + spec.execSpecsInNode + ); + }; \ No newline at end of file diff --git a/README.markdown b/README.markdown index 04a899b3..3953cb0c 100644 --- a/README.markdown +++ b/README.markdown @@ -7,11 +7,9 @@ Jasmine is a Behavior Driven Development testing framework for JavaScript. It do Documentation & guides live here: [http://pivotal.github.com/jasmine/](http://pivotal.github.com/jasmine/) -# DEV GUIDE +## Contributing -Dependencies for this repo -* Ruby > 1.9, Rubygems, Bundler -* Node.js, npm +Please read the [contributors' guide](https://github.com/pivotal/jasmine/blob/master/Contribute.markdown) ## Support @@ -20,11 +18,10 @@ Dependencies for this repo * View the project backlog at Pivotal Tracker: [http://www.pivotaltracker.com/projects/10606](http://www.pivotaltracker.com/projects/10606) * Follow us on Twitter: [@JasmineBDD](http://twitter.com/JasmineBDD) - ## Maintainers * [Davis W. Frank](mailto:dwfrank@pivotallabs.com), Pivotal Labs * [Rajan Agaskar](mailto:rajan@pivotallabs.com), Pivotal Labs * [Christian Williams](mailto:antixian666@gmail.com), Square -Copyright (c) 2008-2012 Pivotal Labs. This software is licensed under the MIT License. +Copyright (c) 2008-2013 Pivotal Labs. This software is licensed under the MIT License. diff --git a/Rakefile b/Rakefile index 98621037..19072dbf 100644 --- a/Rakefile +++ b/Rakefile @@ -1,49 +1,12 @@ require "bundler" Bundler::GemHelper.install_tasks require "json" -require "tilt" require "jasmine" Dir["#{File.dirname(__FILE__)}/tasks/**/*.rb"].each do |file| require file end -desc "Run all Jasmine JS specs" -task :jasmine_specs do - jasmine_dev = JasmineDev.new - - return unless jasmine_dev.node_installed? - - system "thor jasmine_dev:execute_specs" - - puts "\n\033[33m>>> DEPRECATED <<< Run Jasmine's JavaScript specs with 'thor jasmine_dev:execute_specs'\n\033[0m" -end - -desc "Run all Jasmine core tests (JavaScript and dev tasks)" -task :spec => :require_pages_submodule do - jasmine_dev = JasmineDev.new - - return unless jasmine_dev.node_installed? - - system "rspec" -end - -task :require_pages_submodule do - jasmine_dev = JasmineDev.new - - unless jasmine_dev.pages_submodule_installed? - puts 'Installing the Github pages submodule:' - system 'git submodule update --init' - puts 'Now continuing...' - end -end - -desc "View full development tasks" -task :list_dev_tasks do - puts "Jasmine uses Thor for command line tasks for development. Here is the command set:" - system "thor list" -end - # TODO: Is there better way to invoke this using Jasmine gem??? task :core_spec do exec "ruby spec/jasmine_self_test_spec.rb" @@ -74,5 +37,3 @@ end desc "Run specs via server" task :jasmine => ['jasmine:server'] - - diff --git a/dist/jasmine-standalone-2.0.0-alpha.zip b/dist/jasmine-standalone-2.0.0-alpha.zip new file mode 100644 index 0000000000000000000000000000000000000000..0df49dc73b9a928cec7c45b38d828e001827d01e GIT binary patch literal 22715 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 literal 0 HcmV?d00001 diff --git a/grunt/config/compress.js b/grunt/config/compress.js index 8c02cdda..eb7db650 100644 --- a/grunt/config/compress.js +++ b/grunt/config/compress.js @@ -29,7 +29,7 @@ module.exports = { cwd: lib("") }, { - src: [ "boot.js"], + src: [ "boot.js" ], dest: standaloneLibDir, expand: true, cwd: lib("boot") diff --git a/grunt/config/concat.js b/grunt/config/concat.js index a8b9ae2f..b86e4196 100644 --- a/grunt/config/concat.js +++ b/grunt/config/concat.js @@ -1,3 +1,13 @@ +var grunt = require('grunt'); + +function license() { + var currentYear = "" + new Date(Date.now()).getFullYear(); + + return grunt.template.process( + grunt.file.read("grunt/templates/licenseBanner.js.jst"), + { data: { currentYear: currentYear}}); +} + module.exports = { 'jasmine-html': { src: [ @@ -23,7 +33,12 @@ module.exports = { ], dest: 'lib/jasmine-core/jasmine.js' }, + boot: { + src: ['lib/jasmine-core/boot/boot.js'], + dest: 'lib/jasmine-core/boot.js' + }, options: { + banner: license(), process: { data: { version: global.jasmineVersion diff --git a/grunt/tasks/build_standalone.js b/grunt/tasks/build_standalone.js index 285b57b6..84482b8d 100644 --- a/grunt/tasks/build_standalone.js +++ b/grunt/tasks/build_standalone.js @@ -1,14 +1,14 @@ var grunt = require("grunt"); -var _ = require("underscore"); function standaloneTmpDir(path) { return "dist/tmp/" + path; } module.exports = { compileSpecRunner: function() { - var runnerTemplate = _.template(grunt.file.read("lib/templates/SpecRunner.html.jst")), - runner = runnerTemplate({ jasmineVersion: global.jasmineVersion }); + var runnerHtml = grunt.template.process( + grunt.file.read("grunt/templates/SpecRunner.html.jst"), + { data: { jasmineVersion: global.jasmineVersion }}); - grunt.file.write(standaloneTmpDir("SpecRunner.html"), runner); + grunt.file.write(standaloneTmpDir("SpecRunner.html"), runnerHtml); }, cleanSpecRunner: function() { diff --git a/grunt/tasks/spec.js b/grunt/tasks/spec.js new file mode 100644 index 00000000..ceb49465 --- /dev/null +++ b/grunt/tasks/spec.js @@ -0,0 +1,7 @@ +var shell = require('shelljs'); + +module.exports = { + execSpecsInNode: function() { + shell.exec("node spec/node_suite.js --color=true") + } +}; \ No newline at end of file diff --git a/grunt/tasks/version.js b/grunt/tasks/version.js new file mode 100644 index 00000000..f8ff6a10 --- /dev/null +++ b/grunt/tasks/version.js @@ -0,0 +1,14 @@ +var grunt = require("grunt"); + +function gemLib(path) { return './lib/jasmine-core/' + path; } +function nodeToRuby(version) { return version.replace('-', '.'); } + +module.exports = { + copyToGem: function() { + var versionRb = grunt.template.process( + grunt.file.read("grunt/templates/version.rb.jst"), + { data: { jasmineVersion: nodeToRuby(global.jasmineVersion) }}); + + grunt.file.write(gemLib("version.rb"), versionRb); + } +}; diff --git a/lib/templates/SpecRunner.html.jst b/grunt/templates/SpecRunner.html.jst similarity index 100% rename from lib/templates/SpecRunner.html.jst rename to grunt/templates/SpecRunner.html.jst diff --git a/grunt/templates/licenseBanner.js.jst b/grunt/templates/licenseBanner.js.jst new file mode 100644 index 00000000..2b28f223 --- /dev/null +++ b/grunt/templates/licenseBanner.js.jst @@ -0,0 +1,22 @@ +/* +Copyright (c) 2008-<%= currentYear %> Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ diff --git a/grunt/templates/version.rb.jst b/grunt/templates/version.rb.jst new file mode 100644 index 00000000..411403c2 --- /dev/null +++ b/grunt/templates/version.rb.jst @@ -0,0 +1,9 @@ +# +# DO NOT Edit this file. Canonical version of Jasmine lives in the repo's package.json. This file is generated +# by a grunt task when the standalone release is built. +# +module Jasmine + module Core + VERSION = "<%= jasmineVersion %>" + end +end diff --git a/jasmine-core.gemspec b/jasmine-core.gemspec index 7f4711e3..2a63cde4 100644 --- a/jasmine-core.gemspec +++ b/jasmine-core.gemspec @@ -17,16 +17,11 @@ Gem::Specification.new do |s| s.files = Dir.glob("./lib/**/*") + Dir.glob("./lib/jasmine-core/spec/**/*.js") s.require_paths = ["lib"] s.add_development_dependency "json_pure", ">= 1.4.3" - s.add_development_dependency "tilt" s.add_development_dependency "sass" s.add_development_dependency "compass" s.add_development_dependency "ragaskar-jsdoc_helper" s.add_development_dependency "rspec" s.add_development_dependency "fuubar" s.add_development_dependency "awesome_print" - s.add_development_dependency "thor" s.add_development_dependency "nokogiri" - s.add_development_dependency "redcarpet", "1.7" - s.add_development_dependency "rocco" - s.add_development_dependency "rdiscount" end diff --git a/jasmine_dev.thor b/jasmine_dev.thor deleted file mode 100644 index 7fe0ca71..00000000 --- a/jasmine_dev.thor +++ /dev/null @@ -1 +0,0 @@ -require "#{File.expand_path(File.dirname(__FILE__))}/tasks/jasmine_dev" \ No newline at end of file diff --git a/lib/jasmine-core/boot.js b/lib/jasmine-core/boot.js new file mode 100644 index 00000000..c8977021 --- /dev/null +++ b/lib/jasmine-core/boot.js @@ -0,0 +1,126 @@ +/* +Copyright (c) 2008-2013 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +// Jasmine boot.js for browser runners - exposes external/global interface, builds the Jasmine environment and executes it. +(function() { + var env = jasmine.getEnv(); + + var jasmineInterface = { + describe: function(description, specDefinitions) { + return env.describe(description, specDefinitions); + }, + + xdescribe: function(description, specDefinitions) { + return env.xdescribe(description, specDefinitions); + }, + + it: function(desc, func) { + return env.it(desc, func); + }, + + xit: function(desc, func) { + return env.xit(desc, func); + }, + + beforeEach: function(beforeEachFunction) { + return env.beforeEach(beforeEachFunction); + }, + + afterEach: function(afterEachFunction) { + return env.afterEach(afterEachFunction); + }, + + expect: function(actual) { + return env.expect(actual); + }, + + pending: function() { + return env.pending(); + }, + + addMatchers: function(matchers) { + return env.addMatchers(matchers); + }, + + spyOn: function(obj, methodName) { + return env.spyOn(obj, methodName); + }, + + clock: env.clock, + setTimeout: env.clock.setTimeout, + clearTimeout: env.clock.clearTimeout, + setInterval: env.clock.setInterval, + clearInterval: env.clock.clearInterval, + + jsApiReporter: new jasmine.JsApiReporter(jasmine) + }; + + if (typeof window == "undefined" && typeof exports == "object") { + extend(exports, jasmineInterface); + } else { + extend(window, jasmineInterface); + } + + var queryString = new jasmine.QueryString({ + getWindowLocation: function() { return window.location; } + }); + + // TODO: move all of catching to raise so we don't break our brains + var catchingExceptions = queryString.getParam("catch"); + env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); + + var htmlReporter = new jasmine.HtmlReporter({ + env: env, + queryString: queryString, + onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); }, + getContainer: function() { return document.body; }, + createElement: function() { return document.createElement.apply(document, arguments); }, + createTextNode: function() { return document.createTextNode.apply(document, arguments); } + }); + + env.addReporter(jasmineInterface.jsApiReporter); + env.addReporter(htmlReporter); + + var specFilter = new jasmine.HtmlSpecFilter({ + filterString: function() { return queryString.getParam("spec"); } + }); + + env.specFilter = function(spec) { + return specFilter.matches(spec.getFullName()); + }; + + var currentWindowOnload = window.onload; + + window.onload = function() { + if (currentWindowOnload) { + currentWindowOnload(); + } + htmlReporter.initialize(); + env.execute(); + }; + + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + +}()); diff --git a/lib/jasmine-core/boot/boot.js b/lib/jasmine-core/boot/boot.js index aa29f812..aea8e00c 100644 --- a/lib/jasmine-core/boot/boot.js +++ b/lib/jasmine-core/boot/boot.js @@ -1,3 +1,4 @@ +// Jasmine boot.js for browser runners - exposes external/global interface, builds the Jasmine environment and executes it. (function() { var env = jasmine.getEnv(); diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 4f75e167..dcc89137 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -1,3 +1,25 @@ +/* +Copyright (c) 2008-2013 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ jasmine.HtmlReporter = function(options) { var env = options.env || {}, getContainer = options.getContainer, diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 622dc452..32c580e9 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -1,3 +1,25 @@ +/* +Copyright (c) 2008-2013 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /** * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. @@ -372,22 +394,9 @@ jasmine.createSpyObj = function(baseName, methodNames) { return obj; }; -/** - * @namespace - */ jasmine.util = {}; -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ jasmine.util.inherit = function(childClass, parentClass) { - /** - * @private - */ var subclass = function() { }; subclass.prototype = parentClass.prototype; diff --git a/lib/jasmine-core/version.rb b/lib/jasmine-core/version.rb index 2dafd0eb..e9afa67a 100644 --- a/lib/jasmine-core/version.rb +++ b/lib/jasmine-core/version.rb @@ -1,6 +1,9 @@ +# +# DO NOT Edit this file. Canonical version of Jasmine lives in the repo's package.json. This file is generated +# by a grunt task when the standalone release is built. +# module Jasmine module Core - VERSION = "1.3.1" + VERSION = "2.0.0.alpha" end end - diff --git a/package.json b/package.json index b350cd47..cfd29227 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,11 @@ "license": "MIT", "version": "2.0.0-alpha", "devDependencies": { + "grunt": "~0.4.1", "grunt-contrib-jshint": "~0.2.0", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-compass": "~0.1.3", "grunt-contrib-compress": "~0.4.1", - "underscore": "~1.4.4" + "shelljs": "~0.1.2" } } diff --git a/spec/runner.html b/spec/runner.html deleted file mode 100644 index ef77db8d..00000000 --- a/spec/runner.html +++ /dev/null @@ -1,50 +0,0 @@ - - - Jasmine Spec Runner: Jasmine Core - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index a2e43eb4..5abda95f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,8 +18,6 @@ def project_root File.join(File.expand_path(File.dirname(__FILE__)), '..') end -require "#{project_root}/tasks/jasmine_dev" - def capture_output(capture = true) if capture output = StringIO.new diff --git a/spec/tasks/build_github_pages_spec.rb b/spec/tasks/build_github_pages_spec.rb deleted file mode 100644 index 921ed140..00000000 --- a/spec/tasks/build_github_pages_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec_helper.rb' - -describe "Build Github Pages task" do - - let(:pages_dir) { File.join(Dir.tmpdir, 'pages') } - let(:jasmine_dev) { JasmineDev.new } - - before do - reset_dir pages_dir - end - - describe "when the Github pages submodule is not present" do - before do - jasmine_dev.should_receive(:has_pages_submodule?).and_return(false) - - @output = capture_output { jasmine_dev.build_github_pages pages_dir } - end - - it "should tell the user the task is running" do - @output.should match(/Building Github Pages/) - end - - it "should prompt the user to install the submodule" do - @output.should match(/Submodule for Github Pages isn't present/) - end - end - - describe "when the Github pages submodule is present" do - before do - jasmine_dev.should_receive(:has_pages_submodule?).and_return(true) - - @output = capture_output { jasmine_dev.build_github_pages pages_dir } - end - - it "should tell the user the task is running" do - @output.should match(/Building Github Pages/) - end - - it "should copy the latest jasmine files to the pages dir" do - ['jasmine.js', 'jasmine.css', 'jasmine-html.js'].each do |lib_file| - source = File.read(File.join(project_root, 'lib', 'jasmine-core', lib_file)) - dest = File.read(File.join(pages_dir, 'lib', lib_file)) - - source.should == dest - end - end - - it "should build a new page" do - @output.should match(/rocco/) - File.exist?(File.join(pages_dir, 'introduction.html')).should be_true - end - - it "should copy the rocco output to index.html" do - introduction = File.read(File.join(pages_dir, 'introduction.html')) - index = File.read(File.join(pages_dir, 'index.html')) - - index.should == introduction - end - end -end \ No newline at end of file diff --git a/spec/tasks/count_specs_spec.rb b/spec/tasks/count_specs_spec.rb deleted file mode 100644 index 3f4afd09..00000000 --- a/spec/tasks/count_specs_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper.rb' - -describe "Spec counting task" do - - let(:jasmine_dev) { JasmineDev.new } - - before do - @output = capture_output { jasmine_dev.count_specs } - end - - it "should tell the developer that the specs are being counted" do - @output.should match(/Counting specs/) - end - - it "should report the number of specs that will run in node" do - @output.should match(/\d+ \e\[0mspecs for Node.js/) - end - - it "should report the number of specs that will run in the browser" do - @output.should match(/\d+ \e\[0mspecs for Browser/) - end - - it "should remind the developer to check the count" do - @output.should match(/Please verify/) - end -end \ No newline at end of file diff --git a/spec/tasks/execute_specs_spec.rb b/spec/tasks/execute_specs_spec.rb deleted file mode 100644 index 040378ef..00000000 --- a/spec/tasks/execute_specs_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper.rb' - -describe "Spec tasks" do - - let(:jasmine_dev) { JasmineDev.new } - - describe "execute_specs_in_node" do - describe "when Node.js is not present" do - before do - jasmine_dev.should_receive(:has_node?).and_return(false) - @output = capture_output { jasmine_dev.execute_specs_in_node } - end - - it "should prompt the user to install Node" do - @output.should match(/Node\.js is required/) - end - end - - describe "when Node.js is present" do - before do - jasmine_dev.should_receive(:has_node?).and_return(true) - @output = capture_output { jasmine_dev.execute_specs_in_node } - end - - it "should build the distribution" do - @output.should match(/Building Jasmine distribution/) - end - - it "should tell the developer that the specs are being counted" do - @output.should match(/Counting specs/) - end - - it "should tell the user that the specs are running in Node.js" do - @output.should match(/specs via Node/) - @output.should match(/Started/) - @output.should match(/\d+ specs, 0 failures/) - end - end - end - - describe "execute_specs_in_browser" do - before do - jasmine_dev.should_receive(:run) - @output = capture_output { jasmine_dev.execute_specs_in_browser } - end - - it "should build the distribution" do - @output.should match(/Building Jasmine distribution/) - end - - it "should tell the developer that the specs are being counted" do - @output.should match(/Counting specs/) - end - - it "should tell the user that the specs are running in the broswer" do - @output.should match(/specs via the default web browser/) - end - end - - describe "execute_specs" do - before do - @output = capture_output { jasmine_dev.execute_specs } - end - - it "should build the distribution" do - @output.should match(/Building Jasmine distribution/) - end - - it "should tell the developer that the specs are being counted" do - @output.should match(/Counting specs/) - end - - it "should tell the user that the specs are running in Node.js" do - @output.should match(/specs via Node/) - end - - it "should tell the user that the specs are running in the broswer" do - @output.should match(/specs via the default web browser/) - end - end -end \ No newline at end of file diff --git a/spec/tasks/release_spec.rb b/spec/tasks/release_spec.rb deleted file mode 100644 index b7eff4b5..00000000 --- a/spec/tasks/release_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper.rb' - -describe "Release task" do - - let(:jasmine_dev) { JasmineDev.new } - - describe "when the pages submodule is not present" do - before do - jasmine_dev.should_receive(:has_pages_submodule?).and_return(false) - - @output = capture_output { jasmine_dev.release_prep } - end - - it "should tell the user the task is running" do - @output.should match(/Building Release/) - end - - it "should prompt the user to install the submodule" do - @output.should match(/Submodule for Github Pages isn't present/) - end - end - - describe "when the pages submodule is present" do - before do - JasmineDev.any_instance.should_receive(:write_version_files) - JasmineDev.any_instance.should_receive(:build_distribution) - JasmineDev.any_instance.should_receive(:build_standalone_distribution) - JasmineDev.any_instance.should_receive(:build_github_pages) - - jasmine_dev.should_receive(:has_pages_submodule?).and_return(true) - - @output = capture_output { jasmine_dev.release_prep } - end - - it "should tell the user the task is running" do - @output.should match(/Building Release/) - end - end -end \ No newline at end of file diff --git a/src/html/jasmine.css b/src/html/jasmine.css index 0a0ce800..da978dad 100644 --- a/src/html/jasmine.css +++ b/src/html/jasmine.css @@ -1,54 +1,107 @@ +/* line 24, _HTMLReporter.scss */ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } +/* line 31, _HTMLReporter.scss */ .html-reporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } +/* line 38, _HTMLReporter.scss */ .html-reporter a { text-decoration: none; } +/* line 41, _HTMLReporter.scss */ .html-reporter a:hover { text-decoration: underline; } +/* line 46, _HTMLReporter.scss */ .html-reporter p, .html-reporter h1, .html-reporter h2, .html-reporter h3, .html-reporter h4, .html-reporter h5, .html-reporter h6 { margin: 0; line-height: 14px; } +/* line 58, _HTMLReporter.scss */ .html-reporter .banner, .html-reporter .symbol-summary, .html-reporter .summary, .html-reporter .result-message, .html-reporter .spec .description, .html-reporter .spec-detail .description, .html-reporter .alert .bar, .html-reporter .stack-trace { padding-left: 9px; padding-right: 9px; } +/* line 63, _HTMLReporter.scss */ .html-reporter .banner .version { margin-left: 14px; } +/* line 69, _HTMLReporter.scss */ .html-reporter #jasmine_content { position: fixed; right: 100%; } +/* line 74, _HTMLReporter.scss */ .html-reporter .version { color: #aaaaaa; } +/* line 80, _HTMLReporter.scss */ .html-reporter .banner { margin-top: 14px; } +/* line 84, _HTMLReporter.scss */ .html-reporter .duration { color: #aaaaaa; float: right; } +/* line 91, _HTMLReporter.scss */ .html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; } +/* line 95, _HTMLReporter.scss */ .html-reporter .symbol-summary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } +/* line 104, _HTMLReporter.scss */ .html-reporter .symbol-summary li.passed { font-size: 14px; } +/* line 107, _HTMLReporter.scss */ .html-reporter .symbol-summary li.passed:before { color: #5e7d00; content: "\02022"; } +/* line 113, _HTMLReporter.scss */ .html-reporter .symbol-summary li.failed { line-height: 9px; } +/* line 116, _HTMLReporter.scss */ .html-reporter .symbol-summary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } +/* line 124, _HTMLReporter.scss */ .html-reporter .symbol-summary li.disabled { font-size: 14px; } +/* line 127, _HTMLReporter.scss */ .html-reporter .symbol-summary li.disabled:before { color: #bababa; content: "\02022"; } +/* line 133, _HTMLReporter.scss */ .html-reporter .symbol-summary li.pending { line-height: 17px; } +/* line 135, _HTMLReporter.scss */ .html-reporter .symbol-summary li.pending:before { color: #ba9d37; content: "*"; } +/* line 143, _HTMLReporter.scss */ .html-reporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } +/* line 152, _HTMLReporter.scss */ .html-reporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } +/* line 159, _HTMLReporter.scss */ .html-reporter .bar.failed { background-color: #b03911; } +/* line 163, _HTMLReporter.scss */ .html-reporter .bar.passed { background-color: #a6b779; } +/* line 167, _HTMLReporter.scss */ .html-reporter .bar.skipped { background-color: #bababa; } +/* line 171, _HTMLReporter.scss */ .html-reporter .bar.menu { background-color: #fff; color: #aaaaaa; } +/* line 175, _HTMLReporter.scss */ .html-reporter .bar.menu a { color: #333333; } +/* line 180, _HTMLReporter.scss */ .html-reporter .bar a { color: white; } +/* line 188, _HTMLReporter.scss */ .html-reporter.spec-list .bar.menu.failure-list, .html-reporter.spec-list .results .failures { display: none; } +/* line 195, _HTMLReporter.scss */ .html-reporter.failure-list .bar.menu.spec-list, .html-reporter.failure-list .summary { display: none; } +/* line 200, _HTMLReporter.scss */ .html-reporter .running-alert { background-color: #666666; } +/* line 206, _HTMLReporter.scss */ .html-reporter .results { margin-top: 14px; } +/* line 214, _HTMLReporter.scss */ .html-reporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } +/* line 218, _HTMLReporter.scss */ .html-reporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } +/* line 223, _HTMLReporter.scss */ .html-reporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } +/* line 228, _HTMLReporter.scss */ .html-reporter.showDetails .summary { display: none; } +/* line 232, _HTMLReporter.scss */ .html-reporter.showDetails #details { display: block; } +/* line 237, _HTMLReporter.scss */ .html-reporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } +/* line 244, _HTMLReporter.scss */ .html-reporter .summary { margin-top: 14px; } +/* line 247, _HTMLReporter.scss */ .html-reporter .summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } +/* line 253, _HTMLReporter.scss */ .html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; } +/* line 260, _HTMLReporter.scss */ .html-reporter .summary li.passed a { color: #5e7d00; } +/* line 264, _HTMLReporter.scss */ .html-reporter .summary li.failed a { color: #b03911; } +/* line 268, _HTMLReporter.scss */ .html-reporter .summary li.pending a { color: #ba9d37; } +/* line 274, _HTMLReporter.scss */ .html-reporter .description + .suite { margin-top: 0; } +/* line 278, _HTMLReporter.scss */ .html-reporter .suite { margin-top: 14px; } +/* line 281, _HTMLReporter.scss */ .html-reporter .suite a { color: #333333; } +/* line 289, _HTMLReporter.scss */ .html-reporter .failures .spec-detail { margin-bottom: 28px; } +/* line 292, _HTMLReporter.scss */ .html-reporter .failures .spec-detail .description { display: block; color: white; background-color: #b03911; } +/* line 304, _HTMLReporter.scss */ .html-reporter .result-message { padding-top: 14px; color: #333333; white-space: pre; } +/* line 312, _HTMLReporter.scss */ .html-reporter .result-message span.result { display: block; } -.html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #dddddd; background: white; white-space: pre; } +/* line 316, _HTMLReporter.scss */ +.html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } diff --git a/tasks/docs.rb b/tasks/docs.rb deleted file mode 100644 index b940aecc..00000000 --- a/tasks/docs.rb +++ /dev/null @@ -1,17 +0,0 @@ -desc "Build jasmine documentation" -task :doc => :require_pages_submodule do - puts 'Creating Jasmine Documentation' - require 'rubygems' - require 'jsdoc_helper' - - FileUtils.rm_r "pages/jsdoc", :force => true - - JsdocHelper::Rake::Task.new(:lambda_jsdoc) do |t| - t[:files] = core_sources + html_sources + console_sources - t[:options] = "-a" - t[:out] = "pages/jsdoc" - # JsdocHelper bug: template must be relative to the JsdocHelper gem, ick - t[:template] = File.join("../".*(100), Dir::getwd, "jsdoc-template") - end - Rake::Task[:lambda_jsdoc].invoke -end diff --git a/tasks/jasmine_dev.rb b/tasks/jasmine_dev.rb deleted file mode 100644 index 236c9424..00000000 --- a/tasks/jasmine_dev.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'thor' -require 'json' -require 'tilt' -require 'ostruct' - -$:.unshift(File.join(File.dirname(__FILE__), "jasmine_dev")) - -require "base" -require "build_github_pages" -require "count_specs" -require "execute_specs" -require "release" diff --git a/tasks/jasmine_dev/base.rb b/tasks/jasmine_dev/base.rb deleted file mode 100644 index 07dc09e4..00000000 --- a/tasks/jasmine_dev/base.rb +++ /dev/null @@ -1,54 +0,0 @@ -class JasmineDev < Thor - include Thor::Actions - - def self.source_root - File.dirname(__FILE__) - end - - def self.source_paths - [ - File.join(JasmineDev.project_root, 'lib', 'jasmine-core'), - JasmineDev.project_root - ] - end - - def self.project_root - File.join(JasmineDev.source_root, '..', '..') - end - - def self.spacer - "\n--------------------" - end - - no_tasks do - # allows merged stdout in test with low-harassment - def run_with_output(*run_args) - say run *run_args - end - - def node_installed? - return true if has_node? - - say "Node.js is required to develop Jasmine. Please visit http://nodejs.org to install.", - :red - false - end - - def has_node? - run "which node", :verbose => false, :capture => true - $?.exitstatus == 0 - end - - def pages_submodule_installed? - return true if has_pages_submodule? - - say "Submodule for Github Pages isn't present. Run git submodule update --init", - :red - false - end - - def has_pages_submodule? - File.exist?(File.join(JasmineDev.project_root, 'pages', 'index.html')) - end - end -end diff --git a/tasks/jasmine_dev/build_github_pages.rb b/tasks/jasmine_dev/build_github_pages.rb deleted file mode 100644 index 373d3e39..00000000 --- a/tasks/jasmine_dev/build_github_pages.rb +++ /dev/null @@ -1,28 +0,0 @@ -class JasmineDev < Thor - - desc "build_github_pages", "Build static pages for pivotal.github.com/jasmine" - def build_github_pages(pages_dir = File.expand_path(File.join('.', 'pages'))) - say JasmineDev.spacer - - say "Building Github Pages...", :cyan - - return unless pages_submodule_installed? - - project_lib_dir = File.join(JasmineDev.project_root, 'lib', 'jasmine-core') - - pages_lib_dir = File.join(pages_dir, 'lib') - FileUtils.rm_r(pages_lib_dir) if File.exist?(pages_lib_dir) - - ['jasmine.js', 'jasmine-html.js', 'jasmine.css'].each do |file| - copy_file File.join(project_lib_dir, file), File.join(pages_lib_dir, file) - end - - inside File.join(JasmineDev.project_root, 'pages', 'src') do - run_with_output "bundle exec rocco -l js introduction.js -t layout.mustache -o #{pages_dir}" - end - - inside pages_dir do - copy_file File.join(pages_dir,'introduction.html'), File.join(pages_dir,'index.html') - end - end -end \ No newline at end of file diff --git a/tasks/jasmine_dev/count_specs.rb b/tasks/jasmine_dev/count_specs.rb deleted file mode 100644 index 1a96d24b..00000000 --- a/tasks/jasmine_dev/count_specs.rb +++ /dev/null @@ -1,29 +0,0 @@ -class JasmineDev < Thor - - desc "count_specs", "Count the number of specs for each test runner" - def count_specs - say JasmineDev.spacer - say "Counting specs...", :cyan - - core_spec_count = count_specs_in(File.join('spec', 'core')) - console_spec_count = count_specs_in(File.join('spec', 'console')) - html_spec_count = count_specs_in(File.join('spec', 'html')) - - say "#{(core_spec_count + console_spec_count).to_s} ", :yellow - say "specs for Node.js runner (exclude DOM-related specs)" - say "#{(core_spec_count + console_spec_count + html_spec_count).to_s} ", :yellow - say "specs for Browser runner (all specs)" - say "\n" - say "Please verify that these numbers match the runner output." - end - - no_tasks do - def count_specs_in(relative_path) - files = Dir.glob(File.join(JasmineDev.project_root, relative_path, '*.js')) - files.inject(0) do |count, file| - File.read(file).scan(/^\s*it\(.*/) { |s| count += 1 } - count - end - end - end -end diff --git a/tasks/jasmine_dev/execute_specs.rb b/tasks/jasmine_dev/execute_specs.rb deleted file mode 100644 index 52b6b9ca..00000000 --- a/tasks/jasmine_dev/execute_specs.rb +++ /dev/null @@ -1,54 +0,0 @@ -class JasmineDev < Thor - - desc "execute_specs_in_node", "Run all relevant specs in Node.js" - - def execute_specs_in_node - return unless node_installed? - - `grunt buildDistribution` - invoke :count_specs - - say JasmineDev.spacer - - say "Running all appropriate specs via Node.js...", :cyan - - with_color_option = STDOUT.isatty ? "--color" : "--noColor" - - run_with_output "node spec/node_suite.js #{with_color_option}", :capture => true - end - - desc "execute_specs_in_browser", "Run all relevent specs in your default browser" - - def execute_specs_in_browser - return unless node_installed? - - `grunt buildDistribution` - invoke :count_specs - - say JasmineDev.spacer - - say "Running all appropriate specs via the default web browser...", :cyan - - open_specs_in_browser - end - - desc "execute_specs", "Run all of Jasmine's JavaScript specs" - - def execute_specs - invoke :execute_specs_in_node - invoke :execute_specs_in_browser - end - - no_tasks do - def open_specs_in_browser - require 'rbconfig' - - case Object.const_get(defined?(RbConfig) ? :RbConfig : :Config)::CONFIG['host_os'] - when /linux/ - run "xdg-open spec/runner.html" - else - run "open spec/runner.html" - end - end - end -end diff --git a/tasks/jasmine_dev/release.rb b/tasks/jasmine_dev/release.rb deleted file mode 100644 index f75ecc2d..00000000 --- a/tasks/jasmine_dev/release.rb +++ /dev/null @@ -1,13 +0,0 @@ -class JasmineDev < Thor - - desc 'release_prep', "Update version and build distributions" - def release_prep - say JasmineDev.spacer - - say "Building Release...", :cyan - - return unless pages_submodule_installed? - - invoke :build_github_pages - end -end \ No newline at end of file