oojspec 0.0.6 → 0.0.7

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.
data/README.md CHANGED
@@ -23,6 +23,8 @@ I'd rather prefer to write:
23
23
  assert(seats.length)
24
24
  ```
25
25
 
26
+ For a more in-depth introduction, please check-out [this article](http://rosenfeld.herokuapp.com/en/articles/programming/2012-07-20-client-side-code-testing-with-oojspec).
27
+
26
28
  # Examples
27
29
 
28
30
  [Here is how it looks like](http://oojspec.herokuapp.com/)
@@ -154,7 +156,7 @@ By default this gem will expose `oojspec.describe` to the `window` object so tha
154
156
  directly from the top-level, but you can disable this exposition if you prefer:
155
157
 
156
158
  ```ruby
157
- config.sandbox_assets.options[:skipt_oojspec_expose] = true
159
+ config.sandbox_assets.options[:skip_oojspec_expose] = true
158
160
  ```
159
161
 
160
162
  # What about non-Rails applications?
@@ -1,8 +1,8 @@
1
1
  # =require buster/all
2
- # =require_tree ./oojspec
3
2
 
4
3
  window.oojspec = new class OojspecRunner
5
4
  constructor: ->
5
+ @timeout = 1000 # 1s - default timeout
6
6
  @runner = buster.create buster.eventEmitter
7
7
  @descriptions = []
8
8
  @assertions = buster.assertions
@@ -56,26 +56,22 @@ class Description
56
56
  run: (@runner, @assertions, @binding, @bare, @onFinish, @beforeBlocks = [], @afterBlocks = [])->
57
57
  @runner.emit 'context:start', name: @description
58
58
  @dsl = new DescribeDsl
59
- if @block.runSpecs or @block.prototype?.runSpecs
60
- @runWithContext()
61
- else
62
- @doRun()
59
+ @doRun() unless (@block.runSpecs or @block.prototype?.runSpecs) and @throwOnInvalidBinding()
63
60
 
64
61
  doRun: -> @runAround @beforeBlocks, @afterBlocks, @onDescriptionFinished, @processDescriptionBlock
65
62
 
66
- runWithContext: ->
63
+ throwOnInvalidBinding: ->
67
64
  try
68
65
  @binding = if @block.prototype then new @block else @block
69
66
  if @binding and not (@bare = @block.bare)
70
- for reserved in RESERVED
71
- if @binding[reserved]
72
- throw new Error("'#{reserved}' method is reserved for oojspec usage only")
73
- @binding[reserved] = @dsl[reserved]
74
- @doRun()
67
+ for reserved in RESERVED when @binding[reserved]
68
+ throw new Error("'#{reserved}' method is reserved for oojspec usage only")
75
69
  catch e
76
70
  e.name = "syntax error"
77
71
  @runner.emit 'test:error', name: @description, error: e
78
72
  @onDescriptionFinished(e)
73
+ return true
74
+ false
79
75
 
80
76
  onDescriptionFinished: (error)=>
81
77
  if error and not error.handled
@@ -88,14 +84,21 @@ class Description
88
84
  new AroundBlock(befores, afters, block).run @runner, @assertions, @binding, @bare, onFinish
89
85
 
90
86
  processDescriptionBlock: (onFinish)=>
87
+ @binding or= {}
88
+ @injectDsl() unless @bare
91
89
  if @block.runSpecs or @block.prototype?.runSpecs
92
90
  @binding.runSpecs @dsl
93
91
  else
94
- binding = @binding or @dsl
95
- @block.call binding, @dsl
92
+ @block.call @binding, @dsl
93
+ @removeDsl() unless @bare
94
+ @bare or= @binding.bare
96
95
  @runAround @dsl._beforeAllBlocks_, @dsl._afterAllBlocks_, onFinish, (@onExamplesFinished)=>
97
96
  @runNextStep()
98
97
 
98
+ injectDsl: -> @binding[p] = v for p, v of @dsl; return
99
+
100
+ removeDsl: -> delete @binding[p] for p in RESERVED_FOR_DESCRIPTION_DSL; return
101
+
99
102
  runNextStep: =>
100
103
  (@onExamplesFinished(); return) unless @dsl._examples_.length
101
104
  nextStep = @dsl._examples_.shift()
@@ -254,7 +257,7 @@ class Example
254
257
  else
255
258
  @waitsFor step...
256
259
 
257
- waitsFor: (@condition, timeout=1000, @description)->
260
+ waitsFor: (@condition, timeout = @binding?.timeout or oojspec.timeout, @description)->
258
261
  @deadline = timeout + new Date().getTime()
259
262
  @keepTryingCondition()
260
263
 
@@ -1,3 +1,3 @@
1
1
  module Oojspec
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -18,7 +18,7 @@
18
18
  create: function (opt) {
19
19
  var reporter = buster.create(this);
20
20
  opt = opt || {};
21
- reporter.contexts = [];
21
+ reporter._listStack = [];
22
22
  reporter.doc = getDoc(opt);
23
23
  var cssPath = opt.cssPath;
24
24
  if (!cssPath && opt.detectCssPath !== false) {
@@ -60,7 +60,8 @@
60
60
  "context:start": "contextStart", "context:end": "contextEnd",
61
61
  "test:success": "testSuccess", "test:failure": "testFailure",
62
62
  "test:error": "testError", "test:timeout": "testTimeout",
63
- "test:deferred": "testDeferred", "suite:end": "addStats"
63
+ "test:deferred": "testDeferred", "suite:start": "startTimer",
64
+ "suite:end": "addStats"
64
65
  });
65
66
 
66
67
  if (runner.console) {
@@ -71,17 +72,20 @@
71
72
  },
72
73
 
73
74
  contextStart: function (context) {
74
- if (this.contexts.length == 0) {
75
- this.root.appendChild(el(this.doc, "h2", { text: context.name }));
75
+ var container = this.root;
76
+ if (this._list) {
77
+ container = el(this.doc, "li");
78
+ this._list.appendChild(container);
76
79
  }
77
-
78
- this.startedAt = new Date();
79
- this.contexts.push(context.name);
80
+ container.appendChild(el(this.doc, "h2", { text: context.name }));
81
+ this._list = el(this.doc, "ul");
82
+ container.appendChild(this._list);
83
+ this._listStack.unshift(this._list);
80
84
  },
81
85
 
82
86
  contextEnd: function (context) {
83
- this.contexts.pop();
84
- this._list = null;
87
+ this._listStack.shift()
88
+ this._list = this._listStack[0];
85
89
  },
86
90
 
87
91
  testSuccess: function (test) {
@@ -145,6 +149,10 @@
145
149
  stats.tests > 0 && stats.assertions > 0;
146
150
  },
147
151
 
152
+ startTimer: function () {
153
+ this.startedAt = new Date();
154
+ },
155
+
148
156
  addStats: function (stats) {
149
157
  var diff = (new Date() - this.startedAt) / 1000;
150
158
 
@@ -182,6 +190,7 @@
182
190
  list: function () {
183
191
  if (!this._list) {
184
192
  this._list = el(this.doc, "ul", { className: "test-results" });
193
+ this._listStack.unshift(this._list);
185
194
  this.root.appendChild(this._list);
186
195
  }
187
196
 
@@ -270,11 +279,10 @@
270
279
  function addListItem(tagName, test, className) {
271
280
  var prefix = tagName ? "<" + tagName + ">" : "";
272
281
  var suffix = tagName ? "</" + tagName + ">" : "";
273
- var name = this.contexts.slice(1).join(" ") + " " + test.name;
274
282
 
275
283
  var item = el(this.doc, "li", {
276
284
  className: className,
277
- text: prefix + name.replace(/^\s+|\s+$/, "") + suffix
285
+ text: prefix + test.name + suffix
278
286
  });
279
287
 
280
288
  this.list().appendChild(item);
@@ -105,11 +105,11 @@ body.buster-test {
105
105
  .buster-test h6,
106
106
  .buster-test p {
107
107
  font-weight: normal;
108
- margin: 0 0 1em;
108
+ margin: 0.2em 0;
109
109
  }
110
110
 
111
111
  .buster-test ul {
112
- margin: 0 0 1em 15px;
112
+ margin: 0.2em 0 0.2em 15px;
113
113
  }
114
114
 
115
115
  /* Masthead */
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oojspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-18 00:00:00.000000000 Z
12
+ date: 2012-07-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: coffee-rails
@@ -52,7 +52,6 @@ extensions: []
52
52
  extra_rdoc_files: []
53
53
  files:
54
54
  - app/views/oojspec/runner.html.erb
55
- - lib/assets/javascripts/oojspec/reporter/html-multi-level.js.coffee
56
55
  - lib/assets/javascripts/oojspec.js.coffee
57
56
  - lib/assets/stylesheets/oojspec.css.erb
58
57
  - lib/tasks/oojspec_tasks.rake
@@ -86,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
85
  version: '0'
87
86
  segments:
88
87
  - 0
89
- hash: 1002749213417623209
88
+ hash: 3773166015855678549
90
89
  required_rubygems_version: !ruby/object:Gem::Requirement
91
90
  none: false
92
91
  requirements:
@@ -95,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
94
  version: '0'
96
95
  segments:
97
96
  - 0
98
- hash: 1002749213417623209
97
+ hash: 3773166015855678549
99
98
  requirements: []
100
99
  rubyforge_project:
101
100
  rubygems_version: 1.8.24
@@ -1,44 +0,0 @@
1
- h = buster.reporters.html
2
- h._lists = []
3
-
4
- # original private function defined in Buster.js. Re-writing it here in CS
5
- el = (doc, tagName, properties) ->
6
- e = doc.createElement(tagName)
7
- for prop, value of properties
8
- e.setAttribute prop, value if prop is "http-equiv"
9
- prop = "innerHTML" if prop == "text"
10
- e[prop] = value
11
- e
12
-
13
- oldCreate = h.create # patch create
14
- h.create = ->
15
- reporter = oldCreate.apply this, arguments
16
- reporter._lists = []
17
- reporter
18
-
19
- h.contextStart = (context)->
20
- container = @root
21
- @_list.appendChild container = el(@doc, "li") if @_list
22
- container.appendChild el(@doc, "h2", text: context.name)
23
- container.appendChild @_list = el(@doc, "ul")
24
- @_lists.unshift @_list
25
-
26
- # fix Buster.js time reporting
27
- oldListen = h.listen
28
- h.listen = (runner)->
29
- result = oldListen.apply this, arguments
30
- runner.bind this, 'suite:start': 'suiteStart'
31
- result
32
-
33
- # doesn't currently exist in original reporter
34
- h.suiteStart = -> @startedAt = new Date()
35
-
36
- h.list = ->
37
- unless @_list = @_lists[0]
38
- @_lists.unshift @_list = el(this.doc, "ul", className: "test-results")
39
- @root.appendChild(@_list)
40
- @_list
41
-
42
- h.contextEnd = (context)->
43
- @_lists.shift()
44
- @_list = @_lists[0]