├── config
├── gae_sdk_download_url_cb_1_10
└── gae_sdk_download_url_cb_1_11
├── lib
├── GoogleAppEngineCloudStorageClient-1.9.15.0.zip
├── GoogleAppEnginePipeline-1.9.17.0.zip
├── Graphy-1.0.0.zip
├── appengine-mapreduce-0.8.2.zip
├── babel-0.9.6.zip
├── bootstrap-3.3.4.zip
├── bootswatch-3.3.6-4db5bf2.zip
├── codemirror-4.5.0.zip
├── crossfilter-1.3.7.zip
├── d3-3.4.3.zip
├── dagre-0.7.4.zip
├── dagre-d3-0.4.17p.zip
├── dc.js-1.6.0.zip
├── decorator-3.4.0.zip
├── dependo-0.1.4.zip
├── gaepytz-2011h.zip
├── google-api-python-client-1.1.zip
├── google-api-python-client-1.4.0.zip
├── graphene-0.7.3.zip
├── graphql-core-0.4.12.1.zip
├── graphql-relay-0.3.3.zip
├── html5lib-0.95.zip
├── html5shiv-3.7.2.zip
├── httplib2-0.8.zip
├── identity-toolkit-python-client-0.1.6.zip
├── inputex-3.1.0.zip
├── isodate-0.5.5.zip
├── jasmine-jquery-1.5.2.js
├── jquery-2.2.4.zip
├── jquery-scrolldepth-0.9.0-76e5dfd.zip
├── jqueryui-1.11.4.zip
├── mapreduce-r645.zip
├── markdown-2.5.zip
├── material-design-iconic-font-1.1.1.zip
├── mathjax-2.3.0.zip
├── mathjax-fonts-2.3.0.zip
├── mrs-mapreduce-0.9.zip
├── networkx-1.9.1.zip
├── oauth-1.0.1.zip
├── phantomjs-2.1.1-linux-x86_64.tar.bz2
├── phantomjs-2.1.1-macosx.zip
├── polymer-1.2.0.zip
├── polymer-guide-1.2.0.zip
├── pyparsing-1.5.7.zip
├── python-gflags-2.0.zip
├── rdflib-4.2.2-dev.zip
├── reportlab-3.1.8.zip
├── respond-1.4.2.zip
├── riveted-0.6.0-5a1965f.zip
├── simplejson-3.7.1.zip
├── six-1.10.0.zip
├── underscore-1.4.3.zip
├── yui_2in3-2.9.0.zip
└── yui_3.6.0.zip
└── patches
├── fix_files_api_1.6.0.sh
├── fix_files_api_1.7.0.sh
└── fix_files_api_1.8.0.sh
/config/gae_sdk_download_url_cb_1_10:
--------------------------------------------------------------------------------
1 | https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.27.zip
2 |
--------------------------------------------------------------------------------
/config/gae_sdk_download_url_cb_1_11:
--------------------------------------------------------------------------------
1 | https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.73.zip
2 |
--------------------------------------------------------------------------------
/lib/GoogleAppEngineCloudStorageClient-1.9.15.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/GoogleAppEngineCloudStorageClient-1.9.15.0.zip
--------------------------------------------------------------------------------
/lib/GoogleAppEnginePipeline-1.9.17.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/GoogleAppEnginePipeline-1.9.17.0.zip
--------------------------------------------------------------------------------
/lib/Graphy-1.0.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/Graphy-1.0.0.zip
--------------------------------------------------------------------------------
/lib/appengine-mapreduce-0.8.2.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/appengine-mapreduce-0.8.2.zip
--------------------------------------------------------------------------------
/lib/babel-0.9.6.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/babel-0.9.6.zip
--------------------------------------------------------------------------------
/lib/bootstrap-3.3.4.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/bootstrap-3.3.4.zip
--------------------------------------------------------------------------------
/lib/bootswatch-3.3.6-4db5bf2.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/bootswatch-3.3.6-4db5bf2.zip
--------------------------------------------------------------------------------
/lib/codemirror-4.5.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/codemirror-4.5.0.zip
--------------------------------------------------------------------------------
/lib/crossfilter-1.3.7.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/crossfilter-1.3.7.zip
--------------------------------------------------------------------------------
/lib/d3-3.4.3.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/d3-3.4.3.zip
--------------------------------------------------------------------------------
/lib/dagre-0.7.4.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/dagre-0.7.4.zip
--------------------------------------------------------------------------------
/lib/dagre-d3-0.4.17p.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/dagre-d3-0.4.17p.zip
--------------------------------------------------------------------------------
/lib/dc.js-1.6.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/dc.js-1.6.0.zip
--------------------------------------------------------------------------------
/lib/decorator-3.4.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/decorator-3.4.0.zip
--------------------------------------------------------------------------------
/lib/dependo-0.1.4.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/dependo-0.1.4.zip
--------------------------------------------------------------------------------
/lib/gaepytz-2011h.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/gaepytz-2011h.zip
--------------------------------------------------------------------------------
/lib/google-api-python-client-1.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/google-api-python-client-1.1.zip
--------------------------------------------------------------------------------
/lib/google-api-python-client-1.4.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/google-api-python-client-1.4.0.zip
--------------------------------------------------------------------------------
/lib/graphene-0.7.3.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/graphene-0.7.3.zip
--------------------------------------------------------------------------------
/lib/graphql-core-0.4.12.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/graphql-core-0.4.12.1.zip
--------------------------------------------------------------------------------
/lib/graphql-relay-0.3.3.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/graphql-relay-0.3.3.zip
--------------------------------------------------------------------------------
/lib/html5lib-0.95.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/html5lib-0.95.zip
--------------------------------------------------------------------------------
/lib/html5shiv-3.7.2.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/html5shiv-3.7.2.zip
--------------------------------------------------------------------------------
/lib/httplib2-0.8.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/httplib2-0.8.zip
--------------------------------------------------------------------------------
/lib/identity-toolkit-python-client-0.1.6.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/identity-toolkit-python-client-0.1.6.zip
--------------------------------------------------------------------------------
/lib/inputex-3.1.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/inputex-3.1.0.zip
--------------------------------------------------------------------------------
/lib/isodate-0.5.5.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/isodate-0.5.5.zip
--------------------------------------------------------------------------------
/lib/jasmine-jquery-1.5.2.js:
--------------------------------------------------------------------------------
1 | /*!
2 | Jasmine-jQuery: a set of jQuery helpers for Jasmine tests.
3 |
4 | Version 1.5.2
5 |
6 | https://github.com/velesin/jasmine-jquery
7 |
8 | Copyright (c) 2010-2013 Wojciech Zawistowski, Travis Jeffery
9 |
10 | Permission is hereby granted, free of charge, to any person obtaining
11 | a copy of this software and associated documentation files (the
12 | "Software"), to deal in the Software without restriction, including
13 | without limitation the rights to use, copy, modify, merge, publish,
14 | distribute, sublicense, and/or sell copies of the Software, and to
15 | permit persons to whom the Software is furnished to do so, subject to
16 | the following conditions:
17 |
18 | The above copyright notice and this permission notice shall be
19 | included in all copies or substantial portions of the Software.
20 |
21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 | */
29 | var readFixtures = function() {
30 | return jasmine.getFixtures().proxyCallTo_('read', arguments)
31 | }
32 |
33 | var preloadFixtures = function() {
34 | jasmine.getFixtures().proxyCallTo_('preload', arguments)
35 | }
36 |
37 | var loadFixtures = function() {
38 | jasmine.getFixtures().proxyCallTo_('load', arguments)
39 | }
40 |
41 | var appendLoadFixtures = function() {
42 | jasmine.getFixtures().proxyCallTo_('appendLoad', arguments)
43 | }
44 |
45 | var setFixtures = function(html) {
46 | jasmine.getFixtures().proxyCallTo_('set', arguments)
47 | }
48 |
49 | var appendSetFixtures = function() {
50 | jasmine.getFixtures().proxyCallTo_('appendSet', arguments)
51 | }
52 |
53 | var sandbox = function(attributes) {
54 | return jasmine.getFixtures().sandbox(attributes)
55 | }
56 |
57 | var spyOnEvent = function(selector, eventName) {
58 | return jasmine.JQuery.events.spyOn(selector, eventName)
59 | }
60 |
61 | var preloadStyleFixtures = function() {
62 | jasmine.getStyleFixtures().proxyCallTo_('preload', arguments)
63 | }
64 |
65 | var loadStyleFixtures = function() {
66 | jasmine.getStyleFixtures().proxyCallTo_('load', arguments)
67 | }
68 |
69 | var appendLoadStyleFixtures = function() {
70 | jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments)
71 | }
72 |
73 | var setStyleFixtures = function(html) {
74 | jasmine.getStyleFixtures().proxyCallTo_('set', arguments)
75 | }
76 |
77 | var appendSetStyleFixtures = function(html) {
78 | jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments)
79 | }
80 |
81 | var loadJSONFixtures = function() {
82 | return jasmine.getJSONFixtures().proxyCallTo_('load', arguments)
83 | }
84 |
85 | var getJSONFixture = function(url) {
86 | return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url]
87 | }
88 |
89 | jasmine.spiedEventsKey = function (selector, eventName) {
90 | return [$(selector).selector, eventName].toString()
91 | }
92 |
93 | jasmine.getFixtures = function() {
94 | return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures()
95 | }
96 |
97 | jasmine.getStyleFixtures = function() {
98 | return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures()
99 | }
100 |
101 | jasmine.Fixtures = function() {
102 | this.containerId = 'jasmine-fixtures'
103 | this.fixturesCache_ = {}
104 | this.fixturesPath = 'spec/javascripts/fixtures'
105 | }
106 |
107 | jasmine.Fixtures.prototype.set = function(html) {
108 | this.cleanUp()
109 | this.createContainer_(html)
110 | }
111 |
112 | jasmine.Fixtures.prototype.appendSet= function(html) {
113 | this.addToContainer_(html)
114 | }
115 |
116 | jasmine.Fixtures.prototype.preload = function() {
117 | this.read.apply(this, arguments)
118 | }
119 |
120 | jasmine.Fixtures.prototype.load = function() {
121 | this.cleanUp()
122 | this.createContainer_(this.read.apply(this, arguments))
123 | }
124 |
125 | jasmine.Fixtures.prototype.appendLoad = function() {
126 | this.addToContainer_(this.read.apply(this, arguments))
127 | }
128 |
129 | jasmine.Fixtures.prototype.read = function() {
130 | var htmlChunks = []
131 |
132 | var fixtureUrls = arguments
133 | for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
134 | htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]))
135 | }
136 |
137 | return htmlChunks.join('')
138 | }
139 |
140 | jasmine.Fixtures.prototype.clearCache = function() {
141 | this.fixturesCache_ = {}
142 | }
143 |
144 | jasmine.Fixtures.prototype.cleanUp = function() {
145 | $('#' + this.containerId).remove()
146 | }
147 |
148 | jasmine.Fixtures.prototype.sandbox = function(attributes) {
149 | var attributesToSet = attributes || {}
150 | return $('
').attr(attributesToSet)
151 | }
152 |
153 | jasmine.Fixtures.prototype.createContainer_ = function(html) {
154 | var container
155 | if(html instanceof $) {
156 | container = $('')
157 | container.html(html)
158 | } else {
159 | container = '' + html + '
'
160 | }
161 | $(document.body).append(container)
162 | }
163 |
164 | jasmine.Fixtures.prototype.addToContainer_ = function(html){
165 | var container = $(document.body).find('#'+this.containerId).append(html)
166 | if(!container.length){
167 | this.createContainer_(html)
168 | }
169 | }
170 |
171 | jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
172 | if (typeof this.fixturesCache_[url] === 'undefined') {
173 | this.loadFixtureIntoCache_(url)
174 | }
175 | return this.fixturesCache_[url]
176 | }
177 |
178 | jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
179 | var url = this.makeFixtureUrl_(relativeUrl)
180 | var request = $.ajax({
181 | type: "GET",
182 | url: url + "?" + new Date().getTime(),
183 | async: false
184 | })
185 | this.fixturesCache_[relativeUrl] = request.responseText
186 | }
187 |
188 | jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){
189 | return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
190 | }
191 |
192 | jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
193 | return this[methodName].apply(this, passedArguments)
194 | }
195 |
196 |
197 | jasmine.StyleFixtures = function() {
198 | this.fixturesCache_ = {}
199 | this.fixturesNodes_ = []
200 | this.fixturesPath = 'spec/javascripts/fixtures'
201 | }
202 |
203 | jasmine.StyleFixtures.prototype.set = function(css) {
204 | this.cleanUp()
205 | this.createStyle_(css)
206 | }
207 |
208 | jasmine.StyleFixtures.prototype.appendSet = function(css) {
209 | this.createStyle_(css)
210 | }
211 |
212 | jasmine.StyleFixtures.prototype.preload = function() {
213 | this.read_.apply(this, arguments)
214 | }
215 |
216 | jasmine.StyleFixtures.prototype.load = function() {
217 | this.cleanUp()
218 | this.createStyle_(this.read_.apply(this, arguments))
219 | }
220 |
221 | jasmine.StyleFixtures.prototype.appendLoad = function() {
222 | this.createStyle_(this.read_.apply(this, arguments))
223 | }
224 |
225 | jasmine.StyleFixtures.prototype.cleanUp = function() {
226 | while(this.fixturesNodes_.length) {
227 | this.fixturesNodes_.pop().remove()
228 | }
229 | }
230 |
231 | jasmine.StyleFixtures.prototype.createStyle_ = function(html) {
232 | var styleText = $('').html(html).text(),
233 | style = $('')
234 |
235 | this.fixturesNodes_.push(style)
236 |
237 | $('head').append(style)
238 | }
239 |
240 | jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache
241 |
242 | jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read
243 |
244 | jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_
245 |
246 | jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_
247 |
248 | jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_
249 |
250 | jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_
251 |
252 | jasmine.getJSONFixtures = function() {
253 | return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures()
254 | }
255 |
256 | jasmine.JSONFixtures = function() {
257 | this.fixturesCache_ = {}
258 | this.fixturesPath = 'spec/javascripts/fixtures/json'
259 | }
260 |
261 | jasmine.JSONFixtures.prototype.load = function() {
262 | this.read.apply(this, arguments)
263 | return this.fixturesCache_
264 | }
265 |
266 | jasmine.JSONFixtures.prototype.read = function() {
267 | var fixtureUrls = arguments
268 | for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
269 | this.getFixtureData_(fixtureUrls[urlIndex])
270 | }
271 | return this.fixturesCache_
272 | }
273 |
274 | jasmine.JSONFixtures.prototype.clearCache = function() {
275 | this.fixturesCache_ = {}
276 | }
277 |
278 | jasmine.JSONFixtures.prototype.getFixtureData_ = function(url) {
279 | this.loadFixtureIntoCache_(url)
280 | return this.fixturesCache_[url]
281 | }
282 |
283 | jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
284 | var self = this
285 | var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
286 | $.ajax({
287 | async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
288 | cache: false,
289 | dataType: 'json',
290 | url: url,
291 | success: function(data) {
292 | self.fixturesCache_[relativeUrl] = data
293 | },
294 | error: function(jqXHR, status, errorThrown) {
295 | throw Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
296 | }
297 | })
298 | }
299 |
300 | jasmine.JSONFixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
301 | return this[methodName].apply(this, passedArguments)
302 | }
303 |
304 | jasmine.JQuery = function() {}
305 |
306 | jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
307 | return $('').append(html).html()
308 | }
309 |
310 | jasmine.JQuery.elementToString = function(element) {
311 | var domEl = $(element).get(0)
312 | if (domEl == undefined || domEl.cloneNode)
313 | return $('').append($(element).clone()).html()
314 | else
315 | return element.toString()
316 | }
317 |
318 | jasmine.JQuery.matchersClass = {}
319 |
320 | !function(namespace) {
321 | var data = {
322 | spiedEvents: {},
323 | handlers: []
324 | }
325 |
326 | namespace.events = {
327 | spyOn: function(selector, eventName) {
328 | var handler = function(e) {
329 | data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments)
330 | }
331 | $(selector).on(eventName, handler)
332 | data.handlers.push(handler)
333 | return {
334 | selector: selector,
335 | eventName: eventName,
336 | handler: handler,
337 | reset: function(){
338 | delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
339 | }
340 | }
341 | },
342 |
343 | args: function(selector, eventName) {
344 | var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)];
345 |
346 | if (!actualArgs) {
347 | throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent.";
348 | }
349 |
350 | return actualArgs;
351 | },
352 |
353 | wasTriggered: function(selector, eventName) {
354 | return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)])
355 | },
356 |
357 | wasTriggeredWith: function(selector, eventName, expectedArgs, env) {
358 | var actualArgs = jasmine.JQuery.events.args(selector, eventName).slice(1);
359 | if (Object.prototype.toString.call(expectedArgs) !== '[object Array]') {
360 | actualArgs = actualArgs[0];
361 | }
362 | return env.equals_(expectedArgs, actualArgs);
363 | },
364 |
365 | wasPrevented: function(selector, eventName) {
366 | var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)],
367 | e = args ? args[0] : undefined;
368 | return e && e.isDefaultPrevented()
369 | },
370 |
371 | wasStopped: function(selector, eventName) {
372 | var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)],
373 | e = args ? args[0] : undefined;
374 | return e && e.isPropagationStopped()
375 | },
376 |
377 | cleanUp: function() {
378 | data.spiedEvents = {}
379 | data.handlers = []
380 | }
381 | }
382 | }(jasmine.JQuery)
383 |
384 | !function(){
385 | var jQueryMatchers = {
386 | toHaveClass: function(className) {
387 | return this.actual.hasClass(className)
388 | },
389 |
390 | toHaveCss: function(css){
391 | for (var prop in css){
392 | if (this.actual.css(prop) !== css[prop]) return false
393 | }
394 | return true
395 | },
396 |
397 | toBeVisible: function() {
398 | return this.actual.is(':visible')
399 | },
400 |
401 | toBeHidden: function() {
402 | return this.actual.is(':hidden')
403 | },
404 |
405 | toBeSelected: function() {
406 | return this.actual.is(':selected')
407 | },
408 |
409 | toBeChecked: function() {
410 | return this.actual.is(':checked')
411 | },
412 |
413 | toBeEmpty: function() {
414 | return this.actual.is(':empty')
415 | },
416 |
417 | toExist: function() {
418 | return $(document).find(this.actual).length
419 | },
420 |
421 | toHaveLength: function(length) {
422 | return this.actual.length === length
423 | },
424 |
425 | toHaveAttr: function(attributeName, expectedAttributeValue) {
426 | return hasProperty(this.actual.attr(attributeName), expectedAttributeValue)
427 | },
428 |
429 | toHaveProp: function(propertyName, expectedPropertyValue) {
430 | return hasProperty(this.actual.prop(propertyName), expectedPropertyValue)
431 | },
432 |
433 | toHaveId: function(id) {
434 | return this.actual.attr('id') == id
435 | },
436 |
437 | toHaveHtml: function(html) {
438 | return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html)
439 | },
440 |
441 | toContainHtml: function(html){
442 | var actualHtml = this.actual.html()
443 | var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html)
444 | return (actualHtml.indexOf(expectedHtml) >= 0)
445 | },
446 |
447 | toHaveText: function(text) {
448 | var trimmedText = $.trim(this.actual.text())
449 | if (text && $.isFunction(text.test)) {
450 | return text.test(trimmedText)
451 | } else {
452 | return trimmedText == text
453 | }
454 | },
455 |
456 | toContainText: function(text) {
457 | var trimmedText = $.trim(this.actual.text())
458 | if (text && $.isFunction(text.test)) {
459 | return text.test(trimmedText)
460 | } else {
461 | return trimmedText.indexOf(text) != -1;
462 | }
463 | },
464 |
465 | toHaveValue: function(value) {
466 | return this.actual.val() === value
467 | },
468 |
469 | toHaveData: function(key, expectedValue) {
470 | return hasProperty(this.actual.data(key), expectedValue)
471 | },
472 |
473 | toBe: function(selector) {
474 | return this.actual.is(selector)
475 | },
476 |
477 | toContain: function(selector) {
478 | return this.actual.find(selector).length
479 | },
480 |
481 | toBeDisabled: function(selector){
482 | return this.actual.is(':disabled')
483 | },
484 |
485 | toBeFocused: function(selector) {
486 | return this.actual[0] === this.actual[0].ownerDocument.activeElement
487 | },
488 |
489 | toHandle: function(event) {
490 |
491 | var events = $._data(this.actual.get(0), "events")
492 |
493 | if(!events || !event || typeof event !== "string") {
494 | return false
495 | }
496 |
497 | var namespaces = event.split(".")
498 | var eventType = namespaces.shift()
499 | var sortedNamespaces = namespaces.slice(0).sort()
500 | var namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)")
501 |
502 | if(events[eventType] && namespaces.length) {
503 | for(var i = 0; i < events[eventType].length; i++) {
504 | var namespace = events[eventType][i].namespace
505 | if(namespaceRegExp.test(namespace)) {
506 | return true
507 | }
508 | }
509 | } else {
510 | return events[eventType] && events[eventType].length > 0
511 | }
512 | },
513 |
514 | // tests the existence of a specific event binding + handler
515 | toHandleWith: function(eventName, eventHandler) {
516 | var stack = $._data(this.actual.get(0), "events")[eventName]
517 | for (var i = 0; i < stack.length; i++) {
518 | if (stack[i].handler == eventHandler) return true
519 | }
520 | return false
521 | }
522 | }
523 |
524 | var hasProperty = function(actualValue, expectedValue) {
525 | if (expectedValue === undefined) return actualValue !== undefined
526 | return actualValue == expectedValue
527 | }
528 |
529 | var bindMatcher = function(methodName) {
530 | var builtInMatcher = jasmine.Matchers.prototype[methodName]
531 |
532 | jasmine.JQuery.matchersClass[methodName] = function() {
533 | if (this.actual
534 | && (this.actual instanceof $
535 | || jasmine.isDomNode(this.actual))) {
536 | this.actual = $(this.actual)
537 | var result = jQueryMatchers[methodName].apply(this, arguments)
538 | var element
539 | if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML")
540 | this.actual = jasmine.JQuery.elementToString(this.actual)
541 | return result
542 | }
543 |
544 | if (builtInMatcher) {
545 | return builtInMatcher.apply(this, arguments)
546 | }
547 |
548 | return false
549 | }
550 | }
551 |
552 | for(var methodName in jQueryMatchers) {
553 | bindMatcher(methodName)
554 | }
555 | }()
556 |
557 | beforeEach(function() {
558 | this.addMatchers(jasmine.JQuery.matchersClass)
559 | this.addMatchers({
560 | toHaveBeenTriggeredOn: function(selector) {
561 | this.message = function() {
562 | return [
563 | "Expected event " + this.actual + " to have been triggered on " + selector,
564 | "Expected event " + this.actual + " not to have been triggered on " + selector
565 | ]
566 | }
567 | return jasmine.JQuery.events.wasTriggered(selector, this.actual)
568 | }
569 | })
570 | this.addMatchers({
571 | toHaveBeenTriggered: function(){
572 | var eventName = this.actual.eventName,
573 | selector = this.actual.selector
574 | this.message = function() {
575 | return [
576 | "Expected event " + eventName + " to have been triggered on " + selector,
577 | "Expected event " + eventName + " not to have been triggered on " + selector
578 | ]
579 | }
580 | return jasmine.JQuery.events.wasTriggered(selector, eventName)
581 | }
582 | })
583 | this.addMatchers({
584 | toHaveBeenTriggeredOnAndWith: function() {
585 | var selector = arguments[0],
586 | expectedArgs = arguments[1],
587 | wasTriggered = jasmine.JQuery.events.wasTriggered(selector, this.actual);
588 | this.message = function() {
589 | if (wasTriggered) {
590 | var actualArgs = jasmine.JQuery.events.args(selector, this.actual, expectedArgs)[1];
591 | return [
592 | "Expected event " + this.actual + " to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs),
593 | "Expected event " + this.actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs)
594 | ]
595 | } else {
596 | return [
597 | "Expected event " + this.actual + " to have been triggered on " + selector,
598 | "Expected event " + this.actual + " not to have been triggered on " + selector
599 | ]
600 | }
601 | }
602 | return wasTriggered && jasmine.JQuery.events.wasTriggeredWith(selector, this.actual, expectedArgs, this.env);
603 | }
604 | })
605 | this.addMatchers({
606 | toHaveBeenPreventedOn: function(selector) {
607 | this.message = function() {
608 | return [
609 | "Expected event " + this.actual + " to have been prevented on " + selector,
610 | "Expected event " + this.actual + " not to have been prevented on " + selector
611 | ]
612 | }
613 | return jasmine.JQuery.events.wasPrevented(selector, this.actual)
614 | }
615 | })
616 | this.addMatchers({
617 | toHaveBeenPrevented: function() {
618 | var eventName = this.actual.eventName,
619 | selector = this.actual.selector
620 | this.message = function() {
621 | return [
622 | "Expected event " + eventName + " to have been prevented on " + selector,
623 | "Expected event " + eventName + " not to have been prevented on " + selector
624 | ]
625 | }
626 | return jasmine.JQuery.events.wasPrevented(selector, eventName)
627 | }
628 | })
629 | this.addMatchers({
630 | toHaveBeenStoppedOn: function(selector) {
631 | this.message = function() {
632 | return [
633 | "Expected event " + this.actual + " to have been stopped on " + selector,
634 | "Expected event " + this.actual + " not to have been stopped on " + selector
635 | ]
636 | }
637 | return jasmine.JQuery.events.wasStopped(selector, this.actual)
638 | }
639 | })
640 | this.addMatchers({
641 | toHaveBeenStopped: function() {
642 | var eventName = this.actual.eventName,
643 | selector = this.actual.selector
644 | this.message = function() {
645 | return [
646 | "Expected event " + eventName + " to have been stopped on " + selector,
647 | "Expected event " + eventName + " not to have been stopped on " + selector
648 | ]
649 | }
650 | return jasmine.JQuery.events.wasStopped(selector, eventName)
651 | }
652 | })
653 | })
654 |
655 | afterEach(function() {
656 | jasmine.getFixtures().cleanUp()
657 | jasmine.getStyleFixtures().cleanUp()
658 | jasmine.JQuery.events.cleanUp()
659 | })
660 |
--------------------------------------------------------------------------------
/lib/jquery-2.2.4.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/jquery-2.2.4.zip
--------------------------------------------------------------------------------
/lib/jquery-scrolldepth-0.9.0-76e5dfd.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/jquery-scrolldepth-0.9.0-76e5dfd.zip
--------------------------------------------------------------------------------
/lib/jqueryui-1.11.4.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/jqueryui-1.11.4.zip
--------------------------------------------------------------------------------
/lib/mapreduce-r645.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/mapreduce-r645.zip
--------------------------------------------------------------------------------
/lib/markdown-2.5.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/markdown-2.5.zip
--------------------------------------------------------------------------------
/lib/material-design-iconic-font-1.1.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/material-design-iconic-font-1.1.1.zip
--------------------------------------------------------------------------------
/lib/mathjax-2.3.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/mathjax-2.3.0.zip
--------------------------------------------------------------------------------
/lib/mathjax-fonts-2.3.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/mathjax-fonts-2.3.0.zip
--------------------------------------------------------------------------------
/lib/mrs-mapreduce-0.9.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/mrs-mapreduce-0.9.zip
--------------------------------------------------------------------------------
/lib/networkx-1.9.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/networkx-1.9.1.zip
--------------------------------------------------------------------------------
/lib/oauth-1.0.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/oauth-1.0.1.zip
--------------------------------------------------------------------------------
/lib/phantomjs-2.1.1-linux-x86_64.tar.bz2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/phantomjs-2.1.1-linux-x86_64.tar.bz2
--------------------------------------------------------------------------------
/lib/phantomjs-2.1.1-macosx.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/phantomjs-2.1.1-macosx.zip
--------------------------------------------------------------------------------
/lib/polymer-1.2.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/polymer-1.2.0.zip
--------------------------------------------------------------------------------
/lib/polymer-guide-1.2.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/polymer-guide-1.2.0.zip
--------------------------------------------------------------------------------
/lib/pyparsing-1.5.7.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/pyparsing-1.5.7.zip
--------------------------------------------------------------------------------
/lib/python-gflags-2.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/python-gflags-2.0.zip
--------------------------------------------------------------------------------
/lib/rdflib-4.2.2-dev.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/rdflib-4.2.2-dev.zip
--------------------------------------------------------------------------------
/lib/reportlab-3.1.8.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/reportlab-3.1.8.zip
--------------------------------------------------------------------------------
/lib/respond-1.4.2.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/respond-1.4.2.zip
--------------------------------------------------------------------------------
/lib/riveted-0.6.0-5a1965f.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/riveted-0.6.0-5a1965f.zip
--------------------------------------------------------------------------------
/lib/simplejson-3.7.1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/simplejson-3.7.1.zip
--------------------------------------------------------------------------------
/lib/six-1.10.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/six-1.10.0.zip
--------------------------------------------------------------------------------
/lib/underscore-1.4.3.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/underscore-1.4.3.zip
--------------------------------------------------------------------------------
/lib/yui_2in3-2.9.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/yui_2in3-2.9.0.zip
--------------------------------------------------------------------------------
/lib/yui_3.6.0.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/coursebuilder-resources/463c041a62fc4ad46f1015271c24b2a9d8de1687/lib/yui_3.6.0.zip
--------------------------------------------------------------------------------
/patches/fix_files_api_1.6.0.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # Copyright 2015 Google Inc. All Rights Reserved.
4 | #
5 | # Licensed under the Apache License, Version 2.0 (the "License");
6 | # you may not use this file except in compliance with the License.
7 | # You may obtain a copy of the License at
8 | #
9 | # http://www.apache.org/licenses/LICENSE-2.0
10 | #
11 | # Unless required by applicable law or agreed to in writing, software
12 | # distributed under the License is distributed on an "AS-IS" BASIS,
13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 | # See the License for the specific language governing permissions and
15 | # limitations under the License.
16 |
17 | cat < /dev/null 2>&1
51 |
52 | if [[ $? -eq 0 ]] ; then
53 | echo "Looks like a Course Builder 1.6.0 release; proceeding.";
54 | else
55 | echo '------------------------- ERROR -----------------------------'
56 | echo "This patch will only apply cleanly against Course Builder "
57 | echo "version 1.6.0. You may try manually applying the patch by "
58 | echo "modifying this script to remove this check, but be advised "
59 | echo "that you are proceeding at your own risk if you do so."
60 | echo ""
61 | exit 1
62 | fi
63 |
64 | export TMPFILE=/tmp/files_api.patch
65 |
66 | # Fail on any error here and below.
67 | set -e
68 |
69 | cat > $TMPFILE < /dev/null 2>&1
51 |
52 | if [[ $? -eq 0 ]] ; then
53 | echo "Looks like a Course Builder 1.7.0 release; proceeding.";
54 | else
55 | echo '------------------------- ERROR -----------------------------'
56 | echo "This patch will only apply cleanly against Course Builder "
57 | echo "version 1.7.0. You may try manually applying the patch by "
58 | echo "modifying this script to remove this check, but be advised "
59 | echo "that you are proceeding at your own risk if you do so."
60 | echo ""
61 | exit 1
62 | fi
63 |
64 | export TMPFILE=/tmp/files_api.patch
65 |
66 | # Fail on any error here and below.
67 | set -e
68 |
69 | cat > $TMPFILE < /dev/null 2>&1
51 |
52 | if [[ $? -eq 0 ]] ; then
53 | echo "Looks like a Course Builder 1.8.0 release; proceeding.";
54 | else
55 | echo '------------------------- ERROR -----------------------------'
56 | echo "This patch will only apply cleanly against Course Builder "
57 | echo "version 1.8.0. You may try manually applying the patch by "
58 | echo "modifying this script to remove this check, but be advised "
59 | echo "that you are proceeding at your own risk if you do so."
60 | echo ""
61 | exit 1
62 | fi
63 |
64 | export TMPFILE=/tmp/files_api.patch
65 |
66 | # Fail on any error here and below.
67 | set -e
68 |
69 | cat > $TMPFILE <