now the heart of the programm all oop!

now the heart of the programm all oop!

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

--- src/coffee/services/core.coffee
+++ src/coffee/services/core.coffee
@@ -0,0 +1,124 @@
+##
+## core.coffee
+##
+## Created by Frederic DELBOS - fred.delbos@gmail.com on Dec 13 2013.
+## This file is subject to the terms and conditions defined in
+## file 'LICENSE.txt', which is part of this source code package.
+##
+
+angular.module('CoolFormServices').
+  factory('coreService', (validators)->
+
+    return(definition) ->
+
+      _fields = {}
+
+      class Element
+        constructor: (subElemName) ->
+          @subElemName = subElemName
+          @valid = true
+
+        reset: ->
+          e.reset() for e in this[@subElemName]
+
+        validate: ->
+          for e in this[@subElemName]
+            if e.display is true and e.validate() is false
+              @valid = false; return @valid
+          @valid = true; return @valid
+
+
+      class Displayable extends Element
+        _doDisplay: (def, showOrHide) ->
+          for field, values of def
+            _fields[field].onChange.push (v) =>
+              for i in values
+                if v == i
+                  @display = showOrHide
+                  return
+              @display = !showOrHide
+
+        constructor: (def, subElemName) ->
+          super(subElemName)
+          @display = true
+          if def['show_on']? then this._doDisplay(def['show_on'], true)
+          if def['hide_on']? then this._doDisplay(def['hide_on'], false)
+
+
+      class Form extends Element
+        constructor: (def) ->
+          super("pages")
+          @name = def['name']
+          @action = def['action']
+          @method = if !def['method']? then "POST" else def['method']
+          @submitLabel = def['submit']
+          @resetLabel = def['reset']
+          @pages = (new Page(p) for p in def['pages'])
+
+
+      class Page extends Displayable
+        constructor: (def) ->
+          super(def, "lines")
+          @title = def['title']
+          @description = def['description']
+          @lines = (new Line(l) for l in def['lines'])
+
+
+      class Line extends Displayable
+        constructor: (def) ->
+          super(def, "fields")
+          @fields = (new Field(f) for f in def['fields'])
+
+
+      class Field extends Displayable
+        constructor: (def) ->
+          super(def)
+          @name = def['name']
+          @type = def['type']
+          @label = def['label']
+          @size = def['size']
+          @help = def['help']
+          @default = def['default']
+          @value = @default
+          @validators = (new Validator(v, @name) for v in def['validators'])
+          @error = null
+          @onChange = []
+          _fields[@name] = this
+
+        set: (value) ->
+          @value = value
+          for h in @onChange
+            h(@value)
+
+        reset: ->
+          this.set(if @default then @default else null)
+
+        validate: ->
+          for v in @validators
+            if v.validate() is false
+              @valid = false; @error = v.message; return @valid
+          @valid = true; @error = null; return @valid
+
+
+      class Validator
+        constructor: (def, fieldName) ->
+          @name = def['name']
+          @message = def['message']
+          @options = def['options']
+          @fieldName = fieldName
+          v = validators.get(@name)
+          if v is not null and v.init?
+            v.init(@fieldName, @options, _fields)
+
+        validate: ->
+          v = validators.get(@name)
+          if v is null then return true
+          return v.validator(@fieldName, _fields, @options)
+
+      if definition['form']?
+        form = new Form(definition['form'])
+        form.reset()
+        return form
+      else
+        return null
+  )


clio-23421 adds comment linking TODO to JIRA issue

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/'


Disable hiding the off-canvas upon window resize.

In some browsers for mobile devices, the address bar is automatically
hidden when scrolling down the page. This is not workable if the height
of the contents of the off-canvas exceeds the height of the screen,
because the latter portion of the contents stays hidden to the user.

https://github.com/openfoodfoundation/angular-foundation/blob/0.9.0-20180826174721/src/offcanvas/offcanvas.js

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

--- app/assets/javascripts/darkswarm/directives/off_canvas_wrap.js.coffee
+++ app/assets/javascripts/darkswarm/directives/off_canvas_wrap.js.coffee
@@ -0,0 +1,22 @@
+# Extend the "offCanvasWrap" directive in "angular-foundation" to disable hiding of the off-canvas
+# upon window resize.
+#
+# In some browsers for mobile devices, the address bar is automatically hidden when scrolling down
+# the page. This is not workable if the height of the contents of the off-canvas exceeds the height
+# of the screen, because the latter portion of the contents stays hidden to the user.
+#
+# https://github.com/openfoodfoundation/angular-foundation/blob/0.9.0-20180826174721/src/offcanvas/offcanvas.js
+angular.module('mm.foundation.offcanvas').directive 'offCanvasWrap', ($window) ->
+  {
+    restrict: 'C'
+    priority: 1
+    link: ($scope, element, attrs) ->
+      win = angular.element($window)
+
+      # Get the scope used by the "offCanvasWrap" directive:
+      # https://github.com/openfoodfoundation/angular-foundation/blob/0.9.0-20180826174721/src/offcanvas/offcanvas.js#L2
+      isolatedScope = element.isolateScope()
+
+      # Unbind hiding of the off-canvas upon window resize.
+      win.unbind('resize.body', isolatedScope.hide)
+  }


rundeck plugin

rundeck plugin

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

--- hubot/scripts/slack_rundeck.coffee
+++ hubot/scripts/slack_rundeck.coffee
@@ -0,0 +1,211 @@
+# Description
+#   Rundeck integration with hubot
+#
+# Dependencies:
+#   "underscore": "^1.6.0"
+#   "strftime": "^0.8.0"
+#   "xml2js": "^0.4.1"
+#   "hubot-auth"
+#
+# Configuration:
+#   HUBOT_RUNDECK_URL
+#   HUBOT_RUNDECK_TOKEN
+#   HUBOT_RUNDECK_PROJECT
+#
+# Commands:
+#   hubot rundeck (list|jobs) - List all Rundeck jobs
+#   hubot rundeck show <name> - Show detailed info for the job <name>
+#   hubot rundeck run <name> - Execute a Rundeck job <name>
+#   hubot rundeck (adhoc|ad-hoc|ad hoc) <name> <nodename> - Execute an ad-hoc Rundeck job <name> on node <nodename>
+#   hubot rundeck output <id> - Print the output of execution <id>
+#
+# Notes:
+#   Todo:
+#     * make job name lookups case-insensitive
+#     * ability to show results of a job/execution
+#     * query job statistics
+#
+# Author:
+#   <dan.ryan@XXXXXXXXXX>
+
+_ = require('underscore')
+sys = require 'sys' # Used for debugging
+querystring = require 'querystring'
+url = require 'url'
+inspect = require('util').inspect
+strftime = require('strftime')
+Parser = require('xml2js').Parser
+
+class Rundeck
+  constructor: (@robot) ->
+    @logger = @robot.logger
+
+    @baseUrl = process.env.HUBOT_RUNDECK_URL
+    @authToken = process.env.HUBOT_RUNDECK_TOKEN
+    @project = process.env.HUBOT_RUNDECK_PROJECT
+    @adminRole = "rundeck_admin"
+
+    @headers =
+      "Accept": "application/xml"
+      "Content-Type": "application/xml"
+      "X-Rundeck-Auth-Token": "#{@authToken}"
+
+    @plainTextHeaders =
+      "Accept": "text/plain"
+      "Content-Type": "text/plain"
+      "X-Rundeck-Auth-Token": "#{@authToken}"
+
+    @cache = {}
+    @cache['jobs'] = {}
+    @logger = @robot.logger
+    @brain = @robot.brain.data
+
+    robot.brain.on 'loaded', =>
+      @logger.info("Loading rundeck jobs from brain")
+      if @brain.rundeck?
+        @logger.info("Loaded saved rundeck jobs")
+        @cache = @brain.rundeck
+      else
+        @logger.info("No saved rundeck jobs found ")
+        @brain.rundeck = @cache
+
+  cache: -> @cache
+  parser: -> new Parser()
+  jobs: -> new Jobs(@)
+
+  save: ->
+    @logger.info("Saving cached rundeck jobs to brain")
+    @brain.rundeck = @cache
+
+  getOutput: (url, cb) ->
+    @robot.http("#{@baseUrl}/#{url}").headers(@plainTextHeaders).get() (err, res, body) =>
+      if err?
+        @logger.err JSON.stringify(err)
+      else
+        cb body
+
+  get: (url, cb) ->
+    parser = new Parser()
+
+    @robot.http("#{@baseUrl}/#{url}").headers(@headers).get() (err, res, body) =>
+      if err?
+        @logger.error JSON.stringify(err)
+      else
+        parser.parseString body, (e, json) ->
+          cb json
+
+class Job
+  constructor: (data) ->
+    @id = data["$"].id
+    @name = data.name[0]
+    @description = data.description[0]
+    @group = data.group[0]
+    @project = data.project[0]
+
+  format: ->
+    "Name: #{@name}\nId: #{@id}\nDescription: #{@description}\nGroup: #{@group}\nProject: #{@project}"
+
+  formatList: ->
+    "#{@name} - #{@description}"
+
+class Jobs
+  constructor: (@rundeck) ->
+    @logger = @rundeck.logger
+
+  list: (cb) ->
+    jobs = []
+    @rundeck.get "project/#{@rundeck.project}/jobs", (results) ->
+      for job in results.jobs.job
+        jobs.push new Job(job)
+
+      cb jobs
+
+  find: (name, cb) ->
+    @list (jobs) =>
+      job = _.findWhere jobs, { name: name }
+      if job
+        cb job
+      else
+        cb false
+
+  run: (name, query, cb) ->
+    @find name, (job) =>
+      if job
+        uri = "job/#{job.id}/run"
+        uri += query if query?
+        @rundeck.get uri, (results) ->
+          cb job, results
+      else
+        cb null, false
+
+module.exports = (robot) ->
+  logger = robot.logger
+  rundeck = new Rundeck(robot)
+
+  # hubot rundeck list
+  robot.respond /rundeck (?:list|jobs)$/i, (msg) ->
+    if robot.auth.hasRole(msg.envelope.user, rundeck.adminRole)
+      rundeck.jobs().list (jobs) ->
+        if jobs.length > 0
+          for job in jobs
+            msg.send job.formatList()
+        else
+          msg.send "No Rundeck jobs found."
+    else
+        msg.send "#{msg.envelope.user}: you do not have #{rundeck.adminRole} role."
+
+  # hubot rundeck output <job-id>
+  # sample url:
+  robot.respond /rundeck output (.+)/i, (msg) ->
+    jobid = msg.match[1]
+
+    if robot.auth.hasRole(msg.envelope.user, rundeck.adminRole)
+      rundeck.getOutput "execution/#{jobid}/output", (output) ->
+        if output
+          msg.send "```#{output}```"
+        else
+          msg.send "Could not find output for Rundeck job \"#{jobid}\"."
+    else
+        msg.send "#{msg.envelope.user}: you do not have #{rundeck.adminRole} role."
+
+  # hubot rundeck show <name>
+  robot.respond /rundeck show ([\w -_]+)/i, (msg) ->
+    name = msg.match[1]
+
+    if robot.auth.hasRole(msg.envelope.user, rundeck.adminRole)
+      rundeck.jobs().find name, (job) ->
+        if job
+          msg.send job.format()
+        else
+          msg.send "Could not find Rundeck job \"#{name}\"."
+    else
+        msg.send "#{msg.envelope.user}: you do not have #{rundeck.adminRole} role."
+
+  # hubot rundeck run <name>
+  robot.respond /rundeck run ([\w -_]+)/i, (msg) ->
+    name = msg.match[1]
+
+    if robot.auth.hasRole(msg.envelope.user, rundeck.adminRole)
+      rundeck.jobs().run name, null, (job, results) ->
+        if job
+          msg.send "Running job #{name}: #{results.result.executions[0].execution[0]['$'].href}"
+        else
+          msg.send "Could not execute Rundeck job \"#{name}\"."
+    else
+        msg.send "#{msg.envelope.user}: you do not have #{rundeck.adminRole} role."
+
+  # takes all but last word as the name of our job
+  # hubot rundeck ad-hoc <name> <nodename>
+  robot.respond /rundeck (?:ad[ -]?hoc) ([\w -_]+) ([\w-]+)/i, (msg) ->
+    name = msg.match[1]
+    params = { argString: "-nodename #{msg.match[2].trim().toLowerCase()}" }
+    query = "?#{querystring.stringify(params)}"
+
+    if robot.auth.hasRole(msg.envelope.user, rundeck.adminRole)
+      rundeck.jobs().run name, query, (job, results) ->
+        if job
+          msg.send "Running job #{name}: #{results.result.executions[0].execution[0]['$'].href}"
+        else
+          msg.send "Could not execute Rundeck job \"#{name}\"."
+    else
+        msg.send "#{msg.envelope.user}: you do not have #{rundeck.adminRole} role."


Add Facebook generator meta tags.

Add Facebook generator meta tags.

error: pathspec 'fb_instant_articles/fb_generator_tags.cjsx' did not match any file(s) known to git

--- fb_instant_articles/fb_generator_tags.cjsx
+++ fb_instant_articles/fb_generator_tags.cjsx
@@ -0,0 +1,8 @@
+React = require 'react'
+
+pkg = require '../package.json'
+
+module.exports = [
+    <meta property='op:generator:application' content='marquee' />
+    <meta property='op:generator:application:version' content=pkg.version />
+]


parable.coffee: add pointer_to_name()

parable.coffee: add pointer_to_name()

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/crcx/parable.git/'


cloudlinux limits

cloudlinux limits

error: pathspec 'kites/sharedHosting/limits.coffee' did not match any file(s) known to git

--- kites/sharedHosting/limits.coffee
+++ kites/sharedHosting/limits.coffee
@@ -0,0 +1,90 @@
+{exec} = require 'child_process'
+
+
+config =
+  lvectl: '/usr/sbin/lvectl'
+
+
+
+class osLimits
+
+  setMemory : (options,callback)->
+    # this method will set memory limit for user
+
+    #
+    # options =
+    #   username : String # username
+    #   memory   : Number # new memory limit in MB
+
+    # return error on error , null on success
+
+    {username, memory} = options
+
+    exec "#{config.lvectl} set $(id -u #{username}) --mem=#{memory}m --save", (err, stdout, stderr) ->
+      if err?
+        console.log e = "[ERROR] can't change memory limit for user #{username}: #{stderr}"
+        callback e
+      else
+        console.log "[OK] memory limit for user #{username} has been changed to #{memory}MB"
+        callback null
+
+  setCpu : (options,callback)->
+    # this method will set CPU limit for user
+
+    #
+    # options =
+    #   username : String # username
+    #   cpu      : Number # in %  - 100% is max limit
+
+    # return error on error , null on success
+
+
+    {username, cpu} = options
+
+    exec "#{config.lvectl} set $(id -u #{username}) --cpu=#{cpu} --save", (err, stdout, stderr) ->
+      if err?
+        console.log e = "[ERROR] can't change cpu limit for user #{username}: #{stderr}"
+        callback e
+      else
+        console.log "[OK] cpu limit for user #{username} has been changed to #{cpu}%"
+        callback null
+
+
+  setWebProcs : (options,callback)->
+
+    # this method will set CPU limit for user
+
+    #G
+    # options =
+    #   username : String # username
+    #   procs      : Number # max number of processes spawned by apache
+
+    # return error on error , null on success
+
+
+    {username, procs} = options
+
+    exec "#{config.lvectl} set $(id -u #{username}) --maxEntryProcs=#{procs} --save", (err, stdout, stderr) ->
+      if err?
+        console.log e = "[ERROR] can't  change procs limit for user #{username}: #{procs}"
+        callback e
+      else
+        console.log "[OK] procs limit for user #{username} has been changed to #{procs}"
+        callback null
+
+
+
+#limit = new osLimits
+
+#limit.setMemory username:'alekseymykhailov',memory:100,(err)->
+#  if err?
+#    console.log "ERR:", err
+
+#limit.setCpu username:'alekseymykhailov',cpu:100,(err)->
+#  if err?
+#    console.log "ERR:", err
+
+#limit.setWebProcs username:'alekseymykhailov',procs:100,(err)->
+#  if err?
+#    console.log "ERR:", err
+


Map number keys to 'typing' event

Map number keys to 'typing' event

--- assets/javascripts/app/shortcuts.coffee
+++ assets/javascripts/app/shortcuts.coffee
@@ -35,7 +35,7 @@
     return

   handleKeydownEvent: (event) ->
-    if not event.target.form and 65 <= event.which <= 90
+    if not event.target.form and (48 <= event.which <= 57 or 65 <= event.which <= 90)
       @trigger 'typing'
       return


set a cookie to lock the representative info

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/longdistancevoter/votingrightsact.us.git/'


Fix disable behavior

Fix disable behavior

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/jerone/flex-toolbar.git/'


feat(objects.cson): Add object snippets

feat(objects.cson): Add object snippets

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

--- snippets/objects.cson
+++ snippets/objects.cson
@@ -0,0 +1,49 @@
+'.source.js':
+
+  # -------------------------------------------------
+  # Classes
+  # -------------------------------------------------
+
+  'THREE.Bone':
+    'prefix': 'bone'
+    'body': 'new THREE.Bone(${1:skin})${0}'
+
+  'THREE.Group':
+    'prefix': 'group'
+    'body': 'new THREE.Group()${0}'
+
+  'THREE.LOD':
+    'prefix': 'lod'
+    'body': 'new THREE.LOD()${0}'
+
+  'THREE.LensFlare':
+    'prefix': 'lensflare'
+    'body': 'new THREE.LensFlare(${1:texture}, ${2:size}, ${3:distance}, ${4:blending}, ${5:color})${0}'
+
+  'THREE.Line':
+    'prefix': 'line'
+    'body': 'new THREE.Line(${1:geometry}, ${2:material}, ${3:mode})${0}'
+
+  'THREE.LineSegment':
+    'prefix': 'lineseg'
+    'body': 'new THREE.LineSegment(${1:geometry}, ${2:material})${0}'
+
+  'THREE.Mesh':
+    'prefix': 'mesh'
+    'body': 'new THREE.Group(${1:geometry}, ${2:material})${0}'
+
+  'THREE.Points':
+    'prefix': 'points'
+    'body': 'new THREE.Points(${1:geometry}, ${2:material})${0}'
+
+  'THREE.Skeleton':
+    'prefix': 'skeleton'
+    'body': 'new THREE.Skeleton(${1:bones}, ${2:boneInverses}, ${3:useVertexTexture})${0}'
+
+  'THREE.SkinnedMesh':
+    'prefix': 'skinnedmesh'
+    'body': 'new THREE.Group(${1:geometry}, ${2:material}, ${3:useVertexTexture})${0}'
+
+  'THREE.Sprite':
+    'prefix': 'sprite'
+    'body': 'new THREE.Sprite()${0}'


Add specs for Bacon._ utility functions

Add specs for Bacon._ utility functions

--- spec/BaconSpec.coffee
+++ spec/BaconSpec.coffee
@@ -22,6 +22,87 @@
 # child streams on unsubscribe.
 unstable = {unstable:true}

+describe "Bacon._", ->
+  _ = Bacon._
+  describe "head", ->
+    expect(_.head([5,2,9])).to.equal(5)
+    expect(_.head([])).to.equal(undefined)
+    expect(_.head(5)).to.equal(undefined)
+  describe "always", -> expect(_.always(5)("francis")).to.equal(5)
+  describe "negate", ->
+    expect(_.negate(_.always(true))("timanttikobra")).to.be.false
+  describe "empty", ->
+    expect(_.empty([])).to.be.true
+    expect(_.empty("")).to.be.true
+    expect(_.empty([1])).to.be.false
+    expect(_.empty("1")).to.be.false
+  describe "tail", ->
+    expect(_.tail([1,2,3])).to.deep.equal([2,3])
+    expect(_.tail([1])).to.deep.equal([])
+    expect(_.tail([])).to.deep.equal([])
+  describe "filter", ->
+    expect(_.filter(_.empty, ["","1",[],[2]])).to.deep.equal(["",[]])
+  describe "map", ->
+    expect(_.map(_.head, [
+      [], [1], [2,2], [3,3,3]
+    ])).to.deep.equal([
+      undefined, 1, 2, 3
+    ])
+  describe "each", ->
+    it "provides key and value to iterator", ->
+      expectKeyVals = (x, expectedKeys, expectedValues) ->
+        keys = []
+        values = []
+        _.each(x, (key, value) ->
+          keys.push(key)
+          values.push(value)
+        )
+        expect([keys, values]).to.deep.equal([expectedKeys, expectedValues])
+      expectKeyVals(
+        {cat:"furry",bird:"feathery"}, ["cat","bird"], ["furry","feathery"]
+      )
+      expectKeyVals([1,2,3], ["0","1","2"], [1,2,3])
+  describe "toArray", ->
+    expect(_.toArray(2)).to.deep.equal([2])
+    it "ignores rest of arguments", ->
+      expect(_.toArray(1,1,2)).to.deep.equal([1])
+    it "should, when given an array, return it back (not a copy)", ->
+      arr = []
+      expect(_.toArray(arr)).to.equal(arr)
+  describe "contains", ->
+    expect(_.contains("abc", "c")).to.be.true
+    expect(_.contains("abc", "x")).to.be.false
+    expect(_.contains([2,4,6], 4)).to.be.true
+    expect(_.contains([2,4,6], 3)).to.be.false
+  describe "id", ->
+    obj = {}
+    expect(_.id(obj)).to.equal(obj)
+  describe "last", ->
+    expect(_.last([2,4])).to.equal(4)
+    expect(_.last("last")).to.equal("t")
+  describe "all", ->
+    expect(_.all([ [false,true], [true,true] ], _.head)).to.be.false
+    expect(_.all([ [true,false], [true,true] ], _.head)).to.be.true
+    it "should test truthiness if no function given", ->
+      expect(_.all([true, false, true])).to.be.false
+      expect(_.all([true, true, true])).to.be.true
+      expect(_.all([1, true, 1])).to.be.true
+  describe "any", ->
+    expect(_.any([ [false,true], [true,true] ], _.head)).to.be.true
+    expect(_.any([ [false,false], [false,true] ], _.head)).to.be.false
+    it "should test truthiness if no function given", ->
+      expect(_.any([false, false, false])).to.be.false
+      expect(_.any([true, false, true])).to.be.true
+  describe "without", ->
+    expect(_.without("apple", ["bacon","apple","apple","omelette"]))
+      .to.deep.equal(["bacon","omelette"])
+  describe "remove", ->
+    expect(_.remove("apple", ["bacon","apple","apple","omelette"]))
+      .to.deep.equal(["apple"])
+    expect(_.remove("raisin", ["bacon","apple","apple","omelette"]))
+      .to.deep.equal(undefined)
+  describe "fold", ->
+    expect(_.fold([1,2,3,4,5], 0, (s, n) -> s + n)).to.equal(15)

 describe "Bacon.later", ->
   describe "should send single event and end", ->


fixed content type bug

fixed content type 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/mjpuser/riak-client.git/'


Add back run

Add back run

--- spec/db-spec.coffee
+++ spec/db-spec.coffee
@@ -12,7 +12,7 @@
     spyOn(db, 'file').andCallFake -> Helper.settingsPath

   it "finds all projects when given no options", ->
-    db.find (projects) ->
+    runs -> db.find (projects) ->
       expect(projects.length).toBe 2
       test1 = on

@@ -23,7 +23,7 @@
       paths: [
         "/Users/project-3"
       ]
-    db.add project3, (id) ->
+    runs -> db.add project3, (id) ->
       expect(id).toBe 'testproject3'
       db.find (projects) ->
         expect(projects.length).toBe 3


Rearrange forms.cson to be org by page.

Rearrange forms.cson to be org by 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/cranndarach/lifetracker.git/'


Add menu items

Add menu items

error: pathspec 'menus/symbols-view.cson' did not match any file(s) known to git

--- menus/symbols-view.cson
+++ menus/symbols-view.cson
@@ -0,0 +1,16 @@
+'menu': [
+  {
+    'label': 'Packages'
+    'submenu': [
+      'label': 'Symbols'
+      'submenu': [
+        { 'label': 'File Symbols', 'command': 'symbols-view:toggle-file-symbols' }
+        { 'label': 'Project Symbols', 'command': 'symbols-view:toggle-project-symbols' }
+      ]
+    ]
+  }
+]
+
+'context-menu':
+  '.overlayer':
+    'Go to Declaration': 'symbols-view:go-to-declaration'


AJ-1573 Load existing metrics on rubric design, some bugs.

--- app/assets/javascripts/angular/controllers/RubricCtrl.js.coffee
+++ app/assets/javascripts/angular/controllers/RubricCtrl.js.coffee
@@ -6,7 +6,6 @@
   $scope.savedMetricCount = 0

   $scope.init = (rubricId, metrics)->
-    alert(metrics)
     $scope.rubricId = rubricId
     $scope.addMetrics(metrics)

@@ -17,19 +16,24 @@
     $scope.savedMetricCount += 1

   MetricPrototype = (attrs={})->
-#    this.tiers = []
-#    # this.addTiers(attrs["tiers"]) if attrs["tiers"] #add tiers if passed on init
-#    this.id = if attrs.id then attrs.id else null
-#    this.name = if attrs.name then attrs.name else ""
-#    this.rubricId = if attrs.rubric_id then attrs.rubric_id else $scope.rubricId
-#    this.max_points = if attrs.max_points then attrs.max_points else null
-#    this.description = if attrs.description then attrs.description else ""
-#    this.hasChanges = false
+    this.tiers = []
+    this.id = if attrs.id then attrs.id else null
+    this.addTiers(attrs["tiers"]) if attrs["tiers"] #add tiers if passed on init
+    this.name = if attrs.name then attrs.name else ""
+    this.rubricId = if attrs.rubric_id then attrs.rubric_id else $scope.rubricId
+    this.max_points = if attrs.max_points then attrs.max_points else null
+    this.description = if attrs.description then attrs.description else ""
+    this.hasChanges = false
   MetricPrototype.prototype =
     addTier: (attrs={})->
       self = this
       newTier = new TierPrototype(self, attrs)
       this.tiers.push newTier
+    addTiers: (tiers)->
+      self = this
+      angular.forEach(tiers, (tier,index)->
+        self.addTier(tier)
+      )
     isNew: ()->
       this.id is null
     isSaved: ()->
@@ -42,15 +46,17 @@
       this.hasChanges = false
     resourceUrl: ()->
       "/metrics/#{self.id}"
-    params: ()-> {
-      name: this.name,
-      max_points: this.max_points,
-      order: this.order(),
-      description: this.description,
-      rubric_id: this.rubricId
-    }
     order: ()->
       jQuery.inArray(this, $scope.metrics)
+    params: ()->
+      self = this
+      {
+        name: self.name,
+        max_points: self.max_points,
+        order: self.order(),
+        description: self.description,
+        rubric_id: self.rubricId
+      }
     index: ()->
       this.order()
     destroy: ()->
@@ -99,9 +105,8 @@
   $scope.addMetrics = (existingMetrics)->
     alert(existingMetrics.length)
     angular.forEach(existingMetrics, (em, index)->
-      alert em.id
-      emProto = new(MetricPrototype(em))
-      # $scope.metrics.push emProto
+      emProto = new MetricPrototype(em)
+      $scope.metrics.push emProto
     )

   $scope.newMetric = ()->
@@ -122,14 +127,12 @@
   $scope.existingMetrics = []

   TierPrototype = (metric, attrs={})->
-    this.id = null
+    this.id = attrs.null or null
     this.metric = metric
-    alert(metric.name)
     this.metric_id = metric.id
-    alert(metric.id)
-    this.name = attrs["name"] || ""
-    this.points = attrs["points"] || null
-    this.description = attrs["description"] || ""
+    this.name = attrs.name or ""
+    this.points = attrs.points || null
+    this.description = attrs.description or ""
     this.resetChanges()
   TierPrototype.prototype =
     isNew: ()->
@@ -151,11 +154,9 @@
       self = this
       Restangular.all('tiers').post(self.params())
         .then(
-          (response)->
+          (response)-> #success
             self.id = response.id
-            alert("shit worked!")
-          (response)->
-            alert("shit blew up!")
+          (response)-> #error
         )

     modify: (form)->
@@ -170,8 +171,8 @@
         self = this
         Restangular.one('tiers', self.id).customPUT(self.params())
           .then(
-            ()-> alert("shit worked!"),
-            ()-> alert("shit broke!")
+            ()-> #success
+            ()-> #failure
           )
           self.resetChanges()


use _isGlobal rather than _global

use _isGlobal rather than _global

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/aligerum/umbriel.git/'


fix issue with creating color by hex string


Change order of biometric steps (#74)

Change order of biometric steps (#74)

* Change order of biometric validation steps

* Fix Bad call to variable

* Change order of biometric validation steps (#73)

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/e-gob/plataforma-kioscos-autoatencion.git/'


Comment out test

Comment out test

--- apps/artist/test/related_posts.coffee
+++ apps/artist/test/related_posts.coffee
@@ -38,9 +38,9 @@
       Backbone.sync.args[0][1].url.should.include 'api/v1/related/posts'
       Backbone.sync.args[0][2].data['artist[]'].should.equal @view.model.get('id')

-    xit 'doesnt render anything if there are no results', ->
-      Backbone.sync.args[0][2].success []
-      @view.$el.find('.artist-info-right .artist-related-posts').html().should.equal ''
+    #it 'doesnt render anything if there are no results', ->
+    #  Backbone.sync.args[0][2].success []
+    #  @view.$el.find('.artist-info-right .artist-related-posts').html().should.equal ''

     it 'renders the right content', ->
       Backbone.sync.args[0][2].success [


Export ScrollView from core

Export ScrollView from core

--- exports/atom-api.coffee
+++ exports/atom-api.coffee
@@ -9,3 +9,4 @@
   fs: require '../src/fs-utils'
   View: View
   RootView: require '../src/root-view'
+  ScrollView: require '../src/scroll-view'


payment: introducing payment method

payment: introducing payment method

This is a simple abstraction around payment methods so we can support many-to-one payment methods

error: pathspec 'workers/social/lib/social/models/recurly/paymentmethod.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/recurly/paymentmethod.coffee
+++ workers/social/lib/social/models/recurly/paymentmethod.coffee
@@ -0,0 +1,9 @@
+{Module} = require 'jraphical'
+
+module.exports = class JRecurlyPaymentMethod extends Module
+
+  @share()
+
+  @set
+    schema      :
+      recurlyId : String


Revert renaming in app/assets/javascripts/repository/clone-url.js.coffee.

--- app/assets/javascripts/repository/clone-url.js.coffee
+++ app/assets/javascripts/repository/clone-url.js.coffee
@@ -17,5 +17,5 @@

 jQuery ->
   activate_clone_url location.hash.substring(1)
-  $('a.clone_method_mapping').on 'click', ->
+  $('a.clone_method_link').on 'click', ->
     activate_clone_url $(this).data('clone')


[fix] Made 'osu.rank' use default name by default

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/Mikuia/Mikuia.git/'


[fix] [wow] Fixed a wow.character crash when PvP bracket info is empty for some reason


Add gmaps api key to map manager

Add gmaps api key to map manager

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/lonelyplanet/rizzo.git/'


chore: clean up

chore: clean up

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-gooddata-writers-list.git/'


Also reset for react component

Also reset for react component

--- resources/assets/coffee/react/_components/bbcode-editor.coffee
+++ resources/assets/coffee/react/_components/bbcode-editor.coffee
@@ -21,6 +21,7 @@

 class @BBCodeEditor extends React.Component
   componentDidMount: =>
+    @sizeSelect.value = ''
     @body.focus()

@@ -61,7 +62,7 @@
                 select
                   className: 'bbcode-size-select__select js-bbcode-btn--size'
                   disabled: @props.disabled
-                  defaultValue: '100'
+                  ref: @setSizeSelect
                   option value: '50', osu.trans('bbcode.size.tiny')
                   option value: '85', osu.trans('bbcode.size.small')
                   option value: '100', osu.trans('bbcode.size.normal')
@@ -96,6 +97,10 @@
     @body = element

+  setSizeSelect: (element) =>
+    @sizeSelect = element
+
+
   onKeyDown: (e) =>
     e.keyCode == 27 && @_cancel()


Fix title_paddingn direction on title_align='right'

--- bokehjs/src/coffee/models/annotations/title.coffee
+++ bokehjs/src/coffee/models/annotations/title.coffee
@@ -19,7 +19,7 @@
         vy = @_get_text_location(@mget('title_align'), @frame.get('v_range')) + @mget('title_padding')
       when 'right'
         vx = @canvas.get('right') - 1 #fudge factor due to error in text height measurement
-        vy = @canvas.get('height') - @_get_text_location(@mget('title_align'), @frame.get('v_range')) + @mget('title_padding')
+        vy = @canvas.get('height') - @_get_text_location(@mget('title_align'), @frame.get('v_range')) - @mget('title_padding')
       when 'above'
         vx = @_get_text_location(@mget('title_align'), @frame.get('h_range')) + @mget('title_padding')
         vy = @canvas.get('top') - 10 # Corresponds to the +10 added in get_size


[Server] fetch few mails from all boxes before fetching all

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/'


[Server] fix threading algorithm

[Server] fix threading algorithm


dont break on drafts with no subjects

dont break on drafts with no subjects

--- server/models/message.coffee
+++ server/models/message.coffee
@@ -548,7 +548,7 @@
         return callback null, mail.headers['x-gm-thrid']

     # is reply or forward
-    isReplyOrForward = mailutils.isReplyOrForward mail.subject
+    isReplyOrForward = mail.subject and mailutils.isReplyOrForward mail.subject

     # try to find by references
     references = mail.references or []


Add comment settings

Add comment settings

error: pathspec 'settings/language-jison.cson' did not match any file(s) known to git

--- settings/language-jison.cson
+++ settings/language-jison.cson
@@ -0,0 +1,3 @@
+".source.jison, .source.jisonlex":
+  editor:
+    commentStart: "// "


New file for constants

New file for constants

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

--- source/core/constants.coffee
+++ source/core/constants.coffee
@@ -0,0 +1,13 @@
+###
+Constants
+
+@namespace Atoms.Core
+@class Constants
+
+@author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
+###
+"use strict"
+
+Atoms.Core.Constants =
+
+  APPEND:  "append"


Added JSONP request method.

Added JSONP request method.

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

--- jsonp_request.js.coffee
+++ jsonp_request.js.coffee
@@ -0,0 +1,24 @@
+Utils =
+  jsonp_request: (src, options) ->
+    callback_name = options.callback || 'jsonp_callback'
+    on_success = options.onSuccess || ->
+    on_timeout = options.onTimeout || ->
+    timeout = options.timeout || 10
+
+    timeout_trigger = window.setTimeout ->
+      window[callback_name] = ->
+      on_timeout()
+    , timeout * 1000
+
+    window[callback_name] = (data) ->
+      window.clearTimeout timeout_trigger
+      on_success data
+
+    delimeter = if src.indexOf("?") < 0 then '?' else '&'
+    script = document.createElement('script')
+    script.type = 'text/javascript'
+    script.id = 'shareaholic_ajax'
+    script.async = true
+    script.src = src + delimeter + "callback=" + callback_name
+
+    document.getElementsByTagName('head')[0].appendChild(script)


fix typo

fix typo

--- src/utils/type_checking.coffee
+++ src/utils/type_checking.coffee
@@ -86,7 +86,7 @@

 reportCastIgnore = process.env.NODE_ENV not in ['production', 'test'] or
-                   process.end.NO_CAST_WARNING
+                   process.env.NO_CAST_WARNING

 exports.castObject = castObject = (raw, schema, target = {}, name) ->


treat final points, not score, as has points

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/UM-USElab/gradecraft-development.git/'


Add permafoster command

Add permafoster command

permafoster labels a Greyhound as a Permanent Foster.

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

--- scripts/permafoster.coffee
+++ scripts/permafoster.coffee
@@ -0,0 +1,44 @@
+# Description:
+#   Label a greyhound as a permanent foster
+#
+# Commands:
+#   hubot permafoster <greyhound> - Labels a greyhound as a permanent foster
+#
+# Author:
+#   Zach Whaley (zachwhaley) <zachbwhaley@gmail.com>
+
+capitalize = require 'capitalize'
+
+git = require '../lib/git'
+site = require '../lib/site'
+
+permafoster = (greyhound, callback) ->
+  site.loadGreyhound greyhound, (info, bio) ->
+    if not info?
+      return callback "Sorry, couldn't find #{greyhound} 😕"
+
+    if info.category is 'deceased'
+      return callback "#{capitalize(greyhound)} has crossed the Rainbow Bridge 😢"
+    if info.category is 'adopted'
+      return callback "#{capitalize(greyhound)} has already been adopted 😝"
+    if info.permafoster is yes
+      return callback "#{capitalize(greyhound)} is already a permanent foster 🤕"
+
+    info.permafoster = yes
+    site.dumpGreyhound greyhound, info, bio, callback
+
+module.exports = (robot) ->
+  robot.respond /permafoster (.*)/i, (res) ->
+    greyhound = res.match[1]?.toLowerCase()
+    gitOpts =
+      message: "#{capitalize(greyhound)} Permanent Foster 🤕"
+      branch: "permafoster-#{greyhound}"
+      user:
+        name: res.message.user?.real_name
+        email: res.message.user?.profile?.email
+
+    res.reply "Labeling #{capitalize(greyhound)} as a Permanent Foster 🤕\n" +
+              "Hang on a sec..."
+
+    git.update permafoster, greyhound, gitOpts, (update) ->
+      res.reply update


Add toShow matcher

Add toShow matcher

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -211,6 +211,13 @@
       element = element.get(0) if element.jquery
       element.webkitMatchesSelector(":focus") or element.querySelector(":focus")

+    toShow: ->
+      notText = if @isNot then " not" else ""
+      element = @actual
+      element = element.get(0) if element.jquery
+      @message = -> return "Expected element '#{element}' or its descendants #{notText} to show."
+      element.style.display in ['block', 'inline-block', 'static', 'fixed']
+
 window.keyIdentifierForKey = (key) ->
   if key.length > 1 # named key
     key


Allowed notifying from the callback promise in renderedEntities.

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/urbanetic/meteor-atlas-util.git/'


get tested_at and title in qa-reports query

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/leonidas/qa-dashboard.git/'


Add context menu for autocompleting

Add context menu for autocompleting

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

--- menus/autocomplete.cson
+++ menus/autocomplete.cson
@@ -0,0 +1,3 @@
+'context-menu':
+  '.overlayer':
+    'Autocomplete': 'autocomplete:attach'


[optimizer] Basic foundations of an optimizer

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/demhydraz/cafe.git/'


added initial callbacks spec for how callbacks should work

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

--- spec/callbacks.spec.coffee
+++ spec/callbacks.spec.coffee
@@ -0,0 +1,28 @@
+footrest = require('../lib/index')
+Model = require('../lib/model').Model
+
+class User extends Model
+  @type 'User'
+  @database = footrest.database('footrest')
+
+  @attr 'name', 'password', 'email', 'resume'
+  @beforeSave 'cleanResume'
+
+  cleanResume: ->
+    @resume = @resume.replace /\r\n?/g, "\n"
+
+describe 'callbacks', ->
+  beforeEach ->
+    @database = User.database
+
+    @database.destroy => @database.create => @recreated = true
+    waitsFor -> @recreated?
+
+  it 'should call beforeSave callbacks before saving', ->
+    user = new User
+      name: 'Brian'
+      resume: "Line one\r\n\r\r\r\nLine two"
+
+    expect(user.resume).toEqual "Line one\r\n\r\r\r\nLine two"
+    user.save (success) ->
+      expect(user.resume).toEqual "Line one\n\n\n\nLine two"


SerializeData function to extend model with primary roles

[#100026306]

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/people.git/'


Require atom after window

Require atom after window

--- spec/spec-bootstrap.coffee
+++ spec/spec-bootstrap.coffee
@@ -1,6 +1,6 @@
 try
+  require '../src/window'
   Atom = require '../src/atom'
-  require '../src/window'
   window.atom = new Atom()
   window.atom.show()
   {runSpecSuite} = require './jasmine-helper'


Move spec from tabs package

Move spec from tabs package

See https://github.com/atom/tabs/pull/274#issuecomment-190064071

Signed-off-by: Katrina Uychaco <ef0b2ab5bd1ac851826b76acd653f3c4825374fb@github.com>

--- spec/workspace-spec.coffee
+++ spec/workspace-spec.coffee
@@ -604,6 +604,25 @@
         runs ->
           expect(pane.getPendingItem()).toBeNull()

+    describe "when opening will switch from a pending tab to a permanent tab", ->
+      it "keeps the pending tab open", ->
+        editor1 = null
+        editor2 = null
+
+        waitsForPromise ->
+          atom.workspace.open('sample.txt').then (o) ->
+            editor1 = o
+
+        waitsForPromise ->
+          atom.workspace.open('sample2.txt', pending: true).then (o) ->
+            editor2 = o
+
+        runs ->
+          pane = atom.workspace.getActivePane()
+          pane.activateItem(editor1)
+          expect(pane.getItems().length).toBe 2
+          expect(pane.getItems()).toEqual [editor1, editor2]
+
   describe "::reopenItem()", ->
     it "opens the uri associated with the last closed pane that isn't currently open", ->
       pane = workspace.getActivePane()


Adjust comments

Adjust comments

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/'


app: add reactivity feature flag

app: add reactivity feature flag

error: pathspec 'client/app/lib/util/isReactivityEnabled.coffee' did not match any file(s) known to git

--- client/app/lib/util/isReactivityEnabled.coffee
+++ client/app/lib/util/isReactivityEnabled.coffee
@@ -0,0 +1,4 @@
+checkFlag = require 'app/util/checkFlag'
+
+module.exports = -> checkFlag 'reactivity'
+


Removed call to setup from breakpoint size method

--- app/assets/javascripts/breakpoints.coffee
+++ app/assets/javascripts/breakpoints.coffee
@@ -14,12 +14,11 @@
       return if $(allDeviceSelector.join(",")).length

       # Create all the elements
-      $.each BREAKPOINTS, (i, breakpoint) ->
-        $("body").append "

"
+      els = $.map BREAKPOINTS, (breakpoint) ->
+        "

"
+      $("body").append els.join('')

     getBreakpointSize: ->
-      @setup()
-
       allDeviceSelector = BREAKPOINTS.map (breakpoint) ->
         ".device-#{breakpoint}"

@@ -30,4 +29,5 @@
   @get: ->
     return instance ?= new BreakpointInstance

-@bp = Breakpoints.get()
+$ =>
+  @bp = Breakpoints.get()


Static legend

Static legend

--- app/coffeescripts/DemandVisualizer.coffee
+++ app/coffeescripts/DemandVisualizer.coffee
@@ -38,14 +38,47 @@
     height = 400
     padding = 50

-    @graph = d3.select(sel).append("svg:svg").
-      attr("width", width + padding).
-      attr("height", height + padding)
+    @graph = d3.select(sel).append('svg:svg').
+      attr('width', width + padding).
+      attr('height', height + padding)

     @graph.append("svg:rect").
       attr("width", width + padding).
       attr("height", height + padding).
       attr("fill", 'white')
+
+    @graph.append("svg:rect").
+      attr('id', 'legend').
+      attr('x', 5).
+      attr('y', 5).
+      attr('width', width + padding - 10).
+      attr('height', padding - 12).
+      attr('fill', 'white').
+      attr('stroke', 'lightGray')
+
+    @graph.append('svg:text').
+      attr('x', 10).
+      attr('y', 30).
+      style('font-size', '20px').
+      text('Legend')
+
+    _.each @typeOrder.get('vehicle_type'), (vtype, idx) =>
+      name = vtype.get('name')
+
+      @graph.append('svg:text').
+        attr('x', 100 + 50*idx).
+        attr('y', 30).
+        style('font-size', '14px').
+        style('background-color', vehicleTypeColors[idx]).
+        text(name)
+
+      @graph.append('svg:rect').
+        attr('x', 100 + 50*idx).
+        attr('y', 10).
+        attr('width', 50).
+        attr('height', 30).
+        attr('opacity', '0.4').
+        attr('fill', vehicleTypeColors[idx])

     vals = @demand.demands_by_vehicle_type()


added options object

added options object

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

--- src/gg/core/options.coffee
+++ src/gg/core/options.coffee
@@ -0,0 +1,10 @@
+
+class gg.core.Options
+
+  constructor: (@g, @spec) ->
+    @width = _.findGood [@spec.width, @spec.w, 800]
+    @height = _.findGood [@spec.height, @spec.h, 600]
+    @w = @width
+    @h = @height
+    @title = _.findGood [@spec.title, null]
+


updated cson file for atom

updated cson file for atom

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/hubwub/holman-dotfiles.git/'


allow view name to include slashes

allow view name to include slashes

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/'


[Client] fix mailbox default ID

[Client] fix mailbox default ID

--- client/app/router.coffee
+++ client/app/router.coffee
@@ -41,10 +41,10 @@
     _getDefaultParameters: (action) ->
         switch action
             when 'account.mailbox.messages'
-                defaultAccount = AccountStore.getDefault()
-                defaultMailbox = defaultAccount?.get('mailboxes').first()
+                defaultAccountID = AccountStore.getDefault()?.get 'id'
+                defaultMailbox = AccountStore.getDefaultMailbox defaultAccountID
                 defaultParameters =
-                    accountID: defaultAccount?.get 'id'
+                    accountID: defaultAccountID
                     mailboxID: defaultMailbox?.get 'id'
                     page: 1
             when 'account.config'


remove end message at the end of the 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/clochix/cozy-emails.git/'


Added support for module as function in addModule

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/renanhangai/servitude.git/'


Force the progress bar update when we get a code response answer.


removed debugging statement

removed debugging statement

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/Snitzle/hummingbird.git/'


waitsForPromise can wait for calls to fail

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -90,7 +90,8 @@

 window.waitsForPromise = (fn) ->
   window.waitsFor (moveOn) ->
-    fn().done(moveOn)
+    promise = fn()
+    promise.then promise.done(moveOn), promise.fail(moveOn)

 window.resetTimeouts = ->
   window.now = 0


Use relative require path to jasmine stylesheet

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -20,7 +20,7 @@
 clipboard = require 'clipboard'

 atom.loadBaseStylesheets()
-requireStylesheet "jasmine"
+requireStylesheet '../static/jasmine'

 fixturePackagesPath = fsUtils.resolveOnLoadPath('fixtures/packages')
 config.packageDirPaths.unshift(fixturePackagesPath)


Adding the httpcat plugin. Returns a specified http status code as portrayed by a cat.

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

--- src/scripts/httpcat.coffee
+++ src/scripts/httpcat.coffee
@@ -0,0 +1,38 @@
+# Description:
+#   Loads a specified HTTP cat error image from
+#   http://httpcats.herokuapp.com/
+#   based on user input
+#
+# Dependencies:
+#    none
+#
+# Configuration:
+#   None
+#
+# Commands:
+#    hubot httpcat <status> - get your status cat image
+#
+#    hubot httpcat help - explains usage
+#
+# Notes:
+#    None
+#
+# Author:
+#    @commadelimited
+
+codes = [100, 101, 200, 201, 202, 204, 206, 207, 300, 301, 303, 304, 305, 307, 400, 401, 402, 403, 404,
+        405, 406, 408, 409, 410, 411, 413, 414, 416, 417, 418, 422, 423, 424, 425, 426, 429, 431, 444,
+        450, 500, 502, 503, 506, 507, 508, 509, 599]
+
+module.exports = (robot) ->
+    robot.respond /httpcat (\d{3})/i, (msg) ->
+        status = msg.match[1]
+
+        if (codes.indexOf(status))
+            msg.send 'http://httpcats.herokuapp.com/' + status + '.jpg'
+        else
+            msg.send 'Sorry nothing found'
+
+
+    robot.respond /httpcat help/i, (msg) ->
+        msg.send "Usage: httpcat <http status code>; a number"


Script to interact with Beanstalk repositories

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

--- src/scripts/beanstalk.coffee
+++ src/scripts/beanstalk.coffee
@@ -0,0 +1,84 @@
+# Beanstalk tools
+#
+# You need to set the following variables:
+#   HUBOT_BEANSTALK_SUBDOMAIN ="<company subdomain>"
+#   HUBOT_BEANSTALK_ACCOUNT ="<beanstalk account>"
+#   HUBOT_BEANSTALK_PASSWORD ="<beanstalk password>"
+#
+# beanstalk repositories - List beanstalk repositories
+# beanstalk commits - List beanstalk recent commits
+# beanstalk users - List beanstalk users
+# beanstalk deployments - List beanstalk recent deployments
+#
+# Developed by One Mighty Roar - http://github.com/onemightyroar
+
+module.exports = (robot) ->
+
+  robot.respond /beanstalk repositories/i, (msg) ->
+    beanstalk_request msg, 'api/repositories.json', (repositories) ->
+      if repositories.count <= 0
+        msg.send "No repositories found for this account"
+        return
+
+      for child in repositories
+        repository = child.repository
+        msg.send "#{repository.name} (#{repository.vcs}) -> Last commit: #{repository.last_commit_at}"
+
+  robot.respond /beanstalk commits/i, (msg) ->
+    beanstalk_request msg, 'api/changesets.json', (changesets) ->
+
+      if changesets.count <= 0
+        msg.send "No changesets found for this account"
+        return
+
+      repositories = [ ]
+      beanstalk_request msg, 'api/repositories.json', (result) ->
+        for child in result
+          repositories["#{child.repository.id}"] = child.repository
+
+        for child in changesets
+          changeset = child.revision_cache
+          msg.send repositories["#{changeset.repository_id}"].name + " -> Committed: #{changeset.time} by #{changeset.author}"
+
+  robot.respond /beanstalk users/i, (msg) ->
+    beanstalk_request msg, 'api/users.json', (users) ->
+
+      if users.count <= 0
+        msg.send "No users found for this account"
+        return
+
+      for child in users
+        user = child.user
+        role = if user.owner then "owner" else if user.admin then "admin" else "user"
+        msg.send "#{user.first_name} #{user.last_name} (#{user.email}) -> Role: #{role} Joined: #{user. created_at}"
+
+  robot.respond /beanstalk deployments/i, (msg) ->
+    beanstalk_request msg, 'api/releases.json', (deployments) ->
+
+      if deployments <= 0
+        msg.send "No deployments found for this account"
+        return
+
+      repositories = [ ]
+      beanstalk_request msg, 'api/repositories.json', (result) ->
+        for child in result
+          repositories["#{child.repository.id}"] = child.repository
+
+        for child in deployments
+          deployment = child.release
+          msg.send repositories["#{deployment.repository_id}"].name + " deployed to #{deployment.environment_name} on #{deployment.created_at}"
+
+  beanstalk_request = (msg, url, handler) ->
+    auth = new Buffer("#{process.env.HUBOT_BEANSTALK_ACCOUNT}:#{process.env.HUBOT_BEANSTALK_PASSWORD}").toString('base64')
+    beanstalk_url = "https://#{process.env.HUBOT_BEANSTALK_SUBDOMAIN}.beanstalkapp.com"
+    msg.http("#{beanstalk_url}/#{url}")
+      .headers(Authorization: "Basic #{auth}", Accept: "application/json")
+        .get() (err, res, body) ->
+          if err
+            msg.send "Beanstalk says: #{err}"
+            return
+          content = JSON.parse(body)
+          if content.errors
+            msg.send "Beanstalk says: #{content.errors[0]}"
+            return
+          handler content


correctly check for changes in path (panels) so we don't loose audio

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/'


Fully implement Bootstrapper class for start up bootstrapping.

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/JoshuaToenyes/stout-core.git/'


:lipstick:

:lipstick:

--- src/app/atom-package.coffee
+++ src/app/atom-package.coffee
@@ -78,7 +78,7 @@
   getActivationEvents: -> @metadata.activationEvents

   loadMetadata: ->
-    if metadataPath = fs.resolveExtension(fs.join(@path, "package"), ['cson', 'json'])
+    if metadataPath = fs.resolveExtension(fs.join(@path, 'package'), ['cson', 'json'])
       @metadata = fs.readObject(metadataPath)
     @metadata ?= {}


Filter null/undefined arguments on Windows

These won't be able to be properly quoted

--- src/buffered-process.coffee
+++ src/buffered-process.coffee
@@ -44,15 +44,14 @@
     if process.platform is "win32"
       # Quote all arguments and escapes inner quotes
       if args?
+        cmdArgs = args.filter (arg) -> arg?
         cmdArgs = args.map (arg) ->
           if command in ['explorer.exe', 'explorer'] and /^\/[a-zA-Z]+,.*$/.test(arg)
             # Don't wrap /root,C:\folder style arguments to explorer calls in
             # quotes since they will not be interpreted correctly if they are
             arg
-          else if typeof arg is 'string'
-            "\"#{arg.replace(/"/g, '\\"')}\""
           else
-            arg
+            "\"#{arg.toString().replace(/"/g, '\\"')}\""
       else
         cmdArgs = []
       if /\s/.test(command)


Updates to Modularity.coffee 0.3.0

Updates to Modularity.coffee 0.3.0

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/modularity-rails.git/'


:lipstick: method name

:lipstick: method name

--- src/editor-component.coffee
+++ src/editor-component.coffee
@@ -481,7 +481,7 @@
     @subscribe atom.config.observe 'editor.showInvisibles', @setShowInvisibles
     @subscribe atom.config.observe 'editor.showLineNumbers', @setShowLineNumbers
     @subscribe atom.config.observe 'editor.scrollSensitivity', @setScrollSensitivity
-    @subscribe atom.config.observe 'editor.useHardwareAcceleration', @setuseHardwareAcceleration
+    @subscribe atom.config.observe 'editor.useHardwareAcceleration', @setUseHardwareAcceleration

   onFocus: ->
     @refs.input.focus()
@@ -874,7 +874,7 @@
     if scrollSensitivity = parseInt(scrollSensitivity)
       @scrollSensitivity = Math.abs(scrollSensitivity) / 100

-  setuseHardwareAcceleration: (useHardwareAcceleration) ->
+  setUseHardwareAcceleration: (useHardwareAcceleration=true) ->
     unless @useHardwareAcceleration is useHardwareAcceleration
       @useHardwareAcceleration = useHardwareAcceleration
       @requestUpdate()


Set model's $new property to `true` when creating new model.

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/RobotSnacks/stout-orm.git/'


Coffee script for Google Analytics !!!TODO Add AnalyticsID!!!

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

--- source/javascripts/google_analytics.js.coffee
+++ source/javascripts/google_analytics.js.coffee
@@ -0,0 +1,43 @@
+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(document.location.pathname)
+      ), true
+    else
+      GoogleAnalytics.trackPageview(document.location.pathname)
+
+  @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: ->
+    # your google analytics ID(s) here...
+    'UA-XXXXXXX-XX'
+
+GoogleAnalytics.load()


Convert script: implement basic version.

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

--- scripts/convert._coffee
+++ scripts/convert._coffee
@@ -0,0 +1,37 @@
+#!/usr/bin/env _coffee
+#
+# Converts content that we have in our database but haven't converted yet.
+#
+# See these issues:
+#
+# https://github.com/zoomhub/zoomhub/issues/89
+# https://github.com/zoomhub/zoomhub/issues/91
+#
+# Usage:
+#
+# </path/to/this/script> <id>
+#
+
+assert = require 'assert'
+Content = require '../lib/content'
+Worker = require '../lib/worker'
+
+echo = console.log
+erro = console.error
+{exit} = process
+
+[id] = process.argv[2..]
+if not id
+    erro 'Usage: </path/to/this/script> <id>'
+    exit 1
+
+if not content = Content.getById id, _
+    erro 'No content with ID:', id
+    exit 2
+
+label = "Content with ID #{id} converted! Time taken"
+console.time label
+
+Worker.process content, _
+
+console.timeEnd label


add game api

add game api

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

--- app/js/services/game_api.coffee
+++ app/js/services/game_api.coffee
@@ -0,0 +1,110 @@
+# Warning: this is a generated file, any changes made here will be overwritten by the build process
+
+class GameAPI
+
+  constructor: (@q, @log, @rpc) ->
+    #@log.info "---- Network API Constructor ----"
+
+
+  # Attempts add or remove <node> from the peer list or try a connection to <node> once
+  # parameters:
+  #   string `node` - The node (see network_get_peer_info for nodes), example: 192.168.1.5:5678
+  #   string `command` - 'add' to add a node to the list, 'remove' to remove a node from the list, 'onetry' to try a connection to the node once, example: add
+  # return_type: `void`
+  network_add_node: (node, command, error_handler = null) ->
+    @rpc.request('network_add_node', [node, command], error_handler).then (response) ->
+      response.result
+
+  # Returns the number of fully-established connections to other nodes
+  # parameters:
+  # return_type: `uint32_t`
+  network_get_connection_count: (error_handler = null) ->
+    @rpc.request('network_get_connection_count', error_handler).then (response) ->
+      response.result
+
+  # Returns data about each connected node
+  # parameters:
+  #   bool `not_firewalled` - true to output only peers not behind a firewall and false otherwise
+  # return_type: `json_object_array`
+  network_get_peer_info: (not_firewalled, error_handler = null) ->
+    @rpc.request('network_get_peer_info', [not_firewalled], error_handler).then (response) ->
+      response.result
+
+  # Broadcast a previously-created signed transaction to the network
+  # parameters:
+  #   signed_transaction `transaction_to_broadcast` - The transaction to broadcast to the network
+  # return_type: `transaction_id`
+  network_broadcast_transaction: (transaction_to_broadcast, error_handler = null) ->
+    @rpc.request('network_broadcast_transaction', [transaction_to_broadcast], error_handler).then (response) ->
+      response.result
+
+  # Sets advanced node parameters, used for setting up automated tests
+  # parameters:
+  #   json_object `params` - A JSON object containing the name/value pairs for the parameters to set
+  # return_type: `void`
+  network_set_advanced_node_parameters: (params, error_handler = null) ->
+    @rpc.request('network_set_advanced_node_parameters', [params], error_handler).then (response) ->
+      response.result
+
+  # Sets advanced node parameters, used for setting up automated tests
+  # parameters:
+  # return_type: `json_object`
+  network_get_advanced_node_parameters: (error_handler = null) ->
+    @rpc.request('network_get_advanced_node_parameters', error_handler).then (response) ->
+      response.result
+
+  # Returns the time the transaction was first seen by this client
+  # parameters:
+  #   transaction_id `transaction_id` - the id of the transaction
+  # return_type: `message_propagation_data`
+  network_get_transaction_propagation_data: (transaction_id, error_handler = null) ->
+    @rpc.request('network_get_transaction_propagation_data', [transaction_id], error_handler).then (response) ->
+      response.result
+
+  # Returns the time the block was first seen by this client
+  # parameters:
+  #   block_id_type `block_hash` - the id of the block
+  # return_type: `message_propagation_data`
+  network_get_block_propagation_data: (block_hash, error_handler = null) ->
+    @rpc.request('network_get_block_propagation_data', [block_hash], error_handler).then (response) ->
+      response.result
+
+  # Sets the list of peers this node is allowed to connect to
+  # parameters:
+  #   node_id_list `allowed_peers` - the list of allowable peers
+  # return_type: `void`
+  network_set_allowed_peers: (allowed_peers, error_handler = null) ->
+    @rpc.request('network_set_allowed_peers', [allowed_peers], error_handler).then (response) ->
+      response.result
+
+  # Returns assorted information about the network settings and connections
+  # parameters:
+  # return_type: `json_object`
+  network_get_info: (error_handler = null) ->
+    @rpc.request('network_get_info', error_handler).then (response) ->
+      response.result
+
+  # Returns list of potential peers
+  # parameters:
+  # return_type: `potential_peer_record_array`
+  network_list_potential_peers: (error_handler = null) ->
+    @rpc.request('network_list_potential_peers', error_handler).then (response) ->
+      response.result
+
+  # Get information on UPNP status including whether it's enabled and what the client believes its IP to be
+  # parameters:
+  # return_type: `json_object`
+  network_get_upnp_info: (error_handler = null) ->
+    @rpc.request('network_get_upnp_info', error_handler).then (response) ->
+      response.result
+
+  # Get bandwidth usage stats
+  # parameters:
+  # return_type: `json_object`
+  network_get_usage_stats: (error_handler = null) ->
+    @rpc.request('network_get_usage_stats', error_handler).then (response) ->
+      response.result
+
+
+
+angular.module("app").service("GameAPI", ["$q", "$log", "RpcService", GameAPI])


Added -g flag to npm install instructions

--- src/docco.coffee
+++ src/docco.coffee
@@ -20,7 +20,7 @@
 # from [its Mercurial repo](http://dev.pocoo.org/hg/pygments-main)), and
 # [CoffeeScript](http://coffeescript.org/). Then, with NPM:
 #
-#     sudo npm install docco
+#     sudo npm install -g docco
 #
 # Docco can be used to process CoffeeScript, JavaScript, Ruby, Python, or TeX files.
 # Only single-line comments are processed -- block comments are ignored.


Removes unnecessary commas

Removes unnecessary commas

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/TalkFusionDev/angular-emoji-filter-hd.git/'


Remove old keymap-spec. It has been supplanted by the atom-keymap npm

--- spec/keymap-spec.coffee
+++ spec/keymap-spec.coffee
@@ -1,464 +0,0 @@
-fs = require 'fs-plus'
-path = require 'path'
-temp = require 'temp'
-Keymap = require 'atom-keymap'
-require '../src/keymap-extensions'
-{$, $$, WorkspaceView} = require 'atom'
-
-describe "Keymap", ->
-  fragment = null
-  keymap = null
-  resourcePath = atom.getLoadSettings().resourcePath
-  configDirPath = null
-
-  beforeEach ->
-    configDirPath = temp.mkdirSync('atom')
-    keymap = new Keymap
-    keymap.configDirPath = configDirPath
-    keymap.resourcePath = resourcePath
-
-    fragment = $ """
-

-

-

-

-

-    """
-
-  afterEach ->
-    keymap.destroy()
-
-  describe ".handleKeyEvent(event)", ->
-    deleteCharHandler = null
-    insertCharHandler = null
-    commandZHandler = null
-
-    beforeEach ->
-      keymap.bindKeys 'name', '.command-mode', 'x': 'deleteChar'
-      keymap.bindKeys 'name', '.insert-mode', 'x': 'insertChar'
-      keymap.bindKeys 'name', '.command-mode', 'cmd-z': 'commandZPressed'
-
-      deleteCharHandler = jasmine.createSpy('deleteCharHandler')
-      insertCharHandler = jasmine.createSpy('insertCharHandler')
-      commandZHandler = jasmine.createSpy('commandZHandler')
-      fragment.on 'deleteChar', deleteCharHandler
-      fragment.on 'insertChar', insertCharHandler
-      fragment.on 'commandZPressed', commandZHandler
-
-    describe "when no binding matches the event's keystroke", ->
-      it "does not return false so the event continues to propagate", ->
-        expect(keymap.handleKeyEvent(keydownEvent('0', target: fragment[0]))).not.toBe false
-
-    describe "when a non-English keyboard language is used", ->
-      it "uses the physical character pressed instead of the character it maps to in the current language", ->
-        event = keydownEvent('U+03B6', metaKey: true, which: 122, target: fragment[0]) # This is the 'z' key using the Greek keyboard layout
-        result = keymap.handleKeyEvent(event)
-
-        expect(result).toBe(false)
-        expect(commandZHandler).toHaveBeenCalled()
-
-    describe "when at least one binding fully matches the event's keystroke", ->
-      describe "when the event's target node matches a selector with a matching binding", ->
-        it "triggers the command event associated with that binding on the target node and returns false", ->
-          result = keymap.handleKeyEvent(keydownEvent('x', target: fragment[0]))
-          expect(result).toBe(false)
-          expect(deleteCharHandler).toHaveBeenCalled()
-          expect(insertCharHandler).not.toHaveBeenCalled()
-
-          deleteCharHandler.reset()
-          fragment.removeClass('command-mode').addClass('insert-mode')
-
-          event = keydownEvent('x', target: fragment[0])
-          keymap.handleKeyEvent(event)
-          expect(deleteCharHandler).not.toHaveBeenCalled()
-          expect(insertCharHandler).toHaveBeenCalled()
-
-      describe "when the event's target node *descends* from a selector with a matching binding", ->
-        it "triggers the command event associated with that binding on the target node and returns false", ->
-          target = fragment.find('.child-node')[0]
-          result = keymap.handleKeyEvent(keydownEvent('x', target: target))
-          expect(result).toBe(false)
-          expect(deleteCharHandler).toHaveBeenCalled()
-          expect(insertCharHandler).not.toHaveBeenCalled()
-
-          deleteCharHandler.reset()
-          fragment.removeClass('command-mode').addClass('insert-mode')
-
-          keymap.handleKeyEvent(keydownEvent('x', target: target))
-          expect(deleteCharHandler).not.toHaveBeenCalled()
-          expect(insertCharHandler).toHaveBeenCalled()
-
-      describe "when the event's target node descends from multiple nodes that match selectors with a binding", ->
-        beforeEach ->
-          keymap.bindKeys 'name', '.child-node', 'x': 'foo'
-
-        it "only triggers bindings on selectors associated with the closest ancestor node", ->
-          fooHandler = jasmine.createSpy 'fooHandler'
-          fragment.on 'foo', fooHandler
-
-          target = fragment.find('.grandchild-node')[0]
-          keymap.handleKeyEvent(keydownEvent('x', target: target))
-          expect(fooHandler).toHaveBeenCalled()
-          expect(deleteCharHandler).not.toHaveBeenCalled()
-          expect(insertCharHandler).not.toHaveBeenCalled()
-
-        describe "when 'abortKeyBinding' is called on the triggered event", ->
-          [fooHandler1, fooHandler2] = []
-
-          beforeEach ->
-            fooHandler1 = jasmine.createSpy('fooHandler1').andCallFake (e) ->
-              expect(deleteCharHandler).not.toHaveBeenCalled()
-              e.abortKeyBinding()
-            fooHandler2 = jasmine.createSpy('fooHandler2')
-
-            fragment.find('.child-node').on 'foo', fooHandler1
-            fragment.on 'foo', fooHandler2
-
-          it "aborts the current event and tries again with the next-most-specific key binding",  ->
-            target = fragment.find('.grandchild-node')[0]
-            keymap.handleKeyEvent(keydownEvent('x', target: target))
-            expect(fooHandler1).toHaveBeenCalled()
-            expect(fooHandler2).not.toHaveBeenCalled()
-            expect(deleteCharHandler).toHaveBeenCalled()
-
-          it "does not throw an exception if the event was not triggered by the keymap",  ->
-            fragment.find('.grandchild-node').trigger 'foo'
-
-      describe "when the event bubbles to a node that matches multiple selectors", ->
-        describe "when the matching selectors differ in specificity", ->
-          it "triggers the binding for the most specific selector", ->
-            keymap.bindKeys 'name', 'div .child-node', 'x': 'foo'
-            keymap.bindKeys 'name', '.command-mode .child-node !important', 'x': 'baz'
-            keymap.bindKeys 'name', '.command-mode .child-node', 'x': 'quux'
-            keymap.bindKeys 'name', '.child-node', 'x': 'bar'
-
-            fooHandler = jasmine.createSpy 'fooHandler'
-            barHandler = jasmine.createSpy 'barHandler'
-            bazHandler = jasmine.createSpy 'bazHandler'
-            fragment.on 'foo', fooHandler
-            fragment.on 'bar', barHandler
-            fragment.on 'baz', bazHandler
-
-            target = fragment.find('.grandchild-node')[0]
-            keymap.handleKeyEvent(keydownEvent('x', target: target))
-
-            expect(fooHandler).not.toHaveBeenCalled()
-            expect(barHandler).not.toHaveBeenCalled()
-            expect(bazHandler).toHaveBeenCalled()
-
-        describe "when the matching selectors have the same specificity", ->
-          it "triggers the bindings for the most recently declared selector", ->
-            keymap.bindKeys 'name', '.child-node', 'x': 'foo', 'y': 'baz'
-            keymap.bindKeys 'name', '.child-node', 'x': 'bar'
-
-            fooHandler = jasmine.createSpy 'fooHandler'
-            barHandler = jasmine.createSpy 'barHandler'
-            bazHandler = jasmine.createSpy 'bazHandler'
-            fragment.on 'foo', fooHandler
-            fragment.on 'bar', barHandler
-            fragment.on 'baz', bazHandler
-
-            target = fragment.find('.grandchild-node')[0]
-            keymap.handleKeyEvent(keydownEvent('x', target: target))
-
-            expect(barHandler).toHaveBeenCalled()
-            expect(fooHandler).not.toHaveBeenCalled()
-
-            keymap.handleKeyEvent(keydownEvent('y', target: target))
-            expect(bazHandler).toHaveBeenCalled()
-
-      describe "when the event's target is the document body", ->
-        xit "triggers the mapped event on the workspaceView", ->
-          atom.workspaceView = new WorkspaceView
-          atom.workspaceView.attachToDom()
-          keymap.defaultTarget = atom.workspaceView[0]
-          keymap.bindKeys 'name', 'body', 'x': 'foo'
-          fooHandler = jasmine.createSpy("fooHandler")
-          atom.workspaceView.on 'foo', fooHandler
-
-          result = keymap.handleKeyEvent(keydownEvent('x', target: document.body))
-          expect(result).toBe(false)
-          expect(fooHandler).toHaveBeenCalled()
-          expect(deleteCharHandler).not.toHaveBeenCalled()
-          expect(insertCharHandler).not.toHaveBeenCalled()
-
-      describe "when the event matches a 'native!' binding", ->
-        it "returns true, allowing the browser's native key handling to process the event", ->
-          keymap.bindKeys 'name', '.grandchild-node', 'x': 'native!'
-          nativeHandler = jasmine.createSpy("nativeHandler")
-          fragment.on 'native!', nativeHandler
-          expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment.find('.grandchild-node')[0]))).toBe true
-          expect(nativeHandler).not.toHaveBeenCalled()
-
-    describe "when at least one binding partially matches the event's keystroke", ->
-      [quitHandler, closeOtherWindowsHandler] = []
-
-      beforeEach ->
-        keymap.bindKeys 'name', "*",
-          'ctrl-x ctrl-c': 'quit'
-          'ctrl-x 1': 'close-other-windows'
-
-        quitHandler = jasmine.createSpy('quitHandler')
-        closeOtherWindowsHandler = jasmine.createSpy('closeOtherWindowsHandler')
-        fragment.on 'quit', quitHandler
-        fragment.on 'close-other-windows', closeOtherWindowsHandler
-
-      it "only matches entire keystroke patterns", ->
-        expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).not.toBe false
-
-      describe "when the event's target node matches a selector with a partially matching multi-stroke binding", ->
-        describe "when a second keystroke added to the first to match a multi-stroke binding completely", ->
-          it "triggers the event associated with the matched multi-stroke binding", ->
-            expect(keymap.handleKeyEvent(keydownEvent('ctrl', target: fragment[0]))).toBeTruthy() # This simulates actual key event behavior
-            expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBeFalsy()
-            expect(keymap.handleKeyEvent(keydownEvent('ctrl', target: fragment[0]))).toBeFalsy() # This simulates actual key event behavior
-            expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0], ctrlKey: true))).toBeFalsy()
-
-            expect(quitHandler).toHaveBeenCalled()
-
-            expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
-            quitHandler.reset()
-
-            expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBeFalsy()
-            expect(keymap.handleKeyEvent(keydownEvent('1', target: fragment[0]))).toBeFalsy()
-
-            expect(quitHandler).not.toHaveBeenCalled()
-            expect(closeOtherWindowsHandler).toHaveBeenCalled()
-
-        describe "when a second keystroke added to the first doesn't match any bindings", ->
-          it "clears the queued keystroke without triggering any events", ->
-            expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBe false
-            expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).toBe true
-            expect(quitHandler).not.toHaveBeenCalled()
-            expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
-
-            expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).not.toBe false
-
-      describe "when the event's target node descends from multiple nodes that match selectors with a partial binding match", ->
-        it "allows any of the bindings to be triggered upon a second keystroke, favoring the most specific selector", ->
-          keymap.bindKeys 'name', ".grandchild-node", 'ctrl-x ctrl-c': 'more-specific-quit'
-          grandchildNode = fragment.find('.grandchild-node')[0]
-          moreSpecificQuitHandler = jasmine.createSpy('moreSpecificQuitHandler')
-          fragment.on 'more-specific-quit', moreSpecificQuitHandler
-
-          expect(keymap.handleKeyEvent(keydownEvent('x', target: grandchildNode, ctrlKey: true))).toBeFalsy()
-          expect(keymap.handleKeyEvent(keydownEvent('1', target: grandchildNode))).toBeFalsy()
-          expect(quitHandler).not.toHaveBeenCalled()
-          expect(moreSpecificQuitHandler).not.toHaveBeenCalled()
-          expect(closeOtherWindowsHandler).toHaveBeenCalled()
-          closeOtherWindowsHandler.reset()
-
-          expect(keymap.handleKeyEvent(keydownEvent('x', target: grandchildNode, ctrlKey: true))).toBeFalsy()
-          expect(keymap.handleKeyEvent(keydownEvent('c', target: grandchildNode, ctrlKey: true))).toBeFalsy()
-          expect(quitHandler).not.toHaveBeenCalled()
-          expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
-          expect(moreSpecificQuitHandler).toHaveBeenCalled()
-
-      describe "when there is a complete binding with a less specific selector", ->
-        it "favors the more specific partial match", ->
-
-      describe "when there is a complete binding with a more specific selector", ->
-        it "favors the more specific complete match", ->
-
-  describe ".bindKeys(name, selector, bindings)", ->
-    it "normalizes bindings that use shift with lower case alpha char", ->
-      fooHandler = jasmine.createSpy('fooHandler')
-      fragment.on 'foo', fooHandler
-      keymap.bindKeys 'name', '*', 'ctrl-shift-l': 'foo'
-      result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
-      expect(result).toBe(false)
-      expect(fooHandler).toHaveBeenCalled()
-
-    it "normalizes bindings that use shift with upper case alpha char", ->
-      fooHandler = jasmine.createSpy('fooHandler')
-      fragment.on 'foo', fooHandler
-      keymap.bindKeys 'name', '*', 'ctrl-shift-L': 'foo'
-      result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
-      expect(result).toBe(false)
-      expect(fooHandler).toHaveBeenCalled()
-
-    it "normalizes bindings that use an upper case alpha char without shift", ->
-      fooHandler = jasmine.createSpy('fooHandler')
-      fragment.on 'foo', fooHandler
-      keymap.bindKeys 'name', '*', 'ctrl-L': 'foo'
-      result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
-      expect(result).toBe(false)
-      expect(fooHandler).toHaveBeenCalled()
-
-    it "normalizes the key patterns in the hash to put the modifiers in alphabetical order", ->
-      fooHandler = jasmine.createSpy('fooHandler')
-      fragment.on 'foo', fooHandler
-      keymap.bindKeys 'name', '*', 'ctrl-alt-delete': 'foo'
-      result = keymap.handleKeyEvent(keydownEvent('delete', ctrlKey: true, altKey: true, target: fragment[0]))
-      expect(result).toBe(false)
-      expect(fooHandler).toHaveBeenCalled()
-
-      fooHandler.reset()
-      keymap.bindKeys 'name', '*', 'ctrl-alt--': 'foo'
-      result = keymap.handleKeyEvent(keydownEvent('-', ctrlKey: true, altKey: true, target: fragment[0]))
-      expect(result).toBe(false)
-      expect(fooHandler).toHaveBeenCalled()
-
-  describe ".remove(name)", ->
-    it "removes the binding set with the given selector and bindings", ->
-      keymap.add 'nature',
-        '.green':
-          'ctrl-c': 'cultivate'
-        '.brown':
-          'ctrl-h': 'harvest'
-
-      keymap.add 'medical',
-        '.green':
-          'ctrl-v': 'vomit'
-
-      expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'green')).toHaveLength 2
-      expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'brown')).toHaveLength 1
-
-      keymap.remove('nature')
-
-      expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'green')).toHaveLength 1
-      expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'brown')).toEqual []
-
-  describe ".keystrokeStringForEvent(event)", ->
-    describe "when no modifiers are pressed", ->
-      it "returns a string that identifies the key pressed", ->
-        expect(keymap.keystrokeStringForEvent(keydownEvent('a'))).toBe 'a'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('['))).toBe '['
-        expect(keymap.keystrokeStringForEvent(keydownEvent('*'))).toBe '*'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('left'))).toBe 'left'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('\b'))).toBe 'backspace'
-
-    describe "when ctrl, alt or command is pressed with a non-modifier key", ->
-      it "returns a string that identifies the key pressed", ->
-        expect(keymap.keystrokeStringForEvent(keydownEvent('a', altKey: true))).toBe 'alt-a'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('[', metaKey: true))).toBe 'cmd-['
-        expect(keymap.keystrokeStringForEvent(keydownEvent('*', ctrlKey: true))).toBe 'ctrl-*'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('left', ctrlKey: true, metaKey: true, altKey: true))).toBe 'ctrl-alt-cmd-left'
-
-    describe "when shift is pressed when a non-modifer key", ->
-      it "returns a string that identifies the key pressed", ->
-        expect(keymap.keystrokeStringForEvent(keydownEvent('A', shiftKey: true))).toBe 'shift-A'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('{', shiftKey: true))).toBe '{'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('left', shiftKey: true))).toBe 'shift-left'
-        expect(keymap.keystrokeStringForEvent(keydownEvent('Left', shiftKey: true))).toBe 'shift-left'
-
-  describe ".keyBindingsMatchingElement(element)", ->
-    it "returns the matching bindings for the element", ->
-      keymap.bindKeys 'name', '.command-mode', 'c': 'c'
-      keymap.bindKeys 'name', '.grandchild-node', 'g': 'g'
-
-      bindings = keymap.keyBindingsMatchingElement(fragment.find('.grandchild-node'))
-      expect(bindings).toHaveLength 2
-      expect(bindings[0].command).toEqual "g"
-      expect(bindings[1].command).toEqual "c"
-
-    describe "when multiple bindings match a keystroke", ->
-      it "only returns bindings that match the most specific selector", ->
-        keymap.bindKeys 'name', '.command-mode', 'g': 'cmd-mode'
-        keymap.bindKeys 'name', '.command-mode .grandchild-node', 'g': 'cmd-and-grandchild-node'
-        keymap.bindKeys 'name', '.grandchild-node', 'g': 'grandchild-node'
-
-        bindings = keymap.keyBindingsMatchingElement(fragment.find('.grandchild-node'))
-        expect(bindings).toHaveLength 3
-        expect(bindings[0].command).toEqual "cmd-and-grandchild-node"
-
-  describe ".keyBindingsForCommandMatchingElement(element)", ->
-    beforeEach ->
-      keymap.add 'nature',
-        '.green':
-          'ctrl-c': 'cultivate'
-        '.green-2':
-          'ctrl-o': 'cultivate'
-        '.brown':
-          'ctrl-h': 'harvest'
-        '.blue':
-          'ctrl-c': 'fly'
-
-    it "finds a keymap for an element", ->
-      el = $$ -> @div class: 'green'
-      bindings = keymap.keyBindingsForCommandMatchingElement('cultivate', el)
-      expect(bindings).toHaveLength 1
-      expect(bindings[0].keystroke).toEqual "ctrl-c"
-
-    it "no keymap an element without that map", ->
-      el = $$ -> @div class: 'brown'
-      bindings = keymap.keyBindingsForCommandMatchingElement('cultivate', el)
-      expect(bindings).toHaveLength 0
-
-  describe "loading platform specific keybindings", ->
-    customKeymap = null
-
-    beforeEach ->
-      resourcePath = temp.mkdirSync('atom')
-      customKeymap = new Keymap
-      customKeymap.configDirPath = configDirPath
-      customKeymap.resourcePath = resourcePath
-
-    afterEach ->
-      customKeymap.destroy()
-
-    it "doesn't load keybindings from other platforms", ->
-      win32FilePath = path.join(resourcePath, "keymaps", "win32.cson")
-      darwinFilePath = path.join(resourcePath, "keymaps", "darwin.cson")
-      fs.writeFileSync(win32FilePath, '"body": "ctrl-l": "core:win32-move-left"')
-      fs.writeFileSync(darwinFilePath, '"body": "ctrl-l": "core:darwin-move-left"')
-
-      customKeymap.loadBundledKeymaps()
-      keyBindings = customKeymap.keyBindingsForKeystroke('ctrl-l')
-      expect(keyBindings).toHaveLength 1
-      expect(keyBindings[0].command).toBe "core:#{process.platform}-move-left"
-
-  describe "when the user keymap file is changed", ->
-    it "is reloaded", ->
-      jasmine.unspy(global, 'setTimeout')
-      keymapFilePath = path.join(configDirPath, "keymap.cson")
-      fs.writeFileSync(keymapFilePath, '"body": "ctrl-l": "core:move-left"')
-      keymap.loadUserKeymap()
-
-      fs.writeFileSync(keymapFilePath, "'body': 'ctrl-l': 'core:move-right'")
-
-      waitsFor 300, (done) ->
-        keymap.once 'reloaded-key-bindings', done
-
-      runs ->
-        keyBinding = keymap.keyBindingsForKeystroke('ctrl-l')[0]
-        expect(keyBinding.command).toBe 'core:move-right'
-        fs.removeSync(keymapFilePath)
-
-      waitsFor 300, (done) ->
-        keymap.once 'unloaded-key-bindings', done
-
-      runs ->
-        keyBinding = keymap.keyBindingsForKeystroke('ctrl-l')[0]
-        expect(keyBinding).toBeUndefined()
-
-    it "logs a warning when it can't be parsed", ->
-      keymapFilePath = path.join(configDirPath, "keymap.json")
-      fs.writeFileSync(keymapFilePath, '')
-      spyOn(console, 'warn')
-
-      keymap.loadUserKeymap()
-
-      spyOn(keymap, 'loadUserKeymap').andCallThrough()
-      fs.writeFileSync(keymapFilePath, '}{')
-      console.warn.reset()
-
-      waitsFor ->
-        console.warn.callCount > 0
-
-      runs ->
-        expect(console.warn.callCount).toBe 1
-        expect(console.warn.argsForCall[0][0].length).toBeGreaterThan 0
-
-  describe "when adding a binding with an invalid selector", ->
-    it "logs a warning and does not add it", ->
-      spyOn(console, 'warn')
-      keybinding =
-        '##selector':
-          'cmd-a': 'invalid-command'
-      keymap.add('test', keybinding)
-
-      expect(console.warn.callCount).toBe 1
-      expect(console.warn.argsForCall[0][0].length).toBeGreaterThan 0
-      expect(-> keymap.keyBindingsMatchingElement(document.body)).not.toThrow()
-      expect(keymap.keyBindingsForCommand('invalid:command')).toEqual []


expose plugins from instance

expose plugins from instance

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/airtonix/gastropod.git/'


force currency on dashboard creation

force currency on dashboard creation

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/xaun/impac-angular.git/'


Set resource path based on spec directory when running atom core specs

Fixes #3872

--- src/browser/main.coffee
+++ src/browser/main.coffee
@@ -80,7 +80,7 @@
     opened or a new window if it hasn't.
   """
   options.alias('d', 'dev').boolean('d').describe('d', 'Run in development mode.')
-  options.alias('r', 'resource-path').string('r').describe('r', 'Set the path from which Atom loads internal resources and enable dev-mode.')
+  options.alias('r', 'resource-path').string('r').describe('r', 'Set the path to the Atom source directory and enable dev-mode.')
   options.alias('f', 'foreground').boolean('f').describe('f', 'Keep the browser process in the foreground.')
   options.alias('h', 'help').boolean('h').describe('h', 'Print this usage message.')
   options.alias('l', 'log-file').string('l').describe('l', 'Log all output to file.')
@@ -114,8 +114,18 @@
   if args['resource-path']
     devMode = true
     resourcePath = args['resource-path']
-  else if devMode
-    resourcePath = global.devResourcePath
+  else
+    # Set resourcePath based on to specDirectory if running specs on atom core
+    if specDirectory?
+      packageDirectoryPath = path.join(specDirectory, '..')
+      packageManifestPath = path.join(packageDirectoryPath, 'package.json')
+      if fs.statSyncNoException(packageManifestPath)
+        try
+          packageManifest = JSON.parse(fs.readFileSync(packageManifestPath, 'utf8'))
+          resourcePath = packageDirectoryPath if packageManifest.name is 'atom'
+
+    if devMode
+      resourcePath ?= global.devResourcePath

   unless fs.statSyncNoException(resourcePath)
     resourcePath = path.dirname(path.dirname(__dirname))


added test

added test

--- test/businesscat_test.coffee
+++ test/businesscat_test.coffee
@@ -0,0 +1,22 @@
+chai = require "chai"
+sinon = require "sinon"
+chai.use require "sinon-chai"
+
+expect = chai.expect
+
+describe "Business Cat!", ->
+  businesscat_module = require("../src/businesscat")
+
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+    @msg =
+      send: sinon.spy()
+      random: sinon.spy()
+    @businesscat_module = businesscat_module(@robot)
+
+  describe "Summon business cat", ->
+
+    it 'registers a hear listener', ->
+      expect(@robot.hear).to.have.been.calledWith(/synergy/)


Support 2fa with sms option

Support 2fa with sms option

Closes #54

--- src/login.coffee
+++ src/login.coffee
@@ -78,10 +78,13 @@
       if statusCode is 200
         deferred.resolve(state)
       else if statusCode is 401 and headers['x-github-otp']
-        @prompt({prompt: 'Two-Factor Authentication Code>', edit: true})
-          .spread (authCode) ->
-            state.authCode = authCode
-            deferred.resolve(state)
+        promptPromise = @prompt({prompt: 'Two-Factor Authentication Code>', edit: true}).spread (authCode) ->
+          state.authCode = authCode
+          deferred.resolve(state)
+        if headers['x-github-otp'].indexOf('sms') is -1
+          promptPromise
+        else
+          @createToken(state).then(promptPromise)
       else
         message ?= error.message ? error.code if error
         deferred.reject(new Error(message))


fix(queries): delete more than one query

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-ex-ga.git/'


add fork2 type contracts

add fork2 type contracts

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

--- src/types.coffee
+++ src/types.coffee
@@ -0,0 +1,30 @@
+# A type contract is a (Value -> Boolean) function.
+
+{Name,Hash,List,Str,Num,Eql,printError} = C = require("./contracts")
+
+# @typedef {{command: String, type: "repl"}} ShellProgram
+ShellProgram = Name "ShellProgram", Hash(command: Str, type: Eql("repl"))
+
+# @typedef {ShellProgram} OpenSpec
+OpenSpec = Name "OpenSpec", ShellProgram
+
+# @typedef {{open: Array.<OpenSpec>} PlaySpec
+PlaySpec = Name "PlaySpec", Hash(open: List(OpenSpec))
+
+types = {
+  OpenSpec: OpenSpec
+  PlaySpec: PlaySpec
+}
+
+check = (type,value) ->
+  contract = types[type]
+  if contract == undefined
+    throw new Error("No type defined: #{type}")
+  else
+    if err = contract(value)
+      printError err
+      throw new Error("Contract violation.")
+
+check.types = types
+
+module.exports = check


motion coordinates fix

motion coordinates fix

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/'


remove "toggle fullscreen" button from analysis template

--- app/assets/javascripts/analysis/templates/tabs.coffee
+++ app/assets/javascripts/analysis/templates/tabs.coffee
@@ -15,32 +15,4 @@

-
-
-
TOGGLE FULLSCREEN

 """)


added navigatible router #473

added navigatible router #473

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

--- app/assets/javascripts/libs/navigatible_router.coffee
+++ app/assets/javascripts/libs/navigatible_router.coffee
@@ -0,0 +1,39 @@
+### define
+backbone : Backbone
+###
+
+class NavigatibleRouter extends Backbone.Router
+
+  history: []
+
+  navigate: (fragment, options) ->
+
+    @history.push({fragment, options})
+    super(fragment, options)
+
+    return @
+
+
+  historyStart: ->
+
+    @history.push({ fragment: Backbone.history.fragment, options: false })
+
+
+  hasHistory: ->
+
+    return @history.length >= 2
+
+
+  previousHistory: ->
+
+    return @history[@history.length-2]
+
+
+  previous: ->
+
+    console.log(@)
+    if @hasHistory()
+      {fragment, options} = @previousHistory()
+      @navigate(fragment, options)
+
+    return @