Put "My Accounts" app just between "My Apps" and "Settings" apps

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


Disabled: thumb preload.

Disabled: thumb preload.


Inflate and deflate a user session when saving/loading from a cookie

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/MicrosmartSA/ubiquity-ui.git/'


Don't access to gon if not needed

Don't access to gon if not needed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/microweb10/urlmini.git/'


Fix callback method calling

Fix callback method calling

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Arm1stice/prosu.git/'


Adding the most important script to summon Taylor Swift.

error: pathspec 'scripts/taytay.coffee' did not match any file(s) known to git

--- scripts/taytay.coffee
+++ scripts/taytay.coffee
@@ -0,0 +1,45 @@
+# Description:
+#   Summon Taylor Swift
+#
+# Commands:
+#   hubot tay me - Reply with Taylor Swift
+#   taylor swift|swifty|tails|tayter tot|taytay|t-swift|t-swizzle|tay - Reply with Taylor Swift
+
+tay = [
+	"https://media0.giphy.com/media/l0K4c8bZHJzDCmg6Y/200.gif",
+	"https://media2.giphy.com/media/3o7qDPw0ut34r5Tala/200.gif",
+	"https://media0.giphy.com/media/g8CJl0epg71MQ/200.gif",
+	"https://media2.giphy.com/media/rvDtLCABDMaqY/200.gif",
+	"https://media3.giphy.com/media/HDQO74ekA0Hp6/200.gif",
+	"https://media1.giphy.com/media/3oEduYNRQXNYfGZ7LG/200.gif",
+	"https://media1.giphy.com/media/qvWCTAG5MxOmc/200.gif",
+	"https://media1.giphy.com/media/KDHkHNpM3Eht6/200.gif",
+	"https://media0.giphy.com/media/vk8zbMJQcfaIE/200.gif",
+	"https://media.giphy.com/media/nXiel1G5ToSgU/giphy.gif",
+	"http://media1.giphy.com/media/nXOds9I8K8gUg/giphy.gif",
+	"https://media.giphy.com/media/RMonqmwIZagbm/giphy.gif",
+	"http://www.reactiongifs.com/r/tw.gif",
+	"http://www.reactiongifs.com/r/tssmd.gif",
+	"http://www.reactiongifs.com/wp-content/uploads/2013/09/thug.gif",
+	"http://www.reactiongifs.com/wp-content/uploads/2013/10/taylor-swift-mind-blown.gif",
+	"http://cdn.playbuzz.com/cdn/d6edbba5-ddfb-4438-8b5d-17458f98ab88/30b228c6-db5d-4105-aa38-bbe0533f3cc5.gif",
+	"https://66.media.tumblr.com/5e0096d02ca16c3382c1006e9f6c338d/tumblr_neabpn72Cw1tm4tz8o1_400.gif",
+	"https://media.giphy.com/media/895uU9amktvgc/giphy.gif",
+	"http://danglingmouse.com/wp-content/uploads/2014/10/taylor-laughing.gif",
+	"http://ak-hdl.buzzfed.com/static/2015-04/13/0/imagebuzz/webdr01/anigif_optimized-17556-1428901157-16.gif",
+	"http://likegif.com/wp-content/uploads/2013/03/Taylor-Swift-gif-114.gif",
+	"http://static.buzznet.com/uploads/2016/03/unnamed10.gif",
+	"http://2.bp.blogspot.com/-CqCYGJUibOM/VVsn0WPVzzI/AAAAAAAAHek/AGefXk0S8kI/s1600/Taylor-swift-Bad-Blood-Neve.gif",
+	"https://media.giphy.com/media/26BkLBA32cX3AfM0o/giphy.gif",
+	"http://www.eonline.com/eol_images/Entire_Site/20141010//rs_540x225-141110045936-tumblr_neti2yNK1i1tarer7o1_1280.gif",
+]
+
+module.exports = (robot) ->
+
+	robot.respond /tay me/i, (msg) ->
+		msg.send msg.random tay
+
+	tayExpression = /\b(taylor swift|swifty|tails|tayter tot|taytay|t-swift|t-swizzle|tay)\b/i
+
+	robot.hear tayExpression, (msg) ->
+		msg.send msg.random tay


CLIO-24155: Update failing test spec.

CLIO-24155: Update failing test spec.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/seanhealy/lib-themisui.git/'


Fixed bug in footer

Fixed bug in footer

--- src/javascript/directives/footer.coffee
+++ src/javascript/directives/footer.coffee
@@ -1,4 +1,4 @@
-app.dirctive 'sharedFooter', ->
+app.directive 'sharedFooter', ->
   template: 'Zwadonk |
              Fnurkels |
              Messages |


Make sure guest view is destroyed immediately when embeder is closed

--- atom/browser/lib/guest-view-manager.coffee
+++ atom/browser/lib/guest-view-manager.coffee
@@ -30,6 +30,10 @@
 embedderElementsMap = {}
 reverseEmbedderElementsMap = {}

+# Moves the last element of array to the first one.
+moveLastToFirst = (list) ->
+  list.unshift list.pop()
+
 # Generate guestInstanceId.
 getNextInstanceId = (webContents) ->
   ++nextInstanceId
@@ -46,7 +50,13 @@
   destroyEvents = ['destroyed', 'crashed', 'did-navigate-to-different-page']
   destroy = ->
     destroyGuest embedder, id if guestInstances[id]?
-  embedder.once event, destroy for event in destroyEvents
+  for event in destroyEvents
+    embedder.once event, destroy
+    # Users might also listen to the crashed event, so We must ensure the guest
+    # is destroyed before users' listener gets called. It is done by moving our
+    # listener to the first one in queue.
+    listeners = embedder._events[event]
+    moveLastToFirst listeners if Array.isArray listeners
   guest.once 'destroyed', ->
     embedder.removeListener event, destroy for event in destroyEvents


paymentchoice : add breadcrump

paymentchoice : add breadcrump

--- client/Main/payment/paymentchoiceform.coffee
+++ client/Main/payment/paymentchoiceform.coffee
@@ -21,6 +21,11 @@

   viewAppended: ->
     @addSubView new KDCustomHTMLView
+      tagName  : "h4"
+      cssClass : "pricing-title"
+      partial  : "
sign in - payment info - place order
"
+
+    @addSubView new KDCustomHTMLView
       tagName  : "h3"
       cssClass : "pricing-title"
       partial  : "Choose a payment method"


groups: refactor payment plan api subscribe callback as "Finished" event listener of `PaymentWorkflow`

--- client/Main/payment/paymentcontroller.coffee
+++ client/Main/payment/paymentcontroller.coffee
@@ -135,7 +135,26 @@
       .on 'DataCollected', (data) =>
         @transitionSubscription data, (err, subscription, rest...) ->
           return  if KD.showError err
-          workflow.emit 'Finished', data, subscription, rest...
+          workflow.emit 'Finished', data, err, subscription, rest...
+
+      .on 'Finished', (data, err, subscription, rest...) =>
+        { plan, email, createAccount, paymentMethod: {billing} } = data
+        if err?.short is 'existing_subscription'
+          { existingSubscription } = err
+          if existingSubscription.status is 'active'
+            new KDNotificationView title: "You are already subscribed to this plan!"
+            KD.getSingleton('router').handleRoute '/Account/Subscriptions'
+          else
+            existingSubscription.plan = plan
+            @confirmReactivation existingSubscription, (err, subscription) =>
+              return KD.showError err  if err
+              @emit "SubscriptionReactivated", subscription
+        else if createAccount
+          { cardFirstName: firstName, cardLastName: lastName } = billing
+          { JUser } = KD.remote.api
+          JUser.convert { firstName, lastName, email }, (err) ->
+            JUser.logout()
+
       .enter()

     workflow
@@ -159,8 +178,8 @@
           callback null, subscription

   createSubscription: (options, callback) ->
-    { plan, planOptions, promotionType, email, paymentMethod, createAccount } = options
-    { paymentMethodId, billing } = paymentMethod
+    { plan, planOptions, promotionType, paymentMethod } = options
+    { paymentMethodId } = paymentMethod
     { planApi } = planOptions

     throw new Error "Must provide a plan API!"  unless planApi?
@@ -172,31 +191,7 @@
       planCode: plan.planCode
     }

-    planApi.subscribe options, (err, subscription, rest...) =>
-      if err?.short is 'existing_subscription'
-        { existingSubscription } = err
-
-        if existingSubscription.status is 'active'
-          new KDNotificationView
-            title: "You are already subscribed to this plan!"
-          KD.getSingleton('router').handleRoute '/Account/Subscriptions'
-
-        else
-          existingSubscription.plan = plan
-          @confirmReactivation existingSubscription, callback
-
-      else if createAccount
-        { JUser } = KD.remote.api
-
-        { cardFirstName: firstName, cardLastName: lastName } = billing
-
-        JUser.convert { firstName, lastName, email }, (err) ->
-          return callback err  if err
-
-          JUser.logout (err) ->
-            callback err, subscription, rest...
-      else
-        callback err, subscription, rest...
+    planApi.subscribe options, callback

   transitionSubscription: (formData, callback) ->
     { productData, oldSubscription, promotionType, paymentMethod, createAccount, email } = formData


test: webserver: getProfile test initial commit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


reorganizes unit tests

reorganizes unit tests

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kevgo/ruby.js.git/'


Added tests

Added tests

error: pathspec 'tests/hubot-route53-tests.coffee' did not match any file(s) known to git

--- tests/hubot-route53-tests.coffee
+++ tests/hubot-route53-tests.coffee
@@ -0,0 +1,16 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'hubot-route53', ->
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+
+    require('../src/hubot-route53')(@robot)
+
+  it 'registers a respond listener', ->
+    expect(true).to.equal(true)


VM Create Disk panal closes on success

VM Create Disk panal closes on success

--- app/modules/vm/index.coffee
+++ app/modules/vm/index.coffee
@@ -674,7 +674,7 @@
         # console.log(params)
         return xoApi.call 'vm.attachDisk', params

-        .then -> $scope.creating = false # Closes form block
+        .then -> $scope.creatingVdi = false # Closes form block

         .catch (err) ->
         console.log(err);


Fix merge.

Fix merge.

--- resources/assets/coffee/react/profile-page.coffee
+++ resources/assets/coffee/react/profile-page.coffee
@@ -30,8 +30,6 @@
   withEdit: user.id == window.currentUser.id
   recentActivities: user.recentActivities.data
   recentlyReceivedKudosu: user.recentlyReceivedKudosu.data
-  favouriteBeatmapSets: user.favouriteBeatmapSets
-  rankedAndApprovedBeatmapSets: user.rankedAndApprovedBeatmapSets

 target = document.getElementsByClassName('js-content')[0]


Namespace "events", methods bind, unbind, delegate, undelegate, on, off…

error: pathspec 'source/quo.events.coffee' did not match any file(s) known to git

--- source/quo.events.coffee
+++ source/quo.events.coffee
@@ -0,0 +1,204 @@
+###
+Basic Quo Module
+
+@namespace Quo
+@class Events
+
+@author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
+###
+"use strict"
+
+do ($$ = Quo) ->
+
+  ELEMENT_ID = 1
+  HANDLERS = {}
+  EVENT_METHODS =
+    preventDefault          : "isDefaultPrevented"
+    stopImmediatePropagation: "isImmediatePropagationStopped"
+    stopPropagation         : "isPropagationStopped"
+  EVENTS_DESKTOP =
+    touchstart        : "mousedown"
+    touchmove         : "mousemove"
+    touchend          : "mouseup"
+    touch             : "click"
+    doubletap         : "dblclick"
+    orientationchange : "resize"
+
+  READY_EXPRESSION = /complete|loaded|interactive/
+
+  ###
+  Attach an event handler function for one or more events to a given instance element
+  @method on
+  @param  {string} One or more space-separated event types
+  @param  {string} A selector string to filter the descendants of the selected elements that trigger the event
+  @param  {function} A function to execute when the event is triggered
+  ###
+  $$.fn.on = (event, selector, callback) ->
+    if not selector? or $$.toType(selector) is "function"
+      @bind event, selector
+    else
+      @delegate selector, event, callback
+
+
+  ###
+  Remove an event handler.
+  @method off
+  @param  {string} One or more space-separated event types
+  @param  {string} [OPTIONAL] A selector string to filter the descendants of the selected elements that trigger the event
+  @param  {function} [OPTIONAL] A function to execute when the event is triggered
+  ###
+  $$.fn.off = (event, selector, callback) ->
+    if not selector? or $$.toType(selector) is "function"
+      @unbind event, selector
+    else
+      @undelegate selector, event, callback
+
+
+  ###
+  Specify a function to execute when the DOM is fully loaded.
+  @method ready
+  @param  {function} A function to execute after the DOM is ready.
+  ###
+  $$.fn.ready = (callback) ->
+    if READY_EXPRESSION.test(document.readyState)
+      callback.call @, $$
+    else
+      $$.fn.addEvent document, "DOMContentLoaded", -> callback.call @, $$
+
+
+  ###
+  Attach a handler to an event for the elements.
+  @method bind
+  @param  {string} One or more space-separated event types
+  @param  {function} A function to execute when the event is triggered
+  ###
+  $$.fn.bind = (event, callback) ->
+    @each -> _subscribe @, event, callback
+
+
+  ###
+  Remove a previously-attached event handler from the elements.
+  @method unbind
+  @param  {string} One or more space-separated event types
+  @param  {function} [OPTIONAL] A function to execute when the event is triggered
+  ###
+  $$.fn.unbind = (event, callback) ->
+    @each -> _unsubscribe @, event, callback
+
+
+  ###
+  Attach a handler to one or more events for all elements that match the selector
+  @method delegate
+  ###
+  $$.fn.delegate = (selector, event, callback) ->
+    @each (i, element) ->
+      _subscribe element, event, callback, selector, (fn) ->
+        (e) ->
+          match = $$(e.target).closest(selector, element).get(0)
+          if match
+            evt = $$.extend(_createProxy(e),
+              currentTarget: match
+              liveFired: element
+            )
+            fn.apply match, [ evt ].concat([].slice.call(arguments, 1))
+
+
+  ###
+  Remove a handler from the event for all elements which match the current selector
+  @method undelegate
+  ###
+  $$.fn.undelegate = (selector, event, callback) ->
+    @each -> _unsubscribe @, event, callback, selector
+
+
+  ###
+  Execute all handlers and behaviors attached to the matched elements for the given event type.
+  @method trigger
+  ###
+  $$.fn.trigger = (event, touch, originalEvent) ->
+    event = _event(event, touch) if $$.toType(event) is "string"
+    event.originalEvent = originalEvent if originalEvent?
+    @each -> @dispatchEvent event
+
+
+  $$.fn.addEvent = (element, event_name, callback) ->
+    if element.addEventListener
+      element.addEventListener event_name, callback, false
+    else if element.attachEvent
+      element.attachEvent "on" + event_name, callback
+    else
+      element["on" + event_name] = callback
+
+
+  $$.fn.removeEvent = (element, event_name, callback) ->
+    if element.removeEventListener
+      element.removeEventListener event_name, callback, false
+    else if element.detachEvent
+      element.detachEvent "on" + event_name, callback
+    else
+      element["on" + event_name] = null
+
+  # ---------------------------------------------------------------------------
+  # Private Methods
+  # ---------------------------------------------------------------------------
+  _event = (type, touch) ->
+    event = document.createEvent("Events")
+    event.initEvent type, true, true, null, null, null, null, null, null, null, null, null, null, null, null
+    if touch
+      event[property] = touch[property] for property of touch
+    event
+
+  _subscribe = (element, event, callback, selector, delegate_callback) ->
+      event = _environmentEvent(event)
+      element_id = _getElementId(element)
+      element_handlers = HANDLERS[element_id] or (HANDLERS[element_id] = [])
+      delegate = delegate_callback and delegate_callback(callback, event)
+      handler =
+          event: event
+          callback: callback
+          selector: selector
+          proxy: _createProxyCallback(delegate, callback, element)
+          delegate: delegate
+          index: element_handlers.length
+
+      element_handlers.push handler
+      $$.fn.addEvent element, handler.event, handler.proxy
+
+  _unsubscribe = (element, event, callback, selector) ->
+      event = _environmentEvent(event)
+      element_id = _getElementId(element)
+      _findHandlers(element_id, event, callback, selector).forEach (handler) ->
+          delete HANDLERS[element_id][handler.index]
+
+          $$.fn.removeEvent element, handler.event, handler.proxy
+
+  _getElementId = (element) -> element._id or (element._id = ELEMENT_ID++)
+
+  _environmentEvent = (event) ->
+      environment_event = (if ($$.isMobile()) then event else EVENTS_DESKTOP[event])
+      (environment_event) or event
+
+  _createProxyCallback = (delegate, callback, element) ->
+      callback = delegate or callback
+      proxy = (event) ->
+          result = callback.apply(element, [ event ].concat(event.data))
+          event.preventDefault() if result is false
+          result
+      proxy
+
+  _findHandlers = (element_id, event, fn, selector) ->
+      (HANDLERS[element_id] or []).filter (handler) ->
+          handler and (not event or handler.event is event) and (not fn or handler.callback is fn) and (not selector or handler.selector is selector)
+
+  _createProxy = (event) ->
+      proxy = $$.extend( originalEvent: event, event)
+      $$.each EVENT_METHODS, (name, method) ->
+          proxy[name] = ->
+              @[method] = ->
+                  true
+
+              event[name].apply event, arguments
+
+          proxy[method] = ->
+              false
+      proxy


Add commander version download

Add commander version download

error: pathspec 'src/lib/command.coffee' did not match any file(s) known to git

--- src/lib/command.coffee
+++ src/lib/command.coffee
@@ -0,0 +1,78 @@
+fs = require 'fs'
+path = require 'path'
+Manager = require('./gas-manager').Manager
+program = require 'commander'
+
+
+loadConfig = (program)->
+  if !fs.existsSync program.config
+    throw new Error "#{program.config} not exist, it's given."
+
+  config = require path.resolve program.config
+
+  throw new Error "config file should set client_id" if !config.client_id
+  throw new Error "config file should set client_secret" if !config.client_secret
+  throw new Error "config file should set refresh_token" if !config.refresh_token
+  return config
+
+download = (options)->
+  config = loadConfig(program)
+  manager = new Manager(config)
+  fileId = program.fileId || config.fileId
+
+  if !fileId
+    throw new Error "download option is given fileId in config file or -id {id}"
+
+  manager.getProject(fileId, (err, project)->
+    throw new Error "fail get project" , err
+    for file in project.getFiles()
+
+      if file.type == "server_js"
+        ext = ".js"
+      else
+        ext = ".html"
+
+      if fileId != config.fileId
+        filepath = path.resolve(options.path, file.name + ext)
+      else
+        filepath = config.src[file.name]?.path || path.resolve(options.path, file.name + ext)
+
+      outPath = path.resolve(filepath)
+
+      if !fs.existsSync path.dirname(outPath)
+        fs.mkdirSync path.dirname(outPath)
+
+      do(outPath=outPath)->
+        fs.writeFile outPath, file.source, (err)->
+          return console.error err if err
+  )
+
+upload = (options)->
+  config = loadConfig(program)
+  manager = new Manager(config)
+  fileId = program.fileId || config.fileId
+
+  if !fileId
+    throw new Error "upload command is given fileId in config file or -id {id}"
+
+
+
+program
+  .version('0.2.0')
+  .option('-f, --fileId [fileId]', "target gas project fileId")
+  .option('-c, --config [path]', "config file path", "./gas-config.json")
+
+program
+  .command("download")
+  .description("download google apps script file")
+  .option('-p, --path <path>' , "download base path")
+  .action(download)
+
+program
+  .command("upload")
+  .description("upload google apps script file")
+  .option('-p, --path [path]' ,"upload file dir. if set -s option, it will be overrided.")
+  .option('-s, --sources [pathes ...]', "upload sources, if set it, -p option is overrided.")
+  .action(upload)
+
+program.parse(process.argv)


New script for prelude defs generation

New script for prelude defs generation

error: pathspec 'src/makeprelude.coffee' did not match any file(s) known to git

--- src/makeprelude.coffee
+++ src/makeprelude.coffee
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+CP = require 'child_process'
+fs = require 'fs'
+
+genp = CP.execSync("ghc-mod browse -dp Prelude", encoding: 'utf8').split(/\r?\n|\r/).slice(0, -1)
+
+arr = (input) ->
+  lines =
+    input.map (line) ->
+      line.split(/ :: /)[0] or line
+  return lines
+
+run = (filter) ->
+  if typeof filter isnt "function"
+    rx = filter
+    filter = (line) -> line.match(rx)
+  p = arr(genp.filter filter)
+  return p
+
+exp = {}
+
+exp.classes = run /class/
+exp.funct = run /^[a-z]/
+exp.constr = run /^[A-Z].*from:/
+exp.types = run /data|type/
+
+exp.types.push (run (line) ->
+  line.match(/^[A-Z]/) and not line.match(/::/) and not line.match(/True|False/))...
+exp.constr.push 'True', 'False'
+
+output = []
+for k, v of exp
+  output.push "#{k} = #{JSON.stringify(v)}"
+output.push "module.exports = { #{Object.keys(exp)} }"
+
+fs.writeFileSync 'src/prelude.coffee', output.join('\n'), 'utf8'


remove callback after reboot and update stack


Admins should see Metaphysics backed pages

--- components/split_test/running_tests.coffee
+++ components/split_test/running_tests.coffee
@@ -31,6 +31,7 @@

   show_metaphysics:
     key: 'show_page_metaphysics'
+    edge: true
     outcomes:
       true: 0.5
       false: 0.5


Don't add listener if an error was encountered

--- lib/utils/retsParsing.coffee
+++ lib/utils/retsParsing.coffee
@@ -98,7 +98,9 @@
     if name != 'RETS'
       return fail(new errors.RetsProcessingError(retsMethod, 'Unexpected results. Please check the RETS URL.', headers))
     processStatus(attrs)
-
+    if !retsStream.writable
+      # assume processStatus found a non-zero/20208 error code and ended the stream  So, we don't want to add the startElement listener.
+      return
     parser.on 'startElement', (name, attrs) ->
       currElementName = name
       switch name


I forgot to commit tests for 455e758

I forgot to commit tests for 455e758

error: pathspec 'tests/unit/utils/status-image-formats-test.coffee' did not match any file(s) known to git

--- tests/unit/utils/status-image-formats-test.coffee
+++ tests/unit/utils/status-image-formats-test.coffee
@@ -0,0 +1,13 @@
+`import Ember from 'ember'`
+`import format from 'travis/utils/status-image-formats'`
+`import config from 'travis/config/environment'`
+
+module 'Status image formats'
+
+test 'it generates CCTray url with a slug', ->
+  url = format('CCTray', 'travis-ci/travis-web')
+  equal url, '#/repos/travis-ci/travis-web/cc.xml'
+
+test 'it generates CCTray url with a slug and a branch', ->
+  url = format('CCTray', 'travis-ci/travis-web', 'development')
+  equal url, '#/repos/travis-ci/travis-web/cc.xml?branch=development'


failing MachineView tests

failing MachineView tests

error: pathspec 'spec/javascripts/machine_view_spec.coffee' did not match any file(s) known to git

--- spec/javascripts/machine_view_spec.coffee
+++ spec/javascripts/machine_view_spec.coffee
@@ -0,0 +1,13 @@
+require '/json2.js'
+require '/jquery-1.4.4.min.js'
+require '/underscore-min.js'
+require '/backbone-min.js'
+require '/application.js'
+
+describe 'MachineView', ->
+  it 'should live on window', ->
+    expect(window.MachineView).toBeDefined()
+  it 'should create a new Machine when started', ->
+    spyOn window, 'Machine'
+    window.MachineView.start()
+    expect(window.Machine).toHaveBeenCalled()


Gosh darn it, we're going to try and move to coffeescript.  Less key-strokes FTW.

error: pathspec 'ehriportal/static/js/repository_map.coffee' did not match any file(s) known to git

--- ehriportal/static/js/repository_map.coffee
+++ ehriportal/static/js/repository_map.coffee
@@ -0,0 +1,130 @@
+#
+# Coffeescript attempt
+#
+
+initialize = ->
+  ele = document.getElementById("map_canvas")
+  $(ele).height $(window).height() - $(ele).position().top - 10
+  myOptions =
+    center: new google.maps.LatLng(56, 24)
+    zoom: 4
+    mapTypeId: google.maps.MapTypeId.ROADMAP
+  new google.maps.Map(ele, myOptions)
+
+getParameterByName = (url, name) ->
+  name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]")
+  regexS = "[\\?&]" + name + "=([^&#]*)"
+  regex = new RegExp(regexS)
+  results = regex.exec(url)
+  unless results?
+    ""
+  else
+    decodeURIComponent results[1].replace(/\+/g, " ")
+
+setSearchData = (data, clear) ->
+  console.log "" + data.object_list.length + " Results"
+  clearSearchData()  if clear
+
+clearSearchData = ->
+    #$.each gmarkers, (i, m) ->
+        #m.setMap null
+  m.setMap null for m in gmarkers
+  $("#result-list").html ""
+
+search = (query, type, page) ->
+  $.ajax
+    url: window.location.pathname
+    data:
+      q: query
+      type: type
+      format: "json"
+      page: page
+
+    dataType: "json"
+    error: ->
+      console.error arguments
+
+    success: (data) ->
+      result.setFromData data
+
+fitBoundsWithMinimumZoom = (map, bounds, minzoom=10) ->
+  zc = google.maps.event.addListener(gmap, "zoom_changed", ->
+    bc = google.maps.event.addListener(gmap, "bounds_changed", (event) ->
+      @setZoom minzoom  if @getZoom() > minzoom
+      google.maps.event.removeListener bc
+    )
+  )
+  map.fitBounds bounds
+  google.maps.event.removeListener zc
+
+Repository = Backbone.Model.extend({})
+
+SearchResult = Backbone.Model.extend(
+  defaults:
+    has_other_pages: false
+    has_previous: false
+    has_next: false
+    page: 1
+    total: 0
+    object_list: []
+
+  setFromData: (data) ->
+    @set
+      page: data.page
+      total: data.total
+      has_next: data.has_next
+      has_previous: data.has_previous
+      has_other_pages: data.has_other_pages
+      object_list: data.object_list
+)
+
+SearchListView = Backbone.View.extend(
+  initialize: ->
+    @model.bind "change", @render, this
+
+  _renderObject: (repo) ->
+    url = dutils.urls.resolve("repo_detail",
+      slug: repo.slug
+    )
+    $("#result-list").append "
" + repo.name + "
"
+    gmarkers.push new google.maps.Marker(
+      position: new google.maps.LatLng(repo.location[1], repo.location[0])
+      map: gmap
+      title: repo.name
+      data: repo
+    )
+
+  render: ->
+    list = (repo for repo in @model.get("object_list") when repo.location?)
+    clearSearchData()  unless @model.get "has_previous"
+    @_renderObject repo for repo in list
+    console.log "List", list
+    if list.length
+      bounds = new google.maps.LatLngBounds()
+      bounds.extend m.position for m in gmarkers
+      fitBoundsWithMinimumZoom gmap, bounds
+)
+
+gmap = undefined
+gmarkers = []
+result = undefined
+listview = undefined
+
+jQuery ->
+  gmap = initialize()
+  result = new SearchResult()
+  listview = new SearchListView(model: result)
+
+  window.onpopstate = (event) ->
+    $("#id_q").val getParameterByName window.location.search, "q"
+    $("#search-form").submit()
+
+  $("#search-form").submit (event) ->
+    val = $("#id_q").val()
+    type = $("#id_type").val()
+    window.history.pushState
+      q: val
+    , window.title, window.location.pathname + "?" + $(this).serialize()
+    search val, type
+    event.preventDefault()
+


init rep structure

init rep structure

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/abdelrahmanahmed/code-tuts.git/'


Finish switch role for classroom management.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/picoCTF/picoCTF-web.git/'


Adding favicon

Adding favicon

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Fix bugs and run scheduler at 8AM Phoenix time


Add game class

Add game class

error: pathspec 'public/javascripts/game.photography.coffee' did not match any file(s) known to git

--- public/javascripts/game.photography.coffee
+++ public/javascripts/game.photography.coffee
@@ -0,0 +1,6 @@
+jQuery(document).ready ->
+  class photographyGame
+    constructor: (@debug, @map) ->
+
+    init: () ->
+  return


ensure the experiment viewed fires when the first row of entry points are visible

--- src/desktop/apps/home/client/index.coffee
+++ src/desktop/apps/home/client/index.coffee
@@ -37,7 +37,7 @@
     ,
     {
       triggerOnce: true,
-      offset: 75,
+      offset: 500,
     }
     )


Slowly converting to AMD

Slowly converting to AMD

error: pathspec 'src/core/index.coffee' did not match any file(s) known to git

--- src/core/index.coffee
+++ src/core/index.coffee
@@ -0,0 +1 @@
+define('elyssa', [], -> unless (module?.exports) then window.Elyssa = {})


Add libagda.coffee the JS counterpart of FFI/JS.agda

error: pathspec 'libagda.coffee' did not match any file(s) known to git

--- libagda.coffee
+++ libagda.coffee
@@ -0,0 +1,94 @@
+define ["exports","proc"], (libagda,libproc) ->
+
+  fst = (x) -> x["proj₁"]
+  snd = (x) -> x["proj₂"]
+
+  id = (x) -> x
+  libagda.id = id
+
+  foldrArray = (a, nil, cons) ->
+    len = a.length
+    l = nil
+    i = len - 1
+    while i >= 0
+      l = cons i, a[i], l
+      i--
+    l
+  libagda.foldrArray = foldrArray
+
+  fromList = (l0, fromElt) ->
+    a = []
+    i = 0
+    go = (l) ->
+      l
+        "[]":  () -> { }
+        "_∷_": (x, xs) ->
+                  a[i] = fromElt x
+                  i++
+                  go xs
+    go l0
+    Object.freeze a
+  libagda.fromList = fromList
+
+  objectFromList = (l0, key, val) ->
+    o = {}
+    go = (l) ->
+      l
+        "[]":  () -> { }
+        "_∷_": (x, xs) ->
+                o[key x] = val x
+                go xs
+    go l0
+    Object.freeze o
+  libagda.objectFromList = objectFromList
+
+  fromValue = (v) ->
+    v
+      array:  (l) -> fromList l, fromValue
+      object: (l) -> objectFromList l, fst, ((x) -> fromValue snd x)
+      string: id
+      number: id
+      bool:   id
+      null:   () -> null
+  libagda.fromValue = fromValue
+
+  libagda.readProp = (x) -> (y) -> x[y]
+
+  tt   = (x) -> x.record()
+  nil  = (l) -> l["[]"]()
+  cons = (x, xs) -> (l) -> l["_∷_"](x, xs)
+  libagda.tt = tt
+  libagda.nil = nil
+  libagda.cons = cons
+
+  libagda.onString = (f) -> (x) ->
+    if typeof x is "string"
+      f x
+    else
+      throw "onString(): not a string"
+
+  fromJSArray = (a) -> (f) -> foldrArray a, nil, (i,x,xs) -> cons ((f i) x), xs
+  libagda.fromJSArray = fromJSArray
+
+  fromJSArrayString = (a) -> (fromJSArray a) ((i) -> (x) -> String(x))
+  libagda.fromJSArrayString = fromJSArrayString
+
+  libagda.trace = (_A) -> (_B) -> (s) -> (a) -> (f) ->
+    console.log "trace: #{s}#{a}";
+    f a
+
+  runJSCmd = (x) ->
+    x
+      server:      (ip, port, proc, cb) ->
+                    libproc.server ip, port, proc, (uri) ->
+                      runJSCmd cb uri
+      client:      (proc, cb) -> libproc.client proc, () -> runJSCmd cb
+      end:         () -> { }
+      assert:      (b, cb) ->
+                      throw "assert false" unless b
+                      runJSCmd cb
+      console_log: (s, cb) -> console.log s; runJSCmd cb
+      process_argv: (cb) -> runJSCmd cb fromJSArrayString process.argv
+  libagda.runJSCmd = runJSCmd
+
+  return libagda


trigger commands from the browser process on the active.element

--- src/window-event-handler.coffee
+++ src/window-event-handler.coffee
@@ -9,7 +9,7 @@
 class WindowEventHandler
   constructor: ->
     @subscribe ipc, 'command', (command, args...) ->
-      $(window).trigger(command, args...)
+      $(document.activeElement).trigger(command, args...)

     @subscribe $(window), 'focus', -> $("body").removeClass('is-blurred')
     @subscribe $(window), 'blur',  -> $("body").addClass('is-blurred')


rails_apps_composer: add analytics

rails_apps_composer: add analytics

error: pathspec 'app/assets/javascripts/google_analytics.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/google_analytics.js.coffee
+++ app/assets/javascripts/google_analytics.js.coffee
@@ -0,0 +1,44 @@
+# thanks to Jonathon Wolfe at http://reed.github.io/turbolinks-compatibility/google_analytics.html
+
+class @GoogleAnalytics
+
+  @load: ->
+    # Google Analytics depends on a global _gaq array. window is the global scope.
+    window._gaq = []
+    window._gaq.push ["_setAccount", GoogleAnalytics.analyticsId()]
+
+    # Create a script element and insert it in the DOM
+    ga = document.createElement("script")
+    ga.type = "text/javascript"
+    ga.async = true
+    ga.src = ((if "https:" is document.location.protocol then "https://ssl" else "http://www")) + ".google-analytics.com/ga.js"
+    firstScript = document.getElementsByTagName("script")[0]
+    firstScript.parentNode.insertBefore ga, firstScript
+
+    # If Turbolinks is supported, set up a callback to track pageviews on page:change.
+    # If it isn't supported, just track the pageview now.
+    if typeof Turbolinks isnt 'undefined' and Turbolinks.supported
+      document.addEventListener "page:change", (->
+        GoogleAnalytics.trackPageview()
+      ), true
+    else
+      GoogleAnalytics.trackPageview()
+
+  @trackPageview: (url) ->
+    unless GoogleAnalytics.isLocalRequest()
+      if url
+        window._gaq.push ["_trackPageview", url]
+      else
+        window._gaq.push ["_trackPageview"]
+      window._gaq.push ["_trackPageLoadTime"]
+
+  @isLocalRequest: ->
+    GoogleAnalytics.documentDomainIncludes "local"
+
+  @documentDomainIncludes: (str) ->
+    document.domain.indexOf(str) isnt -1
+
+  @analyticsId: ->
+    ''
+
+GoogleAnalytics.load()


For some reason this didn't allow pasting in the WYSIWYG

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/biola/announcement-publisher.git/'


Begin integrating WorkflowExecutionHistoryGenerator

--- lib/WorkflowExecutionHistoryGenerator.coffee
+++ lib/WorkflowExecutionHistoryGenerator.coffee
@@ -1,6 +1,19 @@
+_ = require "underscore"
+camelize = require "underscore.string/camelize"
+
 class WorkflowExecutionHistoryGenerator
-  linearize: (tree) ->
-
+  constructor: (options) ->
+    _.extend @, options
+    _.defaults @,
+      tree: {}
+  init: (initializer) ->
+    @tree = initializer.call(@)
+    Match.check @tree, [Object]
+  histories: ->
+    for branch of @tree
+      @linearize(branch)
+  linearize: ->
+    []
   attributes: (eventType) ->
   Event: (event) ->
     attributes = event.attributes
@@ -18,4 +31,99 @@
       eventType: "WorkflowExecutionStarted"
       attributes: attributes

-module.exports = WorkflowExecutionHistoryGenerator+module.exports = WorkflowExecutionHistoryGenerator
+
+Event = (eventType, eventAttributes) ->
+  attributes = camelize(eventType, true) + "EventAttributes"
+  eventType: eventType
+  "#{attributes}": eventAttributes
+
+WorkflowExecutionStarted = -> Event "WorkflowExecutionStarted",
+  input: JSON.stringify
+    "FreshdeskDownloadUsers":
+      avatarId: "D6vpAkoHyBXPadp4c"
+      params: {}
+    "3DCartDownloadOrders":
+      avatarId: "T7JwArn9vCJLiKXbn"
+      baseUrl: "http://store.bellefit.com"
+      params: {}
+    "BellefitGenerate3DCartOrdersByFreshdeskUserIdCollection":
+      avatarIds:
+        "Freshdesk": "D6vpAkoHyBXPadp4c"
+        "3DCart": "T7JwArn9vCJLiKXbn"
+
+ActivityTaskCompleted = (activityId) -> Event "ActivityTaskCompleted",
+  activityId: activityId
+
+ActivityTaskScheduled = (activityId) -> Event "ActivityTaskScheduled",
+  activityId: activityId
+
+tests =
+  "start":
+    events: [
+      WorkflowExecutionStarted()
+    ]
+    decisions: [
+      decisionType: "ScheduleActivityTask"
+      scheduleActivityTaskDecisionAttributes:
+        activityType:
+          name: "FreshdeskDownloadUsers"
+          version: "1.0.0"
+        activityId: "FreshdeskDownloadUsers"
+        input: JSON.stringify
+          avatarId: "D6vpAkoHyBXPadp4c"
+          params: {}
+        ,
+          decisionType: "ScheduleActivityTask"
+          scheduleActivityTaskDecisionAttributes:
+            activityType:
+              name: "3DCartDownloadOrders"
+              version: "1.0.0"
+            activityId: "3DCartDownloadOrders"
+            input: JSON.stringify
+              avatarId: "T7JwArn9vCJLiKXbn"
+              baseUrl: "http://store.bellefit.com"
+              params: {}
+    ]
+  "FreshdeskDownloadUsersComplete":
+    events: [
+      WorkflowExecutionStarted()
+      ActivityTaskScheduled("FreshdeskDownloadUsers")
+      ActivityTaskCompleted("FreshdeskDownloadUsers")
+    ]
+    decisions: []
+  "3DCartDownloadOrdersComplete":
+    events: [
+      WorkflowExecutionStarted()
+      ActivityTaskScheduled("FreshdeskDownloadUsers")
+      ActivityTaskCompleted("FreshdeskDownloadUsers")
+      ActivityTaskScheduled("3DCartDownloadOrders")
+      ActivityTaskCompleted("3DCartDownloadOrders")
+    ]
+    decisions: [
+      decisionType: "ScheduleActivityTask"
+      scheduleActivityTaskDecisionAttributes:
+        activityType:
+          name: "BellefitGenerate3DCartOrdersByFreshdeskUserIdCollection"
+          version: "1.0.0"
+        activityId: "BellefitGenerate3DCartOrdersByFreshdeskUserIdCollection"
+        input: JSON.stringify
+          avatarIds:
+            "Freshdesk": "D6vpAkoHyBXPadp4c"
+            "3DCart": "T7JwArn9vCJLiKXbn"
+    ]
+  "BellefitGenerate3DCartOrdersByFreshdeskUserIdCollectionComplete":
+    events: [
+      WorkflowExecutionStarted()
+      ActivityTaskScheduled("FreshdeskDownloadUsers")
+      ActivityTaskCompleted("FreshdeskDownloadUsers")
+      ActivityTaskScheduled("3DCartDownloadOrders")
+      ActivityTaskCompleted("3DCartDownloadOrders")
+      ActivityTaskScheduled("BellefitGenerate3DCartOrdersByFreshdeskUserIdCollection")
+      ActivityTaskCompleted("BellefitGenerate3DCartOrdersByFreshdeskUserIdCollection")
+    ]
+    decisions: [
+      decisionType: "CompleteWorkflowExecution"
+      completeWorkflowExecutionDecisionAttributes:
+        result: JSON.stringify {success: true}
+    ]


Fix spec

Fix spec

--- spec/text-editor-presenter-spec.coffee
+++ spec/text-editor-presenter-spec.coffee
@@ -330,7 +330,7 @@

       it "honors the 'onlyNonEmpty' option on line decorations", ->
         presenter = new TextEditorPresenter(model: editor, clientHeight: 130, scrollTop: 0, lineHeight: 10, lineOverdrawMargin: 0)
-        marker = editor.markBufferRange([[4, 0], [6, 1]])
+        marker = editor.markBufferRange([[4, 0], [6, 2]])
         decoration = editor.decorateMarker(marker, type: 'line', class: 'a', onlyNonEmpty: true)

         expect(lineStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a']


#1643: Updated tests

#1643: Updated tests

--- test/assignment.coffee
+++ test/assignment.coffee
@@ -309,14 +309,25 @@

 test "#1643: splatted accesses in destructuring assignments should not be declared as variables", ->
   nonce = {}
-  accesses = ['o.a', 'C::a', 'C::', 'o["a"]', '(o.a)', 'f().a', '(o.a).a', '@o.a', 'o?.a', 'f?().a']
+  accesses = ['o.a', 'o["a"]', '(o.a)', '(o.a).a', '@o.a', 'C::a', 'C::', 'f().a', 'o?.a', 'o?.a.b', 'f?().a']
   for access in accesses
-    code =
-    """
-    nonce = {}; @o = o = new (class C then a:{}); f = -> o
-    [#{access}...] = [nonce]
-    unless #{access}[0] is nonce then throw 'error'
-    """
-    eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce
-
-
+    for i,j in [1,2,3] #position can matter
+      code =
+      """
+      nonce = {}; nonce2 = {}; nonce3 = {};
+      @o = o = new (class C then a:{}); f = -> o
+      [#{new Array(i).join('x,')}#{access}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]
+      unless #{access}[0] is nonce and #{access}[1] is nonce2 and #{access}[2] is nonce3 then throw new Error('[...]')
+      """
+      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce
+  # subpatterns like `[[a]...]` and `[{a}...]`
+  subpatterns = ['[sub, sub2, sub3]', '{0: sub, 1: sub2, 2: sub3}']
+  for subpattern in subpatterns
+    for i,j in [1,2,3]
+      code =
+      """
+      nonce = {}; nonce2 = {}; nonce3 = {};
+      [#{new Array(i).join('x,')}#{subpattern}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]
+      unless sub is nonce and sub2 is nonce2 and sub3 is nonce3 then throw new Error('[sub...]')
+      """
+      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce


add attributes test

add attributes test

error: pathspec 'test/attributes.coffee' did not match any file(s) known to git

--- test/attributes.coffee
+++ test/attributes.coffee
@@ -0,0 +1,7 @@
+cc = require '../lib/coffeecup'
+
+describe 'Attributes', ->
+  describe "a href: '/', title: 'Home'", ->
+    it 'should render ', ->
+      a = -> a href: '/', title: 'Home'
+      cc.render(a).should.equal ''


bug fix

bug fix


Updated pretty_price/currency filters to call their integer counterparts rather than duplicating the same code.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Bogdan-p/bookingbug-angular.git/'


fixing derpy log reference

fixing derpy log reference

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Qbuer/groovebasin.git/'


fix tspan empty return value bug

fix tspan empty return value bug

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/companytools/ember-cli-dunlop.git/'


edit profile

edit profile

error: pathspec 'client/profileEdit.coffee' did not match any file(s) known to git

--- client/profileEdit.coffee
+++ client/profileEdit.coffee
@@ -0,0 +1,48 @@
+pendingEdits = null
+editTimer = null
+state = 'clear'
+
+queueEdits = (fields) ->
+    if editTimer?
+        Meteor.clearTimeout editTimer
+    pendingEdits ?= {}
+    for field, value of fields
+        pendingEdits[field] = value
+    if state is 'clear'
+        editTimer = Meteor.setTimeout saveEdits, 1000
+
+saveEdits = ->
+    editTimer = null
+    return unless state is 'clear'
+    state = 'saving'
+    edits = _.clone pendingEdits
+    pendingEdits = null
+    Meteor.users.update Meteor.userId(), $set: edits, (error) ->
+        if error?
+            state = 'error'
+            IonPopup.alert
+                title: 'Unable to save'
+                template: error.reason
+                okText: 'Oh bummer…'
+                onOk: -> state = 'clear'
+        else
+            state = 'clear'
+            if pendingEdits?
+                editTimer = Meteor.setTimeout saveEdits, 1000
+
+Template.profileEdit.helpers
+    firstEmail: ->
+        @emails[0]?.address ? 'unset'
+
+Template.profileEdit.events
+    'keyup #profile-edit-name, input #profile-edit-name': (event) ->
+        queueEdits 'profile.name': event.currentTarget.value
+
+    'keyup #profile-edit-username, input #profile-edit-username': (event) ->
+        queueEdits 'username': event.currentTarget.value
+
+    'change #profile-edit-show-usernames': (event) ->
+        queueEdits 'profile.showUsernames': event.currentTarget.checked
+
+Template.profileEdit.onRendered ->
+    @$('#profile-edit-name').select()


Work on belongs to - accept id

Work on belongs to - accept id

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/MicrosmartSA/ubiquity-ui.git/'


rails_apps_composer: add analytics

rails_apps_composer: add analytics


Add back skipAddToInvoice in favour of deprecation note.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/laterpay/laterpay-client-node.git/'


Use parseAlias to parse vm-prefix in much safer way.

--- client/app/MainApp/VirtualizationController.coffee
+++ client/app/MainApp/VirtualizationController.coffee
@@ -69,18 +69,18 @@
         if vmInfo
           if vmInfo.planCode is 'free'

-            # returns "vm-2" from "vm-2.arslan.koding.kd.io"
-            vmNumber = vmInfo.hostnameAlias.split(".", 1)[0]
+            {hostnameAlias} = vmInfo
+            vmPrefix = (@parseAlias hostnameAlias)?.prefix or hostnameAlias

             modal = new VmDangerModalView
               name     : vmInfo.hostnameAlias
-              title    : "Destroy '#{vmInfo.hostnameAlias}'"
+              title    : "Destroy '#{hostnameAlias}'"
               action   : 'Destroy my VM'
               callback : (callback) =>
                 deleteVM vm, callback
                 new KDNotificationView title:'Successfully destroyed!'
                 modal.destroy()
-            , vmNumber
+            , vmPrefix
           else
             paymentController = KD.getSingleton('paymentController')
             paymentController.deleteVM vmInfo, (state)->


virtualization controller: remove stateful "dialogIsOpen" flag

This is handled in a better way by "Form Workflow"

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


fix(new-component): force tde-exporter to create config manualy

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-wrapper.git/'


Remove duplicate call

Remove duplicate call

--- SingularityUI/app/collections/TasksScheduled.coffee
+++ SingularityUI/app/collections/TasksScheduled.coffee
@@ -13,7 +13,6 @@
             task.nextRunAt = task.pendingTaskId.nextRunAt
             task.nextRunAtHuman = moment(task.nextRunAt).fromNow()
             task.schedule = task.request.schedule
-            task.JSONString = utils.stringJSON task
             tasks[i] = task
             app.allTasks[task.id] = task


Show declaration for module hint

Show declaration for module hint

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nathan/lemma.git/'


All things shown as drawers need to be preloaded

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/kitchensink.git/'


Main player code cleanup WIP.

Main player code cleanup WIP.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/OnCircle/gbox-video-player.git/'


Constrain comments to viewport.

Constrain comments to viewport.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


parse date fields

parse date fields

--- src/travis/session.coffee
+++ src/travis/session.coffee
@@ -48,6 +48,12 @@
     store = store[indexKey]        ?= {}
     store[index]                   ?= { data: {}, complete: false }

+  _parseField: (fieldName, fieldValue) ->
+    if /_at$/.test(fieldName) and fieldValue?
+      new Date Date.parse(fieldValue)
+    else
+      fieldValue
+
   entity: (entityType, data, complete = false) ->
     entityType          = Travis.Entities[entityType] if typeof(entityType) == 'string'
     entity              = null
@@ -56,7 +62,7 @@
         entity         ?= @_entity(entityType, indexKey, index)
         store           = @_entityData(entityType, indexKey, index)
         store.complete  = true if complete
-        store.data[key] = value for key, value of data
+        store.data[key] = @_parseField(key, value) for key, value of data
     entity

   session: (options) ->


Workspace: Implemented header style customisations.

--- client/app/CommonViews/workspace/panel/panel.coffee
+++ client/app/CommonViews/workspace/panel/panel.coffee
@@ -22,9 +22,16 @@
     @createLayout()

   createHeader: (title = "") ->
-    @header     = new KDView
-      cssClass  : "inner-header"
-      partial   : """#{title}"""
+    @header        = new KDView cssClass : "inner-header"
+    @headerTitle   = new KDCustomHTMLView
+      tagName      : "span"
+      cssClass     : "title"
+      partial      : title
+
+    @header.addSubView @headerTitle
+
+    {headerStyling} = @getOptions()
+    @applyHeaderStyling headerStyling if headerStyling

   createHeaderButtons: ->
     # TODO: fatihacet - DRY
@@ -116,6 +123,18 @@
           cssClass : "modal-cancel"
           callback : -> modal.destroy()

+  applyHeaderStyling: (options) ->
+    {bgColor, bgGradient, bgImage, textColor, textShadowColor, borderColor} = options
+
+    @header.setCss      "color"             , textColor                        if textColor
+    @header.setCss      "textShadowColor"   , "1px 1px 1px #{textShadowColor}" if textShadowColor
+    @header.setCss      "borderBottomColor" , "#{borderColor}"                 if borderColor
+    @header.setCss      "background"        , "#{bgColor}"                     if bgColor
+    @headerTitle.setCss "backgroundImage"   , "url(#{bgImage})"                if bgImage
+
+    if bgGradient
+      KD.utils.applyGradient @header, bgGradient.first, bgGradient.last
+
   viewAppended: ->
     super
     @getDelegate().emit "NewPanelAdded", this


sidebar: assign default height and width for avatar

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

--- client/app/lib/sidebar/components/widgetuser.coffee
+++ client/app/lib/sidebar/components/widgetuser.coffee
@@ -5,7 +5,7 @@

 module.exports = SidebarWidgetUser = ({ size = {}, owner }) ->

-  { width, height } = size
+  { width = 36, height = 36 } = size

   <div className='SidebarWidget-UserView'>
     <ProfileLinkContainer origin={owner}>


Quote HTML

Quote HTML

error: pathspec 'src/tools/html.coffee' did not match any file(s) known to git


added scroll shadow back to activity list

--- client/landing/app/Applications/Activity.kdapplication/activitylistcontroller.coffee
+++ client/landing/app/Applications/Activity.kdapplication/activitylistcontroller.coffee
@@ -41,6 +41,12 @@
     data = @getData()
     mainView.addSubView @activityHeader = new ActivityListHeader
       cssClass : 'activityhead clearfix'
+
+    @scrollView.on 'scroll', (event) =>
+      if event.delegateTarget.scrollTop > 10
+        @activityHeader.setClass "scrolling-up-outset"
+      else
+        @activityHeader.unsetClass "scrolling-up-outset"

     @activityHeader.on "UnhideHiddenNewItems", =>
       firstHiddenItem = @getListView().$('.hidden-item').eq(0)


use proper logging

use proper logging

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VoiSmart/Rocket.Chat.git/'


Reference res.locals.sd

Reference res.locals.sd

--- apps/articles/routes.coffee
+++ apps/articles/routes.coffee
@@ -44,7 +44,7 @@
         return res.redirect "/article/#{data.article.get 'slug'}"
       res.locals.sd.SLIDESHOW_ARTWORKS = data.slideshowArtworks?.toJSON()
       res.locals.sd.ARTICLE = data.article.toJSON()
-      res.locals.sd.INCLUDE_SAILTHRU = sd.ARTICLE && sd.ARTICLE.published
+      res.locals.sd.INCLUDE_SAILTHRU = res.locals.sd.ARTICLE && res.locals.sd.ARTICLE.published
       res.locals.sd.FOOTER_ARTICLES = data.footerArticles.toJSON()
       res.locals.sd.RELATED_ARTICLES = data.relatedArticles?.toJSON()
       res.locals.sd.SUPER_SUB_ARTICLE_IDS = data.superSubArticleIds


Fix nav rel link spec

Fix nav rel link spec

--- apps/artist/test/nav.coffee
+++ apps/artist/test/nav.coffee
@@ -9,7 +9,7 @@
   describe '#sections', ->
     it 'generates the sections of the nav based on the passed in statuses', ->
       _.pluck(@nav.sections(), 'name').should.eql [
-        'Overview', 'Works', 'Articles', 'Shows', 'Related Artists'
+        'Overview', 'Works', 'Articles', 'Shows', 'Auction Results', 'Related Artists'
       ]

     it 'evaluates the href given the artist id', ->
@@ -18,6 +18,7 @@
         '/artist/jeff-koons-1/works'
         '/artist/jeff-koons-1/articles'
         '/artist/jeff-koons-1/shows'
+        '/artist/jeff-koons-1/auction-results'
         '/artist/jeff-koons-1/related-artists'
       ]

@@ -46,8 +47,12 @@

       { next, prev } = @nav.rels('/artist/jeff-koons-1/shows')
       prev.href.should.equal '/artist/jeff-koons-1/articles'
+      next.href.should.equal '/artist/jeff-koons-1/auction-results'
+
+      { next, prev } = @nav.rels('/artist/jeff-koons-1/auction-results')
+      prev.href.should.equal '/artist/jeff-koons-1/shows'
       next.href.should.equal '/artist/jeff-koons-1/related-artists'

       { next, prev } = @nav.rels('/artist/jeff-koons-1/related-artists')
-      prev.href.should.equal '/artist/jeff-koons-1/shows'
+      prev.href.should.equal '/artist/jeff-koons-1/auction-results'
       _.isUndefined(next).should.be.true()


Cleanup

Cleanup

--- components/article/client/view.coffee
+++ components/article/client/view.coffee
@@ -305,6 +305,7 @@
               @setupWaypointUrls() if @waypointUrls
             onClick: =>
               @sticky.rebuild()
+              $.waypoints 'refresh'
               analyticsHooks.trigger 'readmore', {}
           break


Drawer Web Component is fixed

Drawer Web Component is fixed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


non-functional docs test

non-functional docs test

error: pathspec 'test/documentation.coffee' did not match any file(s) known to git

--- test/documentation.coffee
+++ test/documentation.coffee
@@ -0,0 +1,42 @@
+# basic.coffee
+
+http = require 'http'
+request = require 'request'
+should = require 'should'
+nock   = require 'nock'
+sinon  = require 'sinon'
+
+mongoose = require 'mongoose'
+User = require 'models/user'
+Box = require 'models/box'
+
+httpopts = {host:'127.0.0.1', port:3000, path:'/'}
+baseurl = 'http://127.0.0.1:3000/'
+
+APIKEY = 'htsaoeuhtsaoehtoeuahtnsaoeuht'
+BOX = 'asotehusatoehus'
+
+describe 'Box SSH documentation', ->
+  describe '( GET /<box_name> )', ->
+    server = null
+
+    before (done) ->
+      server = require 'serv'
+      mongoose.connect process.env['COBALT_DB']
+      User.collection.drop()
+      Box.collection.drop()
+
+      new User({apikey: APIKEY}).save()
+      User.findOne {apikey: APIKEY}, (err, user) ->
+        new Box({user: user._id, name: BOX}).save()
+
+      done()
+
+    it 'documents how to SSH into a box', (done) ->
+      u = baseurl + BOX
+      request.get {url:u}, (err, resp, body) ->
+        resp.statusCode.should.equal 200
+        resp.body.should.contain 'ssh'
+        resp.body.should.contain '@'
+        done()
+


Adjust histogram height downwards

Adjust histogram height downwards

Make room for ranking text

--- app/views/play/ladder/ladder_tab.coffee
+++ app/views/play/ladder/ladder_tab.coffee
@@ -201,7 +201,7 @@
     x = d3.scale.linear().domain([-3000,6000]).range([0,width])

     data = d3.layout.histogram().bins(x.ticks(20))(histogramData)
-    y = d3.scale.linear().domain([0,d3.max(data, (d) -> d.y)]).range([height,0])
+    y = d3.scale.linear().domain([0,d3.max(data, (d) -> d.y)]).range([height,10])

     #create the x axis
     xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5).outerTickSize(0)


initial boot.coffee - commit.

initial boot.coffee - commit.

boot.coffee to boot or load required JavaScript, written in CoffeeScript.
http://coffeescript.org/

error: pathspec 'source/public/code/assets/coffee/boot.coffee' did not match any file(s) known to git


latency compensation: fake data now has group data too.

--- client/landing/app/Applications/Activity.kdapplication/widgets/widgetcontroller.coffee
+++ client/landing/app/Applications/Activity.kdapplication/widgets/widgetcontroller.coffee
@@ -149,6 +149,7 @@
       fakeTag       = $.extend {},fakeTag,
         title       : tag.title or tag.$suggest
         body        : tag.title or tag.$suggest
+        group       : tag.group or 'koding'
         counts      :
           followers : 0
           following : 0
@@ -158,7 +159,6 @@
     tags

   createFakeDataStructureForOwner = (activity)->
-
     oldActivity = activity
     constructorName = activity.fakeType
     # prepare fake post
@@ -168,6 +168,7 @@
       slug        : 'fakeActivity'
       title       : activity.title or activity.body
       body        : activity.body
+      group       : activity.group or 'koding'
       html        : KD.utils.applyMarkdown activity.body
       counts      :
         followers : 0


Improved the layout of icons on recording tab also for recording widget.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Fix duplicate _destroy method

Fix duplicate _destroy method

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/TheVikingOwain/arcadecache.git/'


ExamObject was added

ExamObject was added

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NightingaleStudio/exam.js.git/'


square user pictures

square user pictures

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Boxee/cloudee-couch.git/'


fix(config-detail): check operation when checking type change

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-wr-google-drive.git/'


Forgot to add grid_plot test files

Forgot to add grid_plot test files

error: pathspec 'bokehjs/test/models/layouts/grid_plot.coffee' did not match any file(s) known to git

--- bokehjs/test/models/layouts/grid_plot.coffee
+++ bokehjs/test/models/layouts/grid_plot.coffee
@@ -0,0 +1,74 @@
+{expect} = require "chai"
+utils = require "../../utils"
+sinon = require 'sinon'
+
+DataRange1d = utils.require("models/ranges/data_range1d").Model
+GridPlot = utils.require("models/layouts/grid_plot").Model
+Plot = utils.require("models/plots/plot").Model
+{Document} = utils.require "document"
+
+describe "GridPlot.Model", ->
+
+  beforeEach ->
+    document = new Document()
+    @p1 = new Plot({x_range: new DataRange1d(), y_range: new DataRange1d()})
+    @p1.document = document
+    @p1._doc_attached()
+    @p2 = new Plot({x_range: new DataRange1d(), y_range: new DataRange1d()})
+    @p2.document = document
+    @p2._doc_attached()
+    @grid = new GridPlot({children:[[@p1], [@p2]]})
+
+  it "should have flattened list of children in flat_children", ->
+    expect(@grid.flat_children.length).to.be.equal 2
+    expect(@grid.flat_children[0]).to.be.equal @p1
+    expect(@grid.flat_children[1]).to.be.equal @p2
+
+  it "should have get_layoutable_children return flat_children", ->
+    expect(@grid.get_layoutable_children()).to.be.deep.equal @grid.flat_children
+
+  it "should call get_edit_variables on child plots", ->
+    children_1 = @p1.get_layoutable_children()
+    children_2 = @p2.get_layoutable_children()
+    expect(children_1.length).to.be.equal 6
+    expect(children_2.length).to.be.equal 6
+
+    # Add spies to child plots
+    for child in children_1
+      child.get_edit_variables = sinon.spy()
+      expect(child.get_edit_variables.callCount).to.be.equal 0
+    for child in children_2
+      child.get_edit_variables = sinon.spy()
+      expect(child.get_edit_variables.callCount).to.be.equal 0
+
+    # Call get_edit_variables on grid_plot
+    @grid.get_edit_variables()
+
+    # Confirm child plots were called
+    for child in children_1
+      expect(child.get_edit_variables.callCount).to.be.equal 1
+    for child in children_2
+      expect(child.get_edit_variables.callCount).to.be.equal 1
+
+  it "should call get_constraints on child plots", ->
+    children_1 = @p1.get_layoutable_children()
+    children_2 = @p2.get_layoutable_children()
+    expect(children_1.length).to.be.equal 6
+    expect(children_2.length).to.be.equal 6
+
+    # Add spies to child plots
+    for child in children_1
+      child.get_constraints = sinon.spy()
+      expect(child.get_constraints.callCount).to.be.equal 0
+    for child in children_2
+      child.get_constraints = sinon.spy()
+      expect(child.get_constraints.callCount).to.be.equal 0
+
+    # Call get_constraints on grid_plot
+    @grid.get_constraints()
+
+    # Confirm child plots were called
+    for child in children_1
+      expect(child.get_constraints.callCount).to.be.equal 1
+    for child in children_2
+      expect(child.get_constraints.callCount).to.be.equal 1


changed number of commits visible on page

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/review.git/'


Update a missed setting

Update a missed setting

--- app/coffee/CompileManager.coffee
+++ app/coffee/CompileManager.coffee
@@ -35,5 +35,5 @@
 					callback null, outputFiles

 	clearProject: (project_id, callback = (error) ->) ->
-		compileDir = Path.join(Settings.compileDir, project_id)
+		compileDir = Path.join(Settings.path.compilesDir, project_id)
 		rimraf compileDir, callback


Readded the dot

Readded the dot

--- client/views/app/chatMessageDashboard.coffee
+++ client/views/app/chatMessageDashboard.coffee
@@ -22,7 +22,7 @@
 			UserManager.addUser(this.uid)
 		switch this.t
 			when 'p' then "#{this.msg}"
-			when 'r' then t('chatMessageDashboard.Room_name_changed', { room_name: this.msg, user_by: Session.get('user_' + this.by + '_name') })
+			when 'r' then t('chatMessageDashboard.Room_name_changed', { room_name: this.msg, user_by: Session.get('user_' + this.by + '_name') }) + '.'
 			when 'au' then t('chatMessageDashboard.User_added_by', { user_added: this.msg, user_by: Session.get('user_' + this.by + '_name') })
 			when 'ru' then t('chatMessageDashboard.User_removed_by', { user_removed: this.msg, user_by: Session.get('user_' + this.by + '_name') })
 			when 'ul' then t('chatMessageDashboard.User_left', this.msg)


Fix the math for the progress bar

Fix the math for the progress bar

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/minamarkham/gifpoint.git/'


cosmetic change, move Scope down in file

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/showell/CoffeeCoffee.git/'


Check up to 100 bytes until giving up

Check up to 100 bytes until giving up

--- app/assets/javascripts/player.js.coffee
+++ app/assets/javascripts/player.js.coffee
@@ -34,10 +34,10 @@
       @dataIndex += n
       @frame += 1

-      if rest.length > 20
-        head = rest.slice(0, 10)
+      if rest.length > 100
+        head = rest.slice(0, 100)
         hex = ("0x#{c.charCodeAt(0).toString(16)}" for c in head)
-        console.log "failed matching: '" + Utf8.decode(head) + "' (" + hex.join() + ")"
+        console.log "failed matching: '" + Utf8.decode(head) + "' (" + hex.join() + ") [pos: " + (@dataIndex - n) + "]"
         return

       unless window.stopped


update todos

update todos

--- src/publish/index.coffee
+++ src/publish/index.coffee
@@ -14,14 +14,19 @@
       changelog.build dir, (tempChangelog) ->
         tempChangelogPath = changelog.write(tempChangelog)
         openEditor tempChangelogPath, ->
+          # TODO: on non-zero exit code: remove tmp changelog and exit
           changelog.update(dir, tempChangelogPath)
           updateVersion(dir, version)
-          # TODO: confirm: "publish?"
-          # TODO: npm publish
           commitChanges dir, version, ->
             git.tag dir, "v#{version}", ->
               console.log 'tagged!'
+
+              # TODO: confirm: "publish?"
               # TODO: git push
+              # TODO: git push tag
+              # TODO: npm publish
+
+              # FUTURE
               # TODO: github release notes
               # TODO: github PR comments


Make sure there is one conversation with same channel name in the conversation list

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


fixed indentation on tooltip re-init on external profile icons.

--- client/app/Applications/Members.kdapplication/ContentDisplays/externalprofileview.coffee
+++ client/app/Applications/Members.kdapplication/ContentDisplays/externalprofileview.coffee
@@ -45,10 +45,9 @@
         href   : JsPath.getAt @getData().content, @getOption('urlLocation')
         target : '_blank'

-
-    @setTooltip if KD.isMine account
-    then title : "Go to my #{nicename} profile"
-    else title : "Go to #{firstName}'s #{nicename} profile"
+      @setTooltip if KD.isMine(account)
+      then title : "Go to my #{nicename} profile"
+      else title : "Go to #{firstName}'s #{nicename} profile"

   click:(event)->


Fixed a bug with the setting of opposing team spells, not to modify anything when there are no specified teams.

--- app/views/play/level_view.coffee
+++ app/views/play/level_view.coffee
@@ -130,7 +130,7 @@

     opponentSpells = []
     for spellTeam, spells of @session.get('teamSpells') or {}
-      continue if spellTeam is team
+      continue if spellTeam is team or not team
       opponentSpells = opponentSpells.concat spells

     otherSession = @levelLoader.opponentSession


Map k/j to up/down in archive-view

Map k/j to up/down in archive-view

error: pathspec 'src/packages/archive-view/keymaps/archive-view.cson' did not match any file(s) known to git

--- src/packages/archive-view/keymaps/archive-view.cson
+++ src/packages/archive-view/keymaps/archive-view.cson
@@ -0,0 +1,3 @@
+'.archive-view':
+  'k': 'core:move-up'
+  'j': 'core:move-down'


Sets item id when known.

Sets item id when known.

--- app/modules/settings/index.coffee
+++ app/modules/settings/index.coffee
@@ -92,6 +92,10 @@

           # Sends the order to XO-Server.
           xo.user.create {email, permission, password}
+            .then (id) ->
+              # Update user identifier.
+              user.id = id
+              return

           # The password should not be displayed.
           delete user.password
@@ -159,6 +163,9 @@

           # Sends the order to XO-Server.
           xo.server.add {host, username, password}
+            .then (id) ->
+              server.id = id
+              return

           # The password should not be displayed.
           delete server.password


use res.redirect instead of res.setHeader

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/phillips1012/pasteHTML.git/'


Update static/vendors/morrisjs/spec/lib/commas_spec.coffee

Signed-off-by: Bernard Ojengwa <fccb4cc00c1ba7e51bf5c2b5f77130b9fe8d917e@gmail.com>

error: pathspec 'static/vendors/morrisjs/spec/lib/commas_spec.coffee' did not match any file(s) known to git

--- static/vendors/morrisjs/spec/lib/commas_spec.coffee
+++ static/vendors/morrisjs/spec/lib/commas_spec.coffee
@@ -0,0 +1,38 @@
+describe '#commas', ->
+
+  it 'should insert commas into long numbers', ->
+    # zero
+    Morris.commas(0).should.equal("0")
+
+    # positive integers
+    Morris.commas(1).should.equal("1")
+    Morris.commas(12).should.equal("12")
+    Morris.commas(123).should.equal("123")
+    Morris.commas(1234).should.equal("1,234")
+    Morris.commas(12345).should.equal("12,345")
+    Morris.commas(123456).should.equal("123,456")
+    Morris.commas(1234567).should.equal("1,234,567")
+
+    # negative integers
+    Morris.commas(-1).should.equal("-1")
+    Morris.commas(-12).should.equal("-12")
+    Morris.commas(-123).should.equal("-123")
+    Morris.commas(-1234).should.equal("-1,234")
+    Morris.commas(-12345).should.equal("-12,345")
+    Morris.commas(-123456).should.equal("-123,456")
+    Morris.commas(-1234567).should.equal("-1,234,567")
+
+    # positive decimals
+    Morris.commas(1.2).should.equal("1.2")
+    Morris.commas(12.34).should.equal("12.34")
+    Morris.commas(123.456).should.equal("123.456")
+    Morris.commas(1234.56).should.equal("1,234.56")
+
+    # negative decimals
+    Morris.commas(-1.2).should.equal("-1.2")
+    Morris.commas(-12.34).should.equal("-12.34")
+    Morris.commas(-123.456).should.equal("-123.456")
+    Morris.commas(-1234.56).should.equal("-1,234.56")
+
+    # null
+    Morris.commas(null).should.equal('-')


create new collection with mongoDd

create new collection with mongoDd

error: pathspec 'createNewCollectionMongoDB.coffee' did not match any file(s) known to git

--- createNewCollectionMongoDB.coffee
+++ createNewCollectionMongoDB.coffee
@@ -0,0 +1,33 @@
+# createNewCollection.coffee
+#
+# created by Radjiv Carrere
+# 6 octobre 2014
+#
+# License MIT
+#
+
+mongo = require 'mongodb'
+
+server = new mongo.Server "127.0.0.1", 27017, {}
+
+client = new mongo.Db 'rainbowZoo', server, {w:1}
+
+# save() updates existing records or inserts new ones as needed
+unicorn = (dbErr, collection) ->
+    console.log "Unable to access database: #{dbErr}" if dbErr
+    collection.save {
+      #this is a new collection
+      "_id": "2122129",
+      "name":"charlie",
+      "birthday": "02/10/2010",
+      "status":"sleepy"
+
+    }, (err, docs) ->
+        console.log "Unable to save record: #{err}" if err
+        client.close()
+
+#put your collection in the database
+client.open (err, database) ->
+    client.collection 'unicorn', unicorn
+
+console.log "new unicorn"


Finished single job backbone

Finished single job backbone

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kenliau/Zooey.git/'


user: add a uid field

user: add a uid field


add missing file

add missing file


Social: fetch pending invitations for incoming user

--- workers/social/lib/social/models/user/index.coffee
+++ workers/social/lib/social/models/user/index.coffee
@@ -528,6 +528,17 @@
         queue.next()

     , =>
+      # check if user has pending invitation
+      return queue.next()  if invitationToken
+
+      JInvitation = require '../invitation'
+      options = { email: user.email, groupName }
+      console.log { options }
+      JInvitation.one options, {}, (err, invitation_) =>
+        invitation = invitation_ if invitation_
+        queue.next()
+
+    , =>
       # check for membership
       JGroup.one { slug: groupName }, (err, group) =>
         if not group or err


janitor: unset jUsers#inactive on login

janitor: unset jUsers#inactive on login


! allow negative numbers in billing machine

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/agilidee/dorsale.git/'


Added support for Cabal files

Added support for Cabal files

error: pathspec 'grammars/cabal.cson' did not match any file(s) known to git

--- grammars/cabal.cson
+++ grammars/cabal.cson
@@ -0,0 +1,58 @@
+'scopeName': 'source.cabal'
+'fileTypes': [
+  'cabal'
+]
+'name': 'Cabal'
+'patterns': [
+
+      {
+          'match':'(version)\\W*:\\W*([\\d\.]+)'
+          'captures':
+            '1':
+                'name':'keyword.other'
+            '2':
+                'name':'constant.numeric'
+          'name':'version'
+      }
+      {
+          'match':'(\\S+):[^/]'
+          'captures':
+            '1':
+              'name':'keyword.other'
+          'name':'cabal-keyword'
+      }
+
+      {
+        'match':'&&'
+        'name':'keyword.other'
+      }
+      {
+          'match':'([><=]+)\\s*([\\d\.]+)'
+          'captures':
+            '1':
+              'name':'keyword.other'
+            '2':
+              'name':'constant.numeric'
+
+          'name':'cabal-keyword'
+
+      }
+
+      {
+          'match':'(executable)\\s+(\\S+)'
+          'captures':
+            '1':
+                'name':'entity.name.function.haskell'
+            '2':
+                'name':'support.other'
+          'name':'module-type'
+      }
+      {
+          'match':'library'
+          'name':'entity.name.function'
+      }
+      {
+          'match':'--.*\\n'
+          'name':'comment'
+      }
+]


Social: fix linting problem

Social: fix linting problem


Fixed url route bug.

Fixed url route bug.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bjmin/beautiful-colors.git/'


Fix wrong args in http module

Fix wrong args in http module

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/opengallery/og-bot.git/'


KiteApiMap: remove deprecated methods of kloud


Define is "Managed VMs" stack utility

Define is "Managed VMs" stack utility


Create array-pair-sum.coffee

Create array-pair-sum.coffee

error: pathspec 'array-pair-sum/array-pair-sum.coffee' did not match any file(s) known to git

--- array-pair-sum/array-pair-sum.coffee
+++ array-pair-sum/array-pair-sum.coffee
@@ -0,0 +1,16 @@
+# This is just a modification of the integer difference problem presented elsewhere
+arrayPairSum = (k, array) ->
+  hash = {}
+  pairs = []
+
+  # Loop through the array once, storing the results in an object for a
+  # time complexity of O(n) - the naive solution consists of two for loops
+  # which results in a complexity of O(n^2)
+  array.forEach (number) ->
+    # Make sure the value in unused and it's a unique pair
+    if hash[k - number] is false and k - number isnt number
+      pairs.push [number, k - number]
+      hash[k - number] = true # Set it to "used"
+    # If the hash value is not true, set the hash to "unused"
+    not hash[k - number] and (hash[number] = false)
+  pairs


Hide flash bar when clicking on it

Hide flash bar when clicking on it

error: pathspec 'app/assets/javascripts/components/flash_bar.coffee' did not match any file(s) known to git

--- app/assets/javascripts/components/flash_bar.coffee
+++ app/assets/javascripts/components/flash_bar.coffee
@@ -0,0 +1,4 @@
+$(document)
+  .on("click", ".flash-bar-show", ->
+    $(this).removeClass("flash-bar-show")
+  )


Try to fix problem with non-updating thumbnails.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lmjohns3/thorax-media.git/'


Remove used file

Remove used file

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ziagrosvenor/sound-machine.git/'


Idempotence for settings

Idempotence for settings

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


Finall,y remove the refresh button in drawer

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-emails.git/'


Added days, hours, minutes and seconds in online log message (#1621)

* Added days, hours, minutes and seconds in online log message

* Removed hounds

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Fix year slider

Fix year slider

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/startae/hub.git/'


apps WIP

apps WIP

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Global pathValue option

Global pathValue option

--- app/assets/javascripts/uploadcare/defaults.js.coffee
+++ app/assets/javascripts/uploadcare/defaults.js.coffee
@@ -19,4 +19,4 @@

   previewStep: if window.UPLOADCARE_PREVIEW_STEP? then window.UPLOADCARE_PREVIEW_STEP else false

-  pathValue: false
+  pathValue: window.UPLOADCARE_PATH_VALUE


Hide thead and tfoot when all receipt forms are removed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ecbypi/besko.git/'


Credential: required field name check fix


onbeforeunload only fires when ace or terminal is open

--- client/landing/app/MainApp/ApplicationManager.coffee
+++ client/landing/app/MainApp/ApplicationManager.coffee
@@ -45,7 +45,7 @@

   getFrontApp:-> @frontApp

-  expandApplicationPath:(path)->
+  expandApplicationPath = (path)->
     if /\.kdapplication$/.test path then path
     else "./client/app/Applications/#{path}.kdapplication"

@@ -55,7 +55,7 @@
         [path, callback] = arguments
         doBringToFront = yes

-    path = @expandApplicationPath path
+    path = expandApplicationPath path
     appManager = @

     beforeCallback = (appInstance)->
@@ -180,7 +180,7 @@
     @openedInstances[path] = instance

   getAppInstance: (path) ->
-    @openedInstances[path]
+    @openedInstances[expandApplicationPath path]

   removeAppInstance:(path)->
     appInstance = @getAppInstance path
@@ -213,6 +213,7 @@
       delete @appInitializationQueue[path]

   getAppViews:(path)->
+
     index = @appInstanceArray.indexOf @getAppInstance path
     @appViewsArray[index]


teams: early access util submission feedbacks improved

--- client/landing/site.landing/coffee/core/utils.coffee
+++ client/landing/site.landing/coffee/core/utils.coffee
@@ -532,10 +532,19 @@

   earlyAccess: (data, callbacks = {}) ->

+    data.campaign = 'teams-early-access'
+
     $.ajax
       url       : "/-/teams/early-access"
       data      : data
       type      : 'POST'
-      success   : callbacks.success or -> location.reload()
+      success   : callbacks.success or ->
+        new KDNotificationView
+          title    : "Thank you! We'll let you know when we launch our Teams Product!"
+          duration : 3000
       error     : callbacks.error   or ({responseText}) ->
-        new KDNotificationView title : responseText
+        if responseText is 'Already applied!'
+          responseText = "You've already applied. We'll let you know when we launch our Teams Product!"
+        new KDNotificationView
+          title    : responseText
+          duration : 3000


hopefully fix test

hopefully fix test

--- lib/setup.coffee
+++ lib/setup.coffee
@@ -9,7 +9,6 @@
   CANONICAL_MOBILE_URL, IMAGES_URL_PREFIX, SECURE_IMAGES_URL, GOOGLE_ANALYTICS_ID, MIXPANEL_ID,
   COOKIE_DOMAIN, AUTO_GRAVITY_LOGIN, GOOGLE_MAPS_API_KEY, ADMIN_URL, CMS_URL } = config = require "../config"
 { parse, format } = require 'url'
-

 _ = require 'underscore'
 express = require "express"
@@ -30,7 +29,8 @@
 errorHandler = require "../components/error_handler"
 { notFoundError, loginError } = require('./middleware/errors')

-_.extend require('artsy-backbone-mixins/config'), config
+if REDIS_URL
+  _.extend require('artsy-backbone-mixins/config'), config

 # Setup sharify constants & require dependencies that use sharify data
 sharify.data =


let searching with spaceS

let searching with spaceS

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VoiSmart/Rocket.Chat.git/'


editorpane: call super on destroy

editorpane: call super on destroy


Make group payment modal work.

Make group payment modal work.

--- client/landing/app/MainApp/paymentcontroller.coffee
+++ client/landing/app/MainApp/paymentcontroller.coffee
@@ -265,7 +265,7 @@
               delete data.cardYear
               delete data.cardCV

-              @paymentModal = @createPaymentMethodModal data, (newData, onError, onSuccess)->
+              @paymentModal = paymentController.createPaymentMethodModal data, (newData, onError, onSuccess)->
                 newData.plan = planCode
                 newData.type = type
                 group.makePayment newData, (err, subscription)->


TopNav: added sign in link

TopNav: added sign in link

--- client/landing/app/coffee/core/topnavigation.coffee
+++ client/landing/app/coffee/core/topnavigation.coffee
@@ -5,6 +5,7 @@
   menu = [
     { title : 'ABOUT',     href : '/About',     name : 'about'}
     { title : 'PRICING',   href : '/Pricing',   name : 'pricing'}
+    { title : 'SIGN IN',   href : '/Login',     name : 'login'}
   ]

   constructor: (options = {}, data) ->


Set up the WorldMap to load earned achievements and modify the User object to include absolutely everything.

--- app/views/play/WorldMapView.coffee
+++ app/views/play/WorldMapView.coffee
@@ -1,6 +1,7 @@
 RootView = require 'views/kinds/RootView'
 template = require 'templates/play/world-map-view'
 LevelSession = require 'models/LevelSession'
+EarnedAchievement = require 'models/EarnedAchievement'
 CocoCollection = require 'collections/CocoCollection'
 AudioPlayer = require 'lib/AudioPlayer'
 LevelSetupManager = require 'lib/LevelSetupManager'
@@ -39,6 +40,23 @@
     @levelStatusMap = {}
     @levelPlayCountMap = {}
     @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', null, 0).model
+
+    # Temporary attempt to make sure all earned rewards are accounted for. Figure out a better solution...
+    @earnedAchievements = new CocoCollection([], {url: '/db/earned_achievement', model:EarnedAchievement, project: ['earnedRewards']})
+    @listenToOnce @earnedAchievements, 'sync', ->
+      earned = me.get('earned')
+      addedSomething = false
+      for m in @earnedAchievements.models
+        continue unless loadedEarned = m.get('earnedRewards')
+        for group in ['heroes', 'levels', 'items']
+          continue unless loadedEarned[group]
+          for reward in loadedEarned[group]
+            if reward not in earned[group]
+              console.warn 'Filling in a gap for reward', group, reward
+              earned[group].push(reward)
+              addedSomething = true
+    @supermodel.loadCollection(@earnedAchievements, 'achievements')
+
     @listenToOnce @sessions, 'sync', @onSessionsLoaded
     @getLevelPlayCounts()
     $(window).on 'resize', @onWindowResize


better data rendering

better data rendering

--- query_runner.coffee
+++ query_runner.coffee
@@ -141,6 +141,8 @@
     measure_like = measures.concat(calcs.filter((c) -> c.is_measure))
     dimension_like = dimensions.concat(calcs.filter((c) -> !c.is_measure))

+    renderableFields = dimension_like.concat(measure_like)
+
     if result.pivots
       @reply("#{query.share_url}\n _Can't currently display tables with pivots in Slack._")

@@ -151,9 +153,9 @@
       else
         @reply("#{query.share_url}\nNo results.")

-    else if dimension_like.length == 0 && measure_like.length > 0
+    else if result.data.length == 1
       attachment = _.extend({}, options, {
-        fields: measure_like.map((m) ->
+        fields: renderableFields.map((m) ->
           {title: m.label, value: result.data[0][m.name].rendered, short: true}
         )
       })
@@ -162,26 +164,12 @@
         text: if @showShareUrl() then query.share_url else ""
       )

-    else if dimension_like.length == 1 && measure_like.length == 0
+    else
       attachment = _.extend({}, options, {
         fields: [
-          title: dimension_like[0].label
+          title: renderableFields.map((f) -> f.label).join(" – ")
           value: result.data.map((d) ->
-            d[dimension_like[0].name].rendered
-          ).join("\n")
-        ]
-      })
-      @reply(
-        attachments: [attachment]
-        text: if @showShareUrl() then query.share_url else ""
-      )
-    else
-      fields = dimension_like.concat(measure_like)
-      attachment = _.extend({}, options, {
-        fields: [
-          title: fields.map((f) -> f.label).join(" – ")
-          value: result.data.map((d) ->
-            fields.map((f) -> d[f.name].rendered).join(" – ")
+            renderableFields.map((f) -> d[f.name].rendered).join(" – ")
           ).join("\n")
         ]
       })


Add LightboxFactory and TODO in SceneCtrl

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/GregDesplaces/classe-1914.git/'


Update ding.coffee

Update ding.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/masneyb/pi-dinger.git/'


Add alternate loop-snippet for shell-scripts

--- user/snippets.cson
+++ user/snippets.cson
@@ -304,6 +304,9 @@
 				echo "\$${3:i}";$4
 			done;
 		"""
+	"File Loop":
+		prefix: "eachfile"
+		body: "for i in $@; do $1; done;"
 	Case:
 		prefix: "case"
 		body: """


maybe drop will properly remove things

maybe drop will properly remove things

--- api/test/helpers/db.coffee
+++ api/test/helpers/db.coffee
@@ -15,6 +15,6 @@
   @db[collection].insert data, callback

 @empty = (callback) =>
-  collections = fs.readdirSync path.resolve(__dirname, '../../apps')
+  collections = fs.readdirSync path.resolve(__dirname, '../../apps')
   cb = _.after collections.length, callback
-  @db[col].remove({}, cb) for col in collections
+  @db[col].drop(cb) for col in collections


ALLOW_SLACK_GUEST_USERS environment variable option (off by default)

--- lib/bot.coffee
+++ lib/bot.coffee
@@ -30,6 +30,8 @@
   process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0

 enableQueryCli = process.env.LOOKER_EXPERIMENTAL_QUERY_CLI == "true"
+
+enableGuestUsers = process.env.ALLOW_SLACK_GUEST_USERS == "true"

 customCommands = {}

@@ -247,7 +249,7 @@
         text: "Could not fetch your user info from Slack. #{error || ""}"
       )
     else
-      if user.is_restricted || user.is_ultra_restricted
+      if !enableGuestUsers && (user.is_restricted || user.is_ultra_restricted)
         context?.replyPrivate(
           text: "Sorry @#{user.name}, as a guest user you're not able to use this command."
         )


fixed rate limit in websocket spec

fixed rate limit in websocket spec

--- integration/websocket-spec.coffee
+++ integration/websocket-spec.coffee
@@ -20,7 +20,7 @@
         done error

   beforeEach (done) ->
-    _.delay done, 50
+    _.delay done, 100

   afterEach ->
     @meshblu.removeAllListeners()


Fixing small bugs

Fixing small bugs

--- src/jquery.validators.coffee
+++ src/jquery.validators.coffee
@@ -12,7 +12,7 @@

 $.validators.validateCardExpiry = (expiry_string) ->
         expiry = $.payment.cardExpiryVal(expiry_string)
-        return $.payment.validateCardExpiry(expiry['month'], expiry['year'])
+        return $.payment.validateCardExpiry(expiry.month, expiry.year)

 $.validators.validateCardCVC = (cvc, type) ->
         return $.payment.validateCardCVC(cvc, type)
@@ -45,6 +45,7 @@

 $.validators.validatePostalCode = (postal_code_string) ->
+	return false unless postal_code_string?
 	postal_code_string = postal_code_string.replace(/\s+/g, '')
 	return false unless /^[a-zA-Z\d]+$/.test(postal_code_string)

@@ -62,12 +63,15 @@
   $.validators.dateVal($(this).val())

 $.validators.dateVal = (date_string) ->
-	# [day, month, year] = if /[^\d\/\s]/g.test(date_string) then (NaN, NaN, NaN) else
-
-	[day, month, year] = date_string.replace(/\s/g, '').split('/', 3)
+	[day, month, year] = if date_string? then date_string.replace(/\s/g, '').split('/', 3) else [NaN, NaN, NaN]

 	day   = parseInt(day, 10)
 	month = parseInt(month, 10)
 	year  = parseInt(year, 10)

-	return day: day, month: month, year: year+	return day: day, month: month, year: year
+
+$.validators.fn.cardExpiryVal =->
+	$validators.cardExpiryVal($(this).val())
+
+$.validators.cardExpiryVal = $.payment.cardExpiryVal