architect 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9bec81cd66ce034cb54efbab4035fd141a0ee8d5
4
- data.tar.gz: a002476eafc68ddb9ebf222bbd318ef25e54cafb
3
+ metadata.gz: 5cc29094107fa1e8e42c14a8ada858d19648e954
4
+ data.tar.gz: 15b940dc6ced00de718d161289b17b53a563515d
5
5
  SHA512:
6
- metadata.gz: 096b8f8d8d97127b6e25e9a50fcee3b6fdd370b10f4d82ba502bba5d68e031c5dd2b388bf1b2fcccea2d4666ab09c58865488554c4f7b4ff8dfd13d04c97446a
7
- data.tar.gz: fe231e602cb01f153b0ff66d20b8eba440cecd4682bc48750606607390cf9dec7a80281e72fbb3f3a51dfa782dd67a52c1e5f20f443b3382c0547b3861d83bb2
6
+ metadata.gz: bd3e5db5706aabcccbc7b6b179f328fe72331292c6baebcf4ce6b63d244342c82464853848e8d6bd64110b2801c88b0a9f5ae36f0f32de9f1d94964f2ba0faff
7
+ data.tar.gz: 64693c0b448646829b70e10a8e9c9d07d1e972b65bd6f8a926e44ad04061f24471cc2686c3ce6a18ca7fcdd045394800753084ff324a5ced3d0ae54fab6f93b7
@@ -0,0 +1 @@
1
+ Gemfile.lock
@@ -1,3 +1,6 @@
1
+ ## [v0.1.0](https://github.com/EtienneLem/architect/tree/v0.1.0)
2
+ - Add X-Requested-With header to xhr request
3
+
1
4
  ## [v0.0.7](https://github.com/EtienneLem/architect/tree/v0.0.7)
2
5
  - Serve your workers from any path
3
6
  - Make `workFrom` fallback optional
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md CHANGED
@@ -9,6 +9,10 @@
9
9
  He will manage and polyfill them workers so you don’t have to.
10
10
  </p>
11
11
 
12
+ <p align="center">
13
+ <a href="http://badge.fury.io/rb/architect"><img src="https://badge.fury.io/rb/architect@2x.png" alt="Gem Version" height="18"></a>
14
+ </p>
15
+
12
16
  ## Short-lived workers
13
17
  These will be automatically terminated as soon as the work is done. It will spawn a new worker every time.
14
18
 
@@ -154,7 +158,7 @@ Architect.workFrom('workers/foozle.js', 'foo', foozleFallback, function(data) {
154
158
  3. Restart your server and you'll have access to your very own Architect!
155
159
 
156
160
  ### Other
157
- You’ll need to serve the [worker files](/static/workers) at `/architect` (i.e. `http://foo.com/architect/proxy_worker.min.js`) and manually include [architect.min.js](/static/architect.min.js) to your HTML pages.
161
+ You’ll need to serve the [worker files](https://github.com/EtienneLem/architect/tree/master/static/workers) at `/architect` (i.e. `http://foo.com/architect/proxy_worker.min.js`) and manually include [architect.min.js](https://github.com/EtienneLem/architect/tree/master/static/architect.min.js) to your HTML pages. Architect is also hosted on [cdnjs.com](http://cdnjs.com).
158
162
 
159
163
  #### Custom path
160
164
  You can also specify any path you want to serve the workers from.
data/Rakefile CHANGED
@@ -1,10 +1,16 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__), *%w[lib])
2
2
  require 'tasks/task_helpers'
3
3
 
4
+ # Rubygems
5
+ require 'bundler'
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ # Dependencies
4
9
  require 'uglifier'
5
10
  require 'architect'
6
11
  require 'sprockets'
7
12
 
13
+ # Tasks
8
14
  desc 'Merge, compiles and minify CoffeeScript files'
9
15
  task :compile do
10
16
  @environment = Sprockets::Environment.new
@@ -27,6 +33,21 @@ task :default => :compile
27
33
  def compile(file)
28
34
  minjs = @environment[file].to_s
29
35
  out = "static/#{file.sub('.js', '.min.js')}"
30
- File.open(out, 'w') { |f| f.write(minjs) }
36
+
37
+ File.open(out, 'w') { |f| f.write(copyright + minjs + "\n") }
31
38
  success "Compiled #{out}"
32
39
  end
40
+
41
+ def copyright
42
+ @copyright ||= <<-EOS
43
+ /*
44
+ * Architect v#{Architect::VERSION}
45
+ * http://architectjs.org
46
+ *
47
+ * Copyright 2013, Etienne Lemay http://heliom.ca
48
+ * Released under the MIT license
49
+ *
50
+ * Date: #{Time.now}
51
+ */
52
+ EOS
53
+ end
@@ -3,6 +3,7 @@ class @Architect.AjaxWorker extends @Architect.Worker
3
3
  postMessage: (url) ->
4
4
  xhr = new XMLHttpRequest
5
5
  xhr.open('GET', url)
6
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
6
7
 
7
8
  xhr.onreadystatechange = (e) =>
8
9
  return unless xhr.readyState is 4 && xhr.status is 200
@@ -4,6 +4,8 @@ handleRequest = (data) ->
4
4
  addEventListener 'message', (e) ->
5
5
  xhr = new XMLHttpRequest
6
6
  xhr.open('GET', e.data)
7
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
8
+
7
9
  xhr.onreadystatechange = (e) ->
8
10
  return unless xhr.readyState is 4 && xhr.status is 200
9
11
  handleRequest(xhr.responseText)
@@ -0,0 +1,21 @@
1
+ require './lib/architect/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'architect'
5
+ s.version = Architect::VERSION
6
+ s.authors = ['Etienne Lemay']
7
+ s.email = ['etienne@heliom.ca']
8
+ s.homepage = 'http://architectjs.org'
9
+ s.summary = 'Your web workers’ supervisor'
10
+ s.description = 'Architect is a JavaScript library built on top of Web Workers that will handle and polyfill HTML Web Workers.'
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split($/)
14
+ s.test_files = s.files.grep(%r{^(test)/})
15
+
16
+ s.add_dependency 'coffee-rails'
17
+
18
+ s.add_development_dependency 'rake'
19
+ s.add_development_dependency 'uglifier'
20
+ s.add_development_dependency 'sprockets'
21
+ end
@@ -1,3 +1,3 @@
1
1
  module Architect
2
- VERSION = '0.0.7'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -10,7 +10,7 @@ end
10
10
  35 => 'magenta',
11
11
  36 => 'cyan',
12
12
  }.each do |code, color|
13
- define_method(color) { |text| colorize(text, code) }
13
+ Kernel.send(:define_method, color) { |text| colorize(text, code) }
14
14
  end
15
15
 
16
16
  def error(text); puts red('ERROR: ') + text; end
@@ -1 +1,10 @@
1
- !function(){this.Architect={},this.Architect.VERSION="0.0.7"}.call(this),function(){this.Architect.Worker=function(){function t(){this.callbacks={},this.callbacksQueue={}}return t.prototype.addEventListener=function(t,r){var e;return this.callbacks[t]=r,(e=this.callbacksQueue[t])?(delete this.callbacksQueue[t],this.dispatch(t,e)):void 0},t.prototype.dispatch=function(t,r){return this.callbacks[t]?this.callbacks[t]({data:r}):this.callbacksQueue[t]=r},t.prototype.handleRequest=function(t){return this.dispatch("message",t)},t.prototype.terminate=function(){},t}()}.call(this),function(){var t,r={}.hasOwnProperty,e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};this.Architect.AjaxWorker=function(r){function n(){return t=n.__super__.constructor.apply(this,arguments)}return e(n,r),n.prototype.postMessage=function(t){var r,e=this;return r=new XMLHttpRequest,r.open("GET",t),r.onreadystatechange=function(){return 4===r.readyState&&200===r.status?e.handleRequest(r.responseText):void 0},r.send()},n}(this.Architect.Worker)}.call(this),function(){var t={}.hasOwnProperty,r=function(r,e){function n(){this.constructor=r}for(var o in e)t.call(e,o)&&(r[o]=e[o]);return n.prototype=e.prototype,r.prototype=new n,r.__super__=e.prototype,r};this.Architect.JSONPWorker=function(t){function e(){e.__super__.constructor.call(this),window.jsonpID||(window.jsonpID=0)}return r(e,t),e.prototype.postMessage=function(t){var r,e,n=this;return e=document.createElement("script"),r="architect_jsonp"+ ++window.jsonpID,window[r]=function(t){return delete window[r],document.head.removeChild(e),n.handleRequest(t)},e.src=this.appendQuery(t,"callback="+r),document.head.appendChild(e)},e.prototype.appendQuery=function(t,r){return(t+"&"+r).replace(/[&?]{1,2}/,"?")},e}(this.Architect.Worker)}.call(this),function(){var t,r={}.hasOwnProperty,e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};this.Architect.ProxyWorker=function(r){function n(){return t=n.__super__.constructor.apply(this,arguments)}return e(n,r),n.prototype.postMessage=function(t){return this.handleRequest(t)},n}(this.Architect.Worker)}.call(this),function(){var t,r,e,n=this;this.Architect.SUPPORT_WORKER=!!window.Worker,this.Architect.WORKERS={proxy:{polyfill:this.Architect.ProxyWorker,workerPath:"architect/proxy_worker.min.js"},ajax:{polyfill:this.Architect.AjaxWorker,workerPath:"architect/ajax_worker.min.js"},jsonp:{polyfill:this.Architect.JSONPWorker,workerPath:"architect/jsonp_worker.min.js"}},t=function(t){return this.Architect.workersPath?""+this.Architect.workersPath+"/"+t+"_worker.min.js":this.Architect.WORKERS[t].workerPath},e=function(r){return this.Architect.SUPPORT_WORKER?new Worker(t(r)):new this.Architect.WORKERS[r].polyfill},this.Architect.setupWorkersPath=function(t){return n.Architect.workersPath=t.replace(/\/$/,"")},this.Architect.work=function(t,r,n){var o;return o=e(r),o.postMessage(t),o.addEventListener("message",function(t){return o.terminate(),n(t.data)})},this.Architect.proxy=function(t,r){return n.Architect.work(t,"proxy",r)},this.Architect.ajax=function(t,r){return n.Architect.work(t,"ajax",r)},this.Architect.jsonp=function(t,r){return n.Architect.work(t,"jsonp",r)},r={},this.Architect.workOn=function(t,n,o,c){var i,s,a=this;return this.workOnCallback=c,i=!!r[t],s=r[t]||(r[t]=e(o)),s.postMessage(n),i?void 0:s.addEventListener("message",function(t){return a.workOnCallback(t.data)})},this.Architect.endJob=function(t){var e;if(e=r[t])return e.terminate(),delete r[t]},this.Architect.proxyOn=function(t,r,e){return n.Architect.workOn(t,r,"proxy",e)},this.Architect.ajaxOn=function(t,r,e){return n.Architect.workOn(t,r,"ajax",e)},this.Architect.jsonpOn=function(t,r,e){return n.Architect.workOn(t,r,"jsonp",e)},this.Architect.workFrom=function(t,r,e,o){var c;return null==e&&(e=null),void 0===o&&(o=e,e=null),n.Architect.SUPPORT_WORKER?(c=new Worker(t),c.postMessage(r),c.addEventListener("message",function(t){return c.terminate(),o(t.data)})):e?o(e(r)):console.warn("No fallback provided for "+t)}}.call(this);
1
+ /*
2
+ * Architect v0.1.0
3
+ * http://architectjs.org
4
+ *
5
+ * Copyright 2013, Etienne Lemay http://heliom.ca
6
+ * Released under the MIT license
7
+ *
8
+ * Date: 2013-12-09 22:51:38 -0500
9
+ */
10
+ (function(){this.Architect={},this.Architect.VERSION="0.1.0"}).call(this),function(){this.Architect.Worker=function(){function t(){this.callbacks={},this.callbacksQueue={}}return t.prototype.addEventListener=function(t,r){var e;return this.callbacks[t]=r,(e=this.callbacksQueue[t])?(delete this.callbacksQueue[t],this.dispatch(t,e)):void 0},t.prototype.dispatch=function(t,r){return this.callbacks[t]?this.callbacks[t]({data:r}):this.callbacksQueue[t]=r},t.prototype.handleRequest=function(t){return this.dispatch("message",t)},t.prototype.terminate=function(){},t}()}.call(this),function(){var t,r={}.hasOwnProperty,e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};this.Architect.AjaxWorker=function(r){function n(){return t=n.__super__.constructor.apply(this,arguments)}return e(n,r),n.prototype.postMessage=function(t){var r,e=this;return r=new XMLHttpRequest,r.open("GET",t),r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.onreadystatechange=function(){return 4===r.readyState&&200===r.status?e.handleRequest(r.responseText):void 0},r.send()},n}(this.Architect.Worker)}.call(this),function(){var t={}.hasOwnProperty,r=function(r,e){function n(){this.constructor=r}for(var o in e)t.call(e,o)&&(r[o]=e[o]);return n.prototype=e.prototype,r.prototype=new n,r.__super__=e.prototype,r};this.Architect.JSONPWorker=function(t){function e(){e.__super__.constructor.call(this),window.jsonpID||(window.jsonpID=0)}return r(e,t),e.prototype.postMessage=function(t){var r,e,n=this;return e=document.createElement("script"),r="architect_jsonp"+ ++window.jsonpID,window[r]=function(t){return delete window[r],document.head.removeChild(e),n.handleRequest(t)},e.src=this.appendQuery(t,"callback="+r),document.head.appendChild(e)},e.prototype.appendQuery=function(t,r){return(t+"&"+r).replace(/[&?]{1,2}/,"?")},e}(this.Architect.Worker)}.call(this),function(){var t,r={}.hasOwnProperty,e=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t};this.Architect.ProxyWorker=function(r){function n(){return t=n.__super__.constructor.apply(this,arguments)}return e(n,r),n.prototype.postMessage=function(t){return this.handleRequest(t)},n}(this.Architect.Worker)}.call(this),function(){var t,r,e,n=this;this.Architect.SUPPORT_WORKER=!!window.Worker,this.Architect.WORKERS={proxy:{polyfill:this.Architect.ProxyWorker,workerPath:"architect/proxy_worker.min.js"},ajax:{polyfill:this.Architect.AjaxWorker,workerPath:"architect/ajax_worker.min.js"},jsonp:{polyfill:this.Architect.JSONPWorker,workerPath:"architect/jsonp_worker.min.js"}},t=function(t){return this.Architect.workersPath?""+this.Architect.workersPath+"/"+t+"_worker.min.js":this.Architect.WORKERS[t].workerPath},e=function(r){return this.Architect.SUPPORT_WORKER?new Worker(t(r)):new this.Architect.WORKERS[r].polyfill},this.Architect.setupWorkersPath=function(t){return n.Architect.workersPath=t.replace(/\/$/,"")},this.Architect.work=function(t,r,n){var o;return o=e(r),o.postMessage(t),o.addEventListener("message",function(t){return o.terminate(),n(t.data)})},this.Architect.proxy=function(t,r){return n.Architect.work(t,"proxy",r)},this.Architect.ajax=function(t,r){return n.Architect.work(t,"ajax",r)},this.Architect.jsonp=function(t,r){return n.Architect.work(t,"jsonp",r)},r={},this.Architect.workOn=function(t,n,o,c){var i,s,a=this;return this.workOnCallback=c,i=!!r[t],s=r[t]||(r[t]=e(o)),s.postMessage(n),i?void 0:s.addEventListener("message",function(t){return a.workOnCallback(t.data)})},this.Architect.endJob=function(t){var e;if(e=r[t])return e.terminate(),delete r[t]},this.Architect.proxyOn=function(t,r,e){return n.Architect.workOn(t,r,"proxy",e)},this.Architect.ajaxOn=function(t,r,e){return n.Architect.workOn(t,r,"ajax",e)},this.Architect.jsonpOn=function(t,r,e){return n.Architect.workOn(t,r,"jsonp",e)},this.Architect.workFrom=function(t,r,e,o){var c;return null==e&&(e=null),void 0===o&&(o=e,e=null),n.Architect.SUPPORT_WORKER?(c=new Worker(t),c.postMessage(r),c.addEventListener("message",function(t){return c.terminate(),o(t.data)})):e?o(e(r)):console.warn("No fallback provided for "+t)}}.call(this);
@@ -1 +1,10 @@
1
- !function(){var e;e=function(e){return postMessage(e)},addEventListener("message",function(t){var n;return n=new XMLHttpRequest,n.open("GET",t.data),n.onreadystatechange=function(){return 4===n.readyState&&200===n.status?e(n.responseText):void 0},n.send()})}.call(this);
1
+ /*
2
+ * Architect v0.1.0
3
+ * http://architectjs.org
4
+ *
5
+ * Copyright 2013, Etienne Lemay http://heliom.ca
6
+ * Released under the MIT license
7
+ *
8
+ * Date: 2013-12-09 22:51:38 -0500
9
+ */
10
+ (function(){var e;e=function(e){return postMessage(e)},addEventListener("message",function(t){var n;return n=new XMLHttpRequest,n.open("GET",t.data),n.setRequestHeader("X-Requested-With","XMLHttpRequest"),n.onreadystatechange=function(){return 4===n.readyState&&200===n.status?e(n.responseText):void 0},n.send()})}).call(this);
@@ -1 +1,10 @@
1
- !function(){var e;self.handleRequest=function(e){return postMessage(e)},e=function(e,t){return(e+"&"+t).replace(/[&?]{1,2}/,"?")},addEventListener("message",function(t){var n;return n=e(t.data,"callback=handleRequest"),importScripts(n)})}.call(this);
1
+ /*
2
+ * Architect v0.1.0
3
+ * http://architectjs.org
4
+ *
5
+ * Copyright 2013, Etienne Lemay http://heliom.ca
6
+ * Released under the MIT license
7
+ *
8
+ * Date: 2013-12-09 22:51:38 -0500
9
+ */
10
+ (function(){var e;self.handleRequest=function(e){return postMessage(e)},e=function(e,t){return(e+"&"+t).replace(/[&?]{1,2}/,"?")},addEventListener("message",function(t){var n;return n=e(t.data,"callback=handleRequest"),importScripts(n)})}).call(this);
@@ -1 +1,10 @@
1
- !function(){addEventListener("message",function(e){return postMessage(e.data)})}.call(this);
1
+ /*
2
+ * Architect v0.1.0
3
+ * http://architectjs.org
4
+ *
5
+ * Copyright 2013, Etienne Lemay http://heliom.ca
6
+ * Released under the MIT license
7
+ *
8
+ * Date: 2013-12-09 22:51:38 -0500
9
+ */
10
+ (function(){addEventListener("message",function(e){return postMessage(e.data)})}).call(this);
@@ -0,0 +1,4 @@
1
+ addEventListener('message', function(e) {
2
+ data = e.data + 'zle'
3
+ postMessage(data.toUpperCase())
4
+ })
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>QUnit Example</title>
6
+ <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.12.0.css">
7
+ </head>
8
+ <body>
9
+ <div id="qunit"></div>
10
+ <div id="qunit-fixture"></div>
11
+
12
+ <script src="http://code.jquery.com/qunit/qunit-1.12.0.js"></script>
13
+ <script src="../static/architect.min.js"></script>
14
+ <script>Architect.setupWorkersPath('../static/workers')</script>
15
+
16
+ <script src="./unit/architect_test.js"></script>
17
+ <script src="./unit/architect/polyfill_test.js"></script>
18
+ </body>
19
+ </html>
@@ -0,0 +1,139 @@
1
+ /*
2
+ * QtWebKit-powered headless test runner using PhantomJS
3
+ *
4
+ * PhantomJS binaries: http://phantomjs.org/download.html
5
+ * Requires PhantomJS 1.6+ (1.7+ recommended)
6
+ *
7
+ * Run with:
8
+ * phantomjs runner.js [url-of-your-qunit-testsuite]
9
+ *
10
+ * e.g.
11
+ * phantomjs runner.js http://localhost/qunit/test/index.html
12
+ */
13
+
14
+ /*global phantom:false, require:false, console:false, window:false, QUnit:false */
15
+
16
+ (function() {
17
+ 'use strict';
18
+
19
+ var url, page, timeout,
20
+ args = require('system').args;
21
+
22
+ // arg[0]: scriptName, args[1...]: arguments
23
+ if (args.length < 2 || args.length > 3) {
24
+ console.error('Usage:\n phantomjs runner.js [url-of-your-qunit-testsuite] [timeout-in-seconds]');
25
+ phantom.exit(1);
26
+ }
27
+
28
+ url = args[1];
29
+ page = require('webpage').create();
30
+ if (args[2] !== undefined) {
31
+ timeout = parseInt(args[2], 10);
32
+ }
33
+
34
+ // Route `console.log()` calls from within the Page context to the main Phantom context (i.e. current `this`)
35
+ page.onConsoleMessage = function(msg) {
36
+ console.log(msg);
37
+ };
38
+
39
+ page.onInitialized = function() {
40
+ page.evaluate(addLogging);
41
+ };
42
+
43
+ page.onCallback = function(message) {
44
+ var result,
45
+ failed;
46
+
47
+ if (message) {
48
+ if (message.name === 'QUnit.done') {
49
+ result = message.data;
50
+ failed = !result || result.failed;
51
+
52
+ phantom.exit(failed ? 1 : 0);
53
+ }
54
+ }
55
+ };
56
+
57
+ page.open(url, function(status) {
58
+ if (status !== 'success') {
59
+ console.error('Unable to access network: ' + status);
60
+ phantom.exit(1);
61
+ } else {
62
+ // Cannot do this verification with the 'DOMContentLoaded' handler because it
63
+ // will be too late to attach it if a page does not have any script tags.
64
+ var qunitMissing = page.evaluate(function() { return (typeof QUnit === 'undefined' || !QUnit); });
65
+ if (qunitMissing) {
66
+ console.error('The `QUnit` object is not present on this page.');
67
+ phantom.exit(1);
68
+ }
69
+
70
+ // Set a timeout on the test running, otherwise tests with async problems will hang forever
71
+ if (typeof timeout === 'number') {
72
+ setTimeout(function() {
73
+ console.error('The specified timeout of ' + timeout + ' seconds has expired. Aborting...');
74
+ phantom.exit(1);
75
+ }, timeout * 1000);
76
+ }
77
+
78
+ // Do nothing... the callback mechanism will handle everything!
79
+ }
80
+ });
81
+
82
+ function addLogging() {
83
+ window.document.addEventListener('DOMContentLoaded', function() {
84
+ var currentTestAssertions = [];
85
+
86
+ QUnit.log(function(details) {
87
+ var response;
88
+
89
+ // Ignore passing assertions
90
+ if (details.result) {
91
+ return;
92
+ }
93
+
94
+ response = details.message || '';
95
+
96
+ if (typeof details.expected !== 'undefined') {
97
+ if (response) {
98
+ response += ', ';
99
+ }
100
+
101
+ response += 'expected: ' + details.expected + ', but was: ' + details.actual;
102
+ }
103
+
104
+ if (details.source) {
105
+ response += "\n" + details.source;
106
+ }
107
+
108
+ currentTestAssertions.push('Failed assertion: ' + response);
109
+ });
110
+
111
+ QUnit.testDone(function(result) {
112
+ var i,
113
+ len,
114
+ name = result.module + ': ' + result.name;
115
+
116
+ if (result.failed) {
117
+ console.log('Test failed: ' + name);
118
+
119
+ for (i = 0, len = currentTestAssertions.length; i < len; i++) {
120
+ console.log(' ' + currentTestAssertions[i]);
121
+ }
122
+ }
123
+
124
+ currentTestAssertions.length = 0;
125
+ });
126
+
127
+ QUnit.done(function(result) {
128
+ console.log('Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.');
129
+
130
+ if (typeof window.callPhantom === 'function') {
131
+ window.callPhantom({
132
+ 'name': 'QUnit.done',
133
+ 'data': result
134
+ });
135
+ }
136
+ });
137
+ }, false);
138
+ }
139
+ })();
@@ -0,0 +1,54 @@
1
+ // Helpers
2
+ var disableWorkers = function() {
3
+ Architect.SUPPORT_WORKER = false
4
+ }
5
+
6
+ var makeSureWorkersAreDisabled = function() {
7
+ ok(Architect.SUPPORT_WORKER === false, 'Workers are disabled')
8
+ }
9
+
10
+ // Default Workers
11
+ asyncTest('Proxy Polyfill', function() {
12
+ disableWorkers()
13
+ makeSureWorkersAreDisabled()
14
+
15
+ Architect.proxy('Foo', function(data) {
16
+ ok(data === 'Foo')
17
+ start()
18
+ })
19
+ })
20
+
21
+ asyncTest('Ajax Polyfill', function() {
22
+ disableWorkers()
23
+ makeSureWorkersAreDisabled()
24
+
25
+ Architect.ajax('https://api.github.com/users/etiennelem', function(data) {
26
+ ok(JSON.parse(data).login === 'EtienneLem')
27
+ start()
28
+ })
29
+ })
30
+
31
+ asyncTest('JSONP Polyfill', function() {
32
+ disableWorkers()
33
+ makeSureWorkersAreDisabled()
34
+
35
+ Architect.jsonp('https://api.github.com/users/etiennelem', function(data) {
36
+ ok(data.data.login === 'EtienneLem')
37
+ start()
38
+ })
39
+ })
40
+
41
+ // Custom Workers
42
+ asyncTest('Custom Fallback', function() {
43
+ disableWorkers()
44
+ makeSureWorkersAreDisabled()
45
+
46
+ var foozleWorkerFallback = function(data) {
47
+ return (data + 'zle_doo').toUpperCase()
48
+ }
49
+
50
+ Architect.workFrom('./fixture/foozle_worker.js', 'foo', foozleWorkerFallback, function(data) {
51
+ ok(data === 'FOOZLE_DOO')
52
+ start()
53
+ })
54
+ })
@@ -0,0 +1,49 @@
1
+ // Config
2
+ test('Worker Support', function() {
3
+ ok(Architect.SUPPORT_WORKER === true)
4
+ })
5
+
6
+ test('Custom Workers Path', function() {
7
+ initialWorkerPath = Architect.workersPath
8
+
9
+ Architect.setupWorkersPath('fake/path')
10
+ ok(Architect.workersPath === 'fake/path', 'Custom path')
11
+
12
+ Architect.setupWorkersPath('./fake/path')
13
+ ok(Architect.workersPath === './fake/path', 'Relative path')
14
+
15
+ Architect.setupWorkersPath('fake/path/')
16
+ ok(Architect.workersPath === 'fake/path', 'Removes trailing slash')
17
+
18
+ Architect.setupWorkersPath(initialWorkerPath)
19
+ })
20
+
21
+ // Default Workers
22
+ asyncTest('Proxy Worker', function() {
23
+ Architect.proxy('Foo', function(data) {
24
+ ok(data === 'Foo')
25
+ start()
26
+ })
27
+ })
28
+
29
+ asyncTest('Ajax Worker', function() {
30
+ Architect.ajax('https://api.github.com/users/etiennelem', function(data) {
31
+ ok(JSON.parse(data).login === 'EtienneLem')
32
+ start()
33
+ })
34
+ })
35
+
36
+ asyncTest('JSONP Worker', function() {
37
+ Architect.jsonp('https://api.github.com/users/etiennelem', function(data) {
38
+ ok(data.data.login === 'EtienneLem')
39
+ start()
40
+ })
41
+ })
42
+
43
+ // Custom Workers
44
+ asyncTest('Custom Worker', function() {
45
+ Architect.workFrom('./fixture/foozle_worker.js', 'foo', function(data) {
46
+ ok(data === 'FOOZLE')
47
+ start()
48
+ })
49
+ })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: architect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Etienne Lemay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-05 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coffee-rails
@@ -74,29 +74,37 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
+ - .gitignore
78
+ - CHANGELOG.md
79
+ - Gemfile
80
+ - MIT-LICENSE
81
+ - README.md
82
+ - Rakefile
83
+ - app/assets/javascripts/architect.coffee.erb
77
84
  - app/assets/javascripts/architect/version.coffee.erb
78
85
  - app/assets/javascripts/architect/worker.coffee
79
86
  - app/assets/javascripts/architect/workers/ajax_worker.coffee
80
87
  - app/assets/javascripts/architect/workers/jsonp_worker.coffee
81
88
  - app/assets/javascripts/architect/workers/proxy_worker.coffee
82
- - app/assets/javascripts/architect.coffee.erb
83
89
  - app/assets/javascripts/workers/ajax_worker.coffee
84
90
  - app/assets/javascripts/workers/jsonp_worker.coffee
85
91
  - app/assets/javascripts/workers/proxy_worker.coffee
92
+ - architect.gemspec
93
+ - lib/architect.rb
86
94
  - lib/architect/engine.rb
87
95
  - lib/architect/helpers.rb
88
96
  - lib/architect/version.rb
89
- - lib/architect.rb
90
97
  - lib/tasks/task_helpers.rb
91
98
  - static/architect.min.js
92
99
  - static/workers/ajax_worker.min.js
93
100
  - static/workers/jsonp_worker.min.js
94
101
  - static/workers/proxy_worker.min.js
95
- - Rakefile
96
- - MIT-LICENSE
97
- - README.md
98
- - CHANGELOG.md
99
- homepage: https://github.com/EtienneLem/architect
102
+ - test/fixture/foozle_worker.js
103
+ - test/index.html
104
+ - test/runner.js
105
+ - test/unit/architect/polyfill_test.js
106
+ - test/unit/architect_test.js
107
+ homepage: http://architectjs.org
100
108
  licenses:
101
109
  - MIT
102
110
  metadata: {}
@@ -120,4 +128,9 @@ rubygems_version: 2.0.0
120
128
  signing_key:
121
129
  specification_version: 4
122
130
  summary: Your web workers’ supervisor
123
- test_files: []
131
+ test_files:
132
+ - test/fixture/foozle_worker.js
133
+ - test/index.html
134
+ - test/runner.js
135
+ - test/unit/architect/polyfill_test.js
136
+ - test/unit/architect_test.js