jasmine-stories 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ .bundle
2
+ db/*.sqlite3
3
+ log/*.log
4
+ tmp/
5
+ .*.sw*
6
+ *.orig
7
+ .swp
8
+ public/system
9
+ *.*.BACKUP.*.lock
10
+ *.*.BASE.*.lock
11
+ *.*.REMOTE.*.lock
12
+ *.*.LOCAL.*.lock
13
+ .DS_Store
14
+ *.*.gz
15
+ Session.vim
16
+ err.txt
17
+ .sass-cache
18
+ public/stylesheets/*.css
19
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rails', '3.1.0'
4
+
5
+ # Bundle edge Rails instead:
6
+ # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
+
8
+ gemspec
9
+
10
+ platforms :ruby_18 do
11
+ gem "ruby-debug", ">= 0.10.3"
12
+ end
@@ -0,0 +1,110 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ jasminerice (0.0.8)
5
+ haml
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ actionmailer (3.1.0)
11
+ actionpack (= 3.1.0)
12
+ mail (~> 2.3.0)
13
+ actionpack (3.1.0)
14
+ activemodel (= 3.1.0)
15
+ activesupport (= 3.1.0)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ i18n (~> 0.6)
19
+ rack (~> 1.3.2)
20
+ rack-cache (~> 1.0.3)
21
+ rack-mount (~> 0.8.2)
22
+ rack-test (~> 0.6.1)
23
+ sprockets (~> 2.0.0)
24
+ activemodel (3.1.0)
25
+ activesupport (= 3.1.0)
26
+ bcrypt-ruby (~> 3.0.0)
27
+ builder (~> 3.0.0)
28
+ i18n (~> 0.6)
29
+ activerecord (3.1.0)
30
+ activemodel (= 3.1.0)
31
+ activesupport (= 3.1.0)
32
+ arel (~> 2.2.1)
33
+ tzinfo (~> 0.3.29)
34
+ activeresource (3.1.0)
35
+ activemodel (= 3.1.0)
36
+ activesupport (= 3.1.0)
37
+ activesupport (3.1.0)
38
+ multi_json (~> 1.0)
39
+ arel (2.2.1)
40
+ bcrypt-ruby (3.0.1)
41
+ bcrypt-ruby (3.0.1-java)
42
+ builder (3.0.0)
43
+ columnize (0.3.4)
44
+ erubis (2.7.0)
45
+ haml (3.1.3)
46
+ hike (1.2.1)
47
+ i18n (0.6.0)
48
+ json (1.6.1)
49
+ json (1.6.1-java)
50
+ linecache (0.46)
51
+ rbx-require-relative (> 0.0.4)
52
+ mail (2.3.0)
53
+ i18n (>= 0.4.0)
54
+ mime-types (~> 1.16)
55
+ treetop (~> 1.4.8)
56
+ mime-types (1.17.2)
57
+ multi_json (1.0.3)
58
+ polyglot (0.3.2)
59
+ rack (1.3.5)
60
+ rack-cache (1.0.3)
61
+ rack (>= 0.4)
62
+ rack-mount (0.8.3)
63
+ rack (>= 1.0.0)
64
+ rack-ssl (1.3.2)
65
+ rack
66
+ rack-test (0.6.1)
67
+ rack (>= 1.0)
68
+ rails (3.1.0)
69
+ actionmailer (= 3.1.0)
70
+ actionpack (= 3.1.0)
71
+ activerecord (= 3.1.0)
72
+ activeresource (= 3.1.0)
73
+ activesupport (= 3.1.0)
74
+ bundler (~> 1.0)
75
+ railties (= 3.1.0)
76
+ railties (3.1.0)
77
+ actionpack (= 3.1.0)
78
+ activesupport (= 3.1.0)
79
+ rack-ssl (~> 1.3.2)
80
+ rake (>= 0.8.7)
81
+ rdoc (~> 3.4)
82
+ thor (~> 0.14.6)
83
+ rake (0.9.2.2)
84
+ rbx-require-relative (0.0.5)
85
+ rdoc (3.11)
86
+ json (~> 1.4)
87
+ ruby-debug (0.10.4)
88
+ columnize (>= 0.1)
89
+ ruby-debug-base (~> 0.10.4.0)
90
+ ruby-debug-base (0.10.4)
91
+ linecache (>= 0.3)
92
+ sprockets (2.0.3)
93
+ hike (~> 1.2)
94
+ rack (~> 1.0)
95
+ tilt (~> 1.1, != 1.3.0)
96
+ thor (0.14.6)
97
+ tilt (1.3.3)
98
+ treetop (1.4.10)
99
+ polyglot
100
+ polyglot (>= 0.3.1)
101
+ tzinfo (0.3.30)
102
+
103
+ PLATFORMS
104
+ java
105
+ ruby
106
+
107
+ DEPENDENCIES
108
+ jasminerice!
109
+ rails (= 3.1.0)
110
+ ruby-debug (>= 0.10.3)
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
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,98 @@
1
+ Jasminerice
2
+ ===========
3
+
4
+ Utilizing [Jasmine](http://pivotal.github.com/jasmine/) and taking full advantage
5
+ of the Rails 3.1 asset pipeline. jasmine-stories removes any excuse YOU have for
6
+ not testing your out of control application.
7
+ This project rocks and uses the MIT-LICENSE.
8
+
9
+ Headless Testing
10
+ ----------------
11
+
12
+ See [guard-jasmine](https://github.com/netzpirat/guard-jasmine) for details.
13
+
14
+ Installation
15
+ ------------
16
+
17
+ This is a gem specifically for Rails 3.1. Just include it in
18
+ your `Gemfile`:
19
+
20
+ ```ruby
21
+ group :development, :test do
22
+ gem "jasmine-stories"
23
+ end
24
+ ```
25
+
26
+ The engine is automatically mounted into your application in the development
27
+ and test environments. If you'd like to change that behavior, you can
28
+ override the array `JasmineStories.environments` in an initializer.
29
+
30
+ Usage
31
+ -----
32
+
33
+ ### CoffeeScripts
34
+
35
+ Create a file `spec/javascripts/stories.js.coffee` with the following content:
36
+
37
+ #=require_tree ./stories
38
+
39
+ This pulls in all your specs from the `javascripts/stories` directory into Jasmine:
40
+
41
+ ```bash
42
+ spec/javascripts/stories/*_story.js.coffee
43
+ spec/javascripts/stories/*_story.js
44
+ spec/javascripts/stories/*_story.js.erb
45
+ ```
46
+
47
+ The Rails 3.1 asset pipeline using [Sprockets](https://github.com/sstephenson/sprockets)
48
+ and [Tilt](https://github.com/rtomayko/tilt) ensure conversion.
49
+
50
+ As well you can use the `#require` dependency mechanisms in your specs to
51
+ pull dependencies. Here's an example `spec/javascripts/foo.js.coffee`:
52
+
53
+ ```coffeescript
54
+ #= require foo
55
+ #= require bar
56
+
57
+ describe "Foo", ->
58
+ it "it is not bar", ->
59
+ v = new Foo()
60
+ expect(v.bar()).toEqual(false)
61
+
62
+ describe "Bar", ->
63
+ it "it is not foo", ->
64
+ v = new Bar()
65
+ expect(v.foo()).toEqual(false)
66
+ ```
67
+
68
+ ### Stylesheets
69
+
70
+ For including stylesheets in your specs, Jasminerice uses `spec/javascripts/spec.css`.
71
+ Use Sprockets directives to include the right css files:
72
+
73
+ ```css
74
+ /*
75
+ *= require application
76
+ */
77
+ ```
78
+
79
+ ### Start server
80
+
81
+ Now start your server
82
+
83
+ ```bash
84
+ rails s
85
+ ```
86
+
87
+ Goto
88
+
89
+ ```bash
90
+ http://localhost:3000/jasmine-stories
91
+ ```
92
+
93
+ and there are your acceptance tests.
94
+
95
+ Author
96
+ ------
97
+
98
+ * Dominik Guzei (http://wizzart.at | http://nerdkitchen.org)
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ begin
10
+ require 'rdoc/task'
11
+ rescue LoadError
12
+ require 'rdoc/rdoc'
13
+ require 'rake/rdoctask'
14
+ RDoc::Task = Rake::RDocTask
15
+ end
16
+
17
+ RDoc::Task.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'JasmineStories'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README.rdoc')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+
File without changes
@@ -0,0 +1,37 @@
1
+ #=require jquery
2
+ #=require jquery_ujs
3
+
4
+ #=require namespace
5
+ #=require jasmine
6
+ #=require jasmine-html
7
+ #=require jasmine-jquery
8
+ #=require jasmine-grammar
9
+ #=require jasmine-reporting
10
+
11
+ # load all jasmine-species features
12
+ Namespace.use('jasmine.grammar.FeatureStory.*');
13
+ Namespace.use('jasmine.grammar.GWT.*');
14
+ Namespace.use('jasmine.grammar.Meta.*');
15
+
16
+ execJasmine = ->
17
+ jasmineEnv.execute()
18
+ jasmineEnv = jasmine.getEnv()
19
+ jasmineEnv.updateInterval = 1000
20
+
21
+ window.jsApiReporter = new jasmine.JsApiReporter()
22
+ storyReporter = new jasmine.reporting.StyledHtmlReporter()
23
+
24
+ jasmineEnv.addReporter storyReporter
25
+ jasmineEnv.addReporter jsApiReporter
26
+
27
+ jasmineEnv.specFilter = (spec) ->
28
+ storyReporter.specFilter spec
29
+
30
+ jasmine.stories = {}
31
+ jasmine.stories.autoExecute = true
32
+
33
+ currentWindowOnload = window.onload
34
+ window.onload = ->
35
+ currentWindowOnload() if currentWindowOnload
36
+ if jasmine.stories.autoExecute
37
+ execJasmine()
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */
@@ -0,0 +1,4 @@
1
+ module JasmineStories
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ module JasmineStories
2
+ class SpecController < JasmineStories::ApplicationController
3
+
4
+ layout false
5
+
6
+ def index
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ %html
2
+ %head
3
+ %title Jasmine Spec Runner
4
+ = stylesheet_link_tag "jasmine"
5
+ = stylesheet_link_tag "jasmine-be-calm"
6
+ = stylesheet_link_tag "spec"
7
+ = javascript_include_tag "jasmine-stories", :debug => Rails.env.development?
8
+ = javascript_include_tag "stories", :debug => Rails.env.development?
9
+ = csrf_meta_tags
10
+ %body
@@ -0,0 +1 @@
1
+ Rails.application.config.assets.paths << File.join(Rails.root, "spec", "javascripts")
@@ -0,0 +1,7 @@
1
+ JasmineStories::Engine.routes.draw do
2
+ root :to => "spec#index"
3
+ end
4
+
5
+ Rails.application.routes.draw do
6
+ mount JasmineStories::Engine => "/jasmine-stories"
7
+ end
@@ -0,0 +1,12 @@
1
+ # Provide a simple gemspec so you can easily use your
2
+ # project in your rails apps through git.
3
+ Gem::Specification.new do |s|
4
+ s.name = "jasmine-stories"
5
+ s.summary = "Pain free coffeescript acceptance testing for Rails 3.1 using jasmine-species"
6
+ s.description = "Full support for the Rails 3.1 asset pipeline when acceptance testing your coffeescript or javascript using jasmine"
7
+ s.files = `git ls-files`.split "\n"
8
+ s.authors = ["Dominik Guzei"]
9
+ s.version = "0.0.1"
10
+ s.platform = Gem::Platform::RUBY
11
+ s.add_dependency( 'haml' )
12
+ end
@@ -0,0 +1,5 @@
1
+ require "jasmine-stories/engine"
2
+ require 'haml'
3
+
4
+ module JasmineStories
5
+ end
@@ -0,0 +1,5 @@
1
+ module JasmineStories
2
+ class Engine < Rails::Engine
3
+ isolate_namespace JasmineStories
4
+ end
5
+ end
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Jasmine Grammar - Additional Jasmine grammar to enable alternate BDD approaches.
3
+ *
4
+ * Copyright (C) 2010-2011, Rudy Lattae
5
+ * License: Simplified BSD
6
+ *
7
+ * Jasmine-Grammar contains some additions to the jasmine api that make it
8
+ * more suitable to alternate BDD approaches. The end-goal is streamline the
9
+ * grammatical aspect of specing out an application from different view-points.
10
+ *
11
+ * The new grammar should make it easier to create other types of specifications
12
+ * apart from "describe" and "it should". They are simply wrappers
13
+ * for "describe" and "it" so they follow the same rules for nesting.
14
+ */
15
+
16
+ // Top level namespace for the package
17
+ jasmine.grammar = (typeof jasmine.grammar === 'undefined') ? {} : jasmine.grammar;
18
+
19
+
20
+ /**
21
+ * Feature / Story => Scenario => ... style grammar
22
+ */
23
+ jasmine.grammar.FeatureStory = {
24
+
25
+ /**
26
+ * Defines a suite tagged as a "feature"
27
+ */
28
+ feature: function(description, specDefinitions) {
29
+ var suite = jasmine.grammar.getEnv().describe('Feature: ' + description, specDefinitions);
30
+ suite.tags = ['feature'];
31
+ return suite;
32
+ },
33
+
34
+ /**
35
+ * Defines a suite tagged as a "story"
36
+ */
37
+ story: function(description, specDefinitions) {
38
+ var suite = jasmine.grammar.getEnv().describe('Story: ' + description, specDefinitions);
39
+ suite.tags = ['story'];
40
+ return suite;
41
+ },
42
+
43
+ /**
44
+ * Defines a suite tagged as a "component"
45
+ */
46
+ component: function(description, specDefinitions) {
47
+ var suite = jasmine.grammar.getEnv().describe('Component: ' + description, specDefinitions);
48
+ suite.tags = ['component'];
49
+ return suite;
50
+ },
51
+
52
+ /**
53
+ * Defines a spec marked as a "scenario"
54
+ */
55
+ scenario: function(desc, func) {
56
+ return jasmine.grammar.getEnv().it('Scenario: ' + desc, func);
57
+ }
58
+ };
59
+
60
+
61
+ /**
62
+ * Given => When => Then ... style grammar
63
+ */
64
+ jasmine.grammar.GWT = {
65
+
66
+ /**
67
+ * Defines a "given" step as a runs block that marks the beginning of a GWT chain
68
+ */
69
+ given: function(desc, func) {
70
+ return this._addStepToCurrentSpec('Given ' + desc, func);
71
+ },
72
+
73
+ /**
74
+ * Defines a "when" step as a runs block that marks the interesting event in a GWT chain
75
+ */
76
+ when: function(desc, func) {
77
+ return this._addStepToCurrentSpec('When ' + desc, func);
78
+ },
79
+
80
+ /**
81
+ * Defines a "then" step as a runs block that marks the conclusion of a Given, when, then construct
82
+ */
83
+ then: function(desc, func) {
84
+ return this._addStepToCurrentSpec('Then ' + desc, func);
85
+ },
86
+
87
+ /**
88
+ * Defines an "and" step as a runs block that is a continuation from a "then" statement
89
+ */
90
+ and: function(desc, func) {
91
+ return this._addStepToCurrentSpec('And ' + desc, func);
92
+ },
93
+
94
+ /**
95
+ * Defines a "but" step as a runs block that is a continuation from a "then" statement
96
+ */
97
+ but: function(desc, func) {
98
+ return this._addStepToCurrentSpec('But ' + desc, func);
99
+ },
100
+
101
+ /**
102
+ * Adds the given function as a step (runs block) in the current spec. Also adds the description to the details list of the spec
103
+ */
104
+ _addStepToCurrentSpec: function(desc, func) {
105
+ var spec = jasmine.grammar.getEnv().currentSpec;
106
+ spec.details = spec.details || [];
107
+ spec.details.push(desc);
108
+ spec.runs(func);
109
+ return spec;
110
+ }
111
+ };
112
+
113
+
114
+ /**
115
+ * Add proper case aliases to GWT for Coffeescript use
116
+ */
117
+
118
+ (function(GWT) {
119
+ GWT.Given = GWT.given;
120
+ GWT.When = GWT.when;
121
+ GWT.Then = GWT.then;
122
+ GWT.And = GWT.and;
123
+ GWT.But = GWT.but;
124
+ }) (jasmine.grammar.GWT);
125
+
126
+
127
+
128
+
129
+ /**
130
+ * Concern => Context => Specification style grammar
131
+ */
132
+ jasmine.grammar.ContextSpecification = {
133
+
134
+ /**
135
+ * Defines a suite tagged as a "concern"
136
+ */
137
+ concern: function(description, specDefinitions) {
138
+ var suite = jasmine.grammar.getEnv().describe(description, specDefinitions);
139
+ suite.tags = ['concern'];
140
+ return suite;
141
+ },
142
+
143
+ /**
144
+ * Defines a suite tagged as a "context"
145
+ */
146
+ context: function(description, specDefinitions) {
147
+ var suite = jasmine.grammar.getEnv().describe(description, specDefinitions);
148
+ suite.tags = ['context'];
149
+ return suite;
150
+ },
151
+
152
+ /**
153
+ * Defines a simple spec -- similar to it
154
+ */
155
+ spec: function(desc, func) {
156
+ return jasmine.grammar.getEnv().it(desc, func);
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Executable docs (Topic => Example) style grammar
162
+ */
163
+ jasmine.grammar.XDoc = {
164
+
165
+ /**
166
+ * Defines a suite tagged as a "topic"
167
+ */
168
+ topic: function(description, specDefinitions) {
169
+ var suite = jasmine.grammar.getEnv().describe(description, specDefinitions);
170
+ suite.tags = ['topic'];
171
+ return suite;
172
+ },
173
+
174
+ /**
175
+ * Defines a suite tagged as an "example".
176
+ *
177
+ * An axample suite actually stores the inner suites as a string in the "defs" attribute
178
+ */
179
+ example: function(description, specDefinitions) {
180
+ var suite = jasmine.grammar.getEnv().describe(description, specDefinitions);
181
+ suite.tags = ['example'];
182
+ suite.expose = true;
183
+ suite.defs = specDefinitions.toString()
184
+ .replace(/^function.*\(.*\).*{/, '')
185
+ .replace(/}$/, '').trim(); // stored for later output
186
+ return suite;
187
+ },
188
+
189
+ /**
190
+ * Defines a simple spec without any associated function
191
+ */
192
+ pass: function(desc, func) {
193
+ return jasmine.grammar.getEnv().it(desc);
194
+ }
195
+ };
196
+
197
+
198
+ /**
199
+ * Some more useful constructs that attach metadata to suites and specs
200
+ */
201
+ jasmine.grammar.Meta = {
202
+
203
+ /**
204
+ * Adds summary content to the current suite.
205
+ *
206
+ * @param {String} content(s) variable number of detail content
207
+ * @see jasmine.grammar.SuiteDetails
208
+ */
209
+ summary: function() {
210
+ var suite = jasmine.grammar.getEnv().currentSuite;
211
+ suite.summary = suite.summary || [];
212
+
213
+ if (arguments.length > 0) {
214
+ for(i=0; i<arguments.length; i++) {
215
+ suite.summary.push(arguments[i]);
216
+ }
217
+ }
218
+ },
219
+
220
+ /**
221
+ * Adds detail entries in the current spec.
222
+ *
223
+ * @param {String} content(s) variable number of detail content
224
+ * @see jasmine.grammar.SuiteDetails
225
+ */
226
+ details: function() {
227
+ var spec = jasmine.grammar.getEnv().currentSpec;
228
+ spec.details = spec.details || [];
229
+
230
+ if (arguments.length > 0) {
231
+ for(i=0; i<arguments.length; i++) {
232
+ spec.details.push(arguments[i]);
233
+ }
234
+ }
235
+ }
236
+ };
237
+
238
+
239
+ // Utilities
240
+ // =========
241
+
242
+ /**
243
+ * Getter for the Jasmine environment. Makes it possible to inject a different environment when necessary.
244
+ */
245
+ jasmine.grammar.getEnv = function() {
246
+ return jasmine.grammar._currentEnv = jasmine.grammar._currentEnv || jasmine.getEnv();
247
+ };