Catch JSON parse exception only

Catch JSON parse exception only

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


Simplified Terminal#cursorForward/cursorBack

--- app/assets/javascripts/terminal.js.coffee
+++ app/assets/javascripts/terminal.js.coffee
@@ -174,16 +174,10 @@
         @updateScreen()

   cursorForward: (n) ->
-    i = 0
-    while i < n
-      @cursorRight()
-      i++
+    @cursorRight() for i in [0...n]

   cursorBack: (n) ->
-    i = 0
-    while i < n
-      @cursorLeft()
-      i++
+    @cursorLeft() for i in [0...n]

   cr: ->
     @cursorX = 0


improves comments

improves 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/kevgo/modularity-framework.git/'


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -647,7 +647,7 @@
         entry = JSON.parse(entry)

   # ### Get Source Tasks Asynchronously
-  #
+
   # Get tasks in the `SOURCE` list. **NOTE:** Tasks in the `SOURCE` list does
   # **NOT** equal to **pending** tasks! There may be tasks in the `QUEUED` lists
   # need be processed before processing tasks in the `SOURCE` list.


opt: log style

opt: log style

--- src/yaku.coffee
+++ src/yaku.coffee
@@ -210,30 +210,31 @@
 	@onUnhandledRejection: (reason, p) ->
 		return if not isObject console

-		hStack = '\n'
-		if isLongStackTrace and p[$promiseTrace]
-			if p[$settlerTrace]
-				hStack += p[$settlerTrace]
-			while p
-				hStack += p[$promiseTrace]
-				p = p._pre
-
-		format = (str) ->
-			(if typeof __filename == 'string'
-				str.replace ///.+#{__filename}.+\n?///g, ''
-			else
-				str
-			).replace(/\n$/, '')
-
-		console.error 'Unhandled Rejection:', (
+		stackInfo = [(
 			if reason
 				if reason.stack
-					format reason.stack
+					reason.stack.trim()
 				else
 					reason
 			else
 				reason
-		), format(hStack)
+		)]
+
+		if isLongStackTrace and p[$promiseTrace]
+			if p[$settlerTrace]
+				stackInfo.push p[$settlerTrace].trim()
+			while p
+				stackInfo.push p[$promiseTrace].trim()
+				p = p._pre
+
+		stackStr = stackInfo.join('\n')
+
+		if typeof __filename == 'string'
+			stackStr = stackStr.replace ///.+#{__filename}.+\n?///g, ''
+
+		console.error 'Unhandled Rejection:', stackStr
+
+		return stackInfo

 	isLongStackTrace = false

@@ -403,7 +404,7 @@
 	genTraceInfo = (noTitle) ->
 		(new Error).stack
 			.replace 'Error',
-				(if noTitle then '' else ' From previous event:')
+				(if noTitle then '' else 'From previous event:')

 	# ************************** Promise Constant **************************


Sets default template for tabs for a better kandan

Signed-off-by: Akash Manohar J <e4cf979cf717fd295f4e4edc427ee1aee78fa7dc@akash.im>

--- app/assets/javascripts/backbone/kandan.js.coffee
+++ app/assets/javascripts/backbone/kandan.js.coffee
@@ -78,6 +78,12 @@
               Kandan.Data.Channels.run_callbacks('change')
           })

+          $("#channels").tabs 'option', 'tabTemplate', '''
+

+              #{label}
+              x
+

+          '''

           Kandan.Widgets.init_all()
       })


removed css

removed css

--- coffee/configuration/column_configuration.coffee
+++ coffee/configuration/column_configuration.coffee
@@ -13,7 +13,6 @@

   create_element: () ->
     th = angular.element(document.createElement("th"))
-    th.attr("style","cursor: pointer;")

   render_title: (element) ->
     element.html(@custom_content || @title)


bug fix

bug 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/bubblegroup/bubblebot.git/'


chat: add specialized avatar view

chat: add specialized avatar view

error: pathspec 'client/ide/lib/views/chat/idechatmessageparticipantavatar.coffee' did not match any file(s) known to git

--- client/ide/lib/views/chat/idechatmessageparticipantavatar.coffee
+++ client/ide/lib/views/chat/idechatmessageparticipantavatar.coffee
@@ -0,0 +1,22 @@
+kd = require 'kd'
+AvatarView = require 'app/commonviews/avatarviews/avatarview'
+
+###*
+ * The purpose of this class is to prevent users
+ * going to Profile pages when clicked. Instead of doing anything
+ * It's gonna emit an event to its delegator when it's clicked.
+ *
+ * @class IDEChatMessageParticipantAvatar
+ * @extends AvatarView
+###
+module.exports = class IDEChatMessageParticipantAvatar extends AvatarView
+
+  click: (event) ->
+
+    return  unless participant = @getOption 'origin'
+
+    kd.utils.stopDOMEvent event
+
+    @emit 'ParticipantSelected', participant
+
+


Delete is on selection now, not editor

Delete is on selection now, not editor

--- src/atom/vim-mode/operators.coffee
+++ src/atom/vim-mode/operators.coffee
@@ -37,7 +37,7 @@
   execute: ->
     if @motion
       @motion.select()
-      @editor.delete()
+      @editor.getSelection().delete()
     else
       @editor.deleteLine()


Scroll to top when clicking around

Scroll to top when clicking around

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


Rename collection view’s `showHide*` to `toggle*`.

Toggle is a good analog of jQuery.fn.toggle() [although jquery.toggle behaves not like our version — it allows to pass boolean params to show-hide and is not event handler like our version, so it would be strange].

--- src/chaplin/views/collection_view.coffee
+++ src/chaplin/views/collection_view.coffee
@@ -175,16 +175,16 @@
     @$fallback = @$(@fallbackSelector)

     # Listen for visible items changes
-    @on 'visibilityChange', @showHideFallback
+    @on 'visibilityChange', @toggleFallback

     # Listen for sync events on the collection
-    @listenTo @collection, 'syncStateChange', @showHideFallback
+    @listenTo @collection, 'syncStateChange', @toggleFallback

     # Set visibility initially
-    @showHideFallback()
+    @toggleFallback()

   # Show fallback if no item is visible and the collection is synced
-  showHideFallback: =>
+  toggleFallback: =>
     visible = @visibleItems.length is 0 and (
       if typeof @collection.isSynced is 'function'
         # Collection is a SyncMachine
@@ -208,12 +208,12 @@
     @$loading = @$(@loadingSelector)

     # Listen for sync events on the collection
-    @listenTo @collection, 'syncStateChange', @showHideLoadingIndicator
+    @listenTo @collection, 'syncStateChange', @toggleLoadingIndicator

     # Set visibility initially
-    @showHideLoadingIndicator()
-
-  showHideLoadingIndicator: ->
+    @toggleLoadingIndicator()
+
+  toggleLoadingIndicator: ->
     # Only show the loading indicator if the collection is empty.
     # Otherwise loading more items in order to append them would
     # show the loading indicator. If you want the indicator to


Remove deprecated methods from display buffer spec

--- spec/display-buffer-spec.coffee
+++ spec/display-buffer-spec.coffee
@@ -21,7 +21,7 @@
   describe "::copy()", ->
     it "creates a new DisplayBuffer with the same initial state", ->
       marker1 = displayBuffer.markBufferRange([[1, 2], [3, 4]], id: 1)
-      marker2 = displayBuffer.markBufferRange([[2, 3], [4, 5]], isReversed: true, id: 2)
+      marker2 = displayBuffer.markBufferRange([[2, 3], [4, 5]], reversed: true, id: 2)
       marker3 = displayBuffer.markBufferPosition([5, 6], id: 3)
       displayBuffer.createFold(3, 5)


Fix world’s most annoying typo

Fix world’s most annoying typo

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


Refactor scripts git update to be non-blocking

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/ICTU/self-healer.git/'


clean up stream handling for file copy

clean up stream handling for file copy

--- app/coffee/UrlCache.coffee
+++ app/coffee/UrlCache.coffee
@@ -75,8 +75,9 @@
 		readStream = fs.createReadStream(from)
 		writeStream.on "error", callbackOnce
 		readStream.on "error", callbackOnce
-		writeStream.on "close", () -> callbackOnce()
-		readStream.pipe(writeStream)
+		writeStream.on "close", callbackOnce
+		writeStream.on "open", () ->
+			readStream.pipe(writeStream)

 	_clearUrlFromCache: (project_id, url, callback = (error) ->) ->
 		UrlCache._clearUrlDetails project_id, url, (error) ->


initial version, nearly complete

initial version, nearly complete

--- kos.coffee
+++ kos.coffee
@@ -0,0 +1,211 @@
+'use strict';
+
+co = require('co')
+url = require('url')
+mqtt = require('mqtt') # should make this an optional dependency
+stream = require('stream')
+through2 = require('through2')
+
+# expose KineticObjectStream
+module.exports = kos['default'] = kos.kos = kos = KineticObjectStream
+
+module.exports.Object = KineticObject
+module.exports.Action = KineticAction
+
+pushUnique = (items...) ->
+  for item in items when item not in this
+    this.push item; item
+
+class KineticObjectStream extends stream.Duplex
+
+  constructor: (origin, opts={}) ->
+    # allow usage w/o the new operator
+    unless this instanceof KineticObjectStream
+      return new KineticObjectStream arguments...
+
+    opts.readableObjectMode = true
+    opts.writableObjectMode = true
+
+    super opts
+
+    @comsumes = []
+    @provides = []
+    @ignores = [] # explicitly disabled key(s)
+    @actions = []
+
+    self = this
+
+    # the core essence of KOS
+    core = through2.obj (chunk, enc, callback) ->
+      unless chunk instanceof KineticObject
+        return callback new Error "chunk is not a KineticObject"
+      return callback() if chunk.key in self.ignores
+
+      core.push chunk if chunk.key in self.provides
+      actions = self.actions[chunk.key]
+      # TODO: should call this parallel
+      kf.exec chunk for kf in actions ? []
+      callback()
+    this.pipe(core).pipe(this)
+
+    @queue = []
+    @link = new Promise (resolve, reject) ->
+      # url.parse(origin)
+      #
+      # TODO: should make mqtt optional
+      # TODO: try to get access to mqtt stream directly?
+      mq = mqtt.connect(origin)
+      mq.on 'connect', -> resolve(mq); self.emit 'connect', self
+      mq.on 'error', reject
+      mq.on 'message', (topic, message, packet) ->
+        self.queue.push new KineticObject topic, message
+
+  # subscribe to upstream link for topic/key(s)
+  consume: (keys...) ->
+    co ->
+      link = yield @link
+      keys = pushUnique.apply @consumes, keys.filter(String)
+      link.subscribe(key) for key in keys
+    return this
+
+  # publish to upstream link for topic/key(s)
+  provide: (keys...) ->
+    pushUnique.apply @provides, keys.filter(String)
+    return this
+
+  # Primary entry point to define a new KineticAction within KOS
+  #
+  # returns a KineticAction
+  in: (inputs...) ->
+    action = (new KineticAction inputs).join(this)
+    @insert action
+    return action
+
+  bind: (action) ->
+    pushUnique.call @actions, action
+    return this
+
+  # Convenience function for expressing singular input/output transform
+  #
+  # i.e. io('hello','world').bind(fn)
+  io: (input, output) ->
+    unless arguments.length is 2
+      throw new Error "[io] must supply exactly two arguments (input, output)"
+    @in(input).out(output)
+
+  # Convenience function for pushing KineticObject into Readable stream
+  #
+  # Normally, this shouldn't be needed as the input objects should be
+  # coming from the `link`. It's basically a way for an external
+  # entity to interface with the internal dataflow state.
+  #
+  # i.e. feed('hello',someObj)
+  feed: (key, val) -> @push new KineticObject key, val
+
+  #
+  # Advanced Usage (typically used for troubleshooting)
+  #
+
+  # disable handling of specified topic/key(s)
+  disable: (keys...) ->
+    pushUnique.apply @ignores, keys.filter(String)
+    return this
+
+  # re-enable handling of previously disabled topic/key(s)
+  enable: (keys...) ->
+    @ignores.filter (el) -> keys.indexOf(el) < 0
+    return this
+
+  # custom implementation for Readable
+  _read: ->
+    while (@queue.length) {
+      ko = @queue.shift()
+      continue unless ko instanceof KineticObject
+      @push ko
+    }
+
+  # custom implementation for Writable
+  _write: (chunk, encoding, cb) ->
+    unless chunk instanceof KineticObject
+      cb new Error 'chunk must be KineticObject (should pipe into transform first)'
+    else co ->
+      link = yield @link
+      link.publish(chunk.key, chunk.serialize())
+      cb()
+
+
+class KineticObject
+  BSON = require('bson')
+  bson = new BSON
+  constructor: (key, value) ->
+    # allow usage w/o the new operator
+    unless this instanceof KineticObject
+      return new KineticObject arguments...
+    @ts = new Date
+    @key = key
+    @value = value
+
+  serialize: -> bson.serialize(@value)
+
+class KineticAction
+  constructor: (inputs=[], outputs=[], action) ->
+    # allow usage w/o the new operator
+    unless this instanceof KineticAction
+      return new KineticAction arguments...
+
+    @state = {}
+    @in inputs...
+    @out outputs...
+    @bind action if action?
+
+  in: (inputs...) ->
+    pushUnique.apply @inputs, inputs.filter(String)
+    return this
+
+  out: (outputs...) ->
+    pushUnique.apply @outputs, outputs.filter(String)
+    return this
+
+  bind: (fn) ->
+    unless typeof fn is 'function'
+      throw new Error "[KineticAction:bind] must supply a function"
+    unless @inputs.length > 0
+      throw new Error "[KineticAction:bind] rule does not contain any inputs"
+
+    # TODO: do we need this?
+    if fn.kinetic?
+      throw new Error "[KineticAction:bind] attempting to re-bind a Kinetic fuction"
+
+    @action = fn
+    return @kos ? this # make it chainable if already joined to KOS
+
+  exec: (ko) ->
+    unless ko instanceof KineticObject
+      throw new Error "[KineticAction:exec] cannot execute without KineticObject"
+    @set ko.key, ko.value
+    @action.apply this, ko.key, ko.value
+
+  outflow: (kos) ->
+    unless kos instanceof KineticObjectStream
+      throw new Error "[KineticAction:join] cannot join an invalid KOS"
+    if @kos? and kos isnt @kos
+      throw new Error "[KineticAction:join] cannot join more than one KOS at a time"
+    @kos = kos
+    return this
+
+  # Methods primarily used inside the bound function
+
+  set: (key, value) -> @state[key] = value; return this # chainable
+
+  get: (keys...) -> switch
+    when keys.filter(String).length > 1  then (@state[k] for k in keys)
+    when keys.filter(string).length is 1 then @state[keys[0]]
+
+  has: (keys...) -> keys.every (k) => typeof k is 'string' and @state[k]?
+
+  push: (key, value, force=false) ->
+    unless force or key in @outputs
+      throw new Error "[KineticAction:join] cannot push '#{key}' not in outputs: [#{@outputs}] (try force=true if this is desired)"
+    @kos.feed key, value
+    return this # chainable
+


Add test for ResizeCanvas

Add test for ResizeCanvas

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

--- spec/ResizeCanvas.coffee
+++ spec/ResizeCanvas.coffee
@@ -0,0 +1,77 @@
+noflo = require 'noflo'
+
+unless noflo.isBrowser()
+  chai = require 'chai' unless chai
+  path = require 'path'
+  testutils = require './testutils'
+
+p = path.resolve __dirname, '../'
+console.log p
+loader = new noflo.ComponentLoader p
+
+describe 'ResizeCanvas component', ->
+  c = null
+  sock_height = null
+  sock_width = null
+  sock_canvas = null
+  out = null
+
+  beforeEach (done) ->
+    loader.load 'canvas/ResizeCanvas', (err, inst) ->
+      chai.expect(err).to.be.null
+      c = inst
+      sock_width = noflo.internalSocket.createSocket()
+      sock_height = noflo.internalSocket.createSocket()
+      sock_canvas = noflo.internalSocket.createSocket()
+      out = noflo.internalSocket.createSocket()
+      c.on 'ready', () ->
+        c.inPorts.width.attach sock_width
+        c.inPorts.height.attach sock_height
+        c.inPorts['in'].attach sock_canvas
+        c.outPorts.out.attach out
+        done()
+
+  describe 'when instantiated', ->
+    it 'should have 3 input ports', ->
+      chai.expect(c.inPorts['in']).to.be.an 'object'
+      chai.expect(c.inPorts.height).to.be.an 'object'
+      chai.expect(c.inPorts.width).to.be.an 'object'
+    it 'should have one output port', ->
+      chai.expect(c.outPorts.out).to.be.an 'object'
+
+  describe 'specifying height+width', ->
+    it 'should resize to specified size', (done) ->
+      input = testutils.createCanvas 400, 300
+      out.once "data", (canvas) ->
+        chai.expect(canvas).to.be.an 'object'
+        chai.expect(canvas.width).to.equal 500
+        chai.expect(canvas.height).to.equal 400
+        done()
+      sock_width.send 500
+      sock_height.send 400
+      sock_canvas.send input
+
+  describe.skip 'specifying only height', ->
+    it 'should calculate width', (done) ->
+      input = testutils.createCanvas 400, 300
+      out.once "data", (canvas) ->
+        chai.expect(canvas).to.be.an 'object'
+        chai.expect(canvas.width).to.equal 500
+        chai.expect(canvas.height).to.equal 400
+        done()
+      sock_width.send 500
+      sock_height.send 400
+      sock_canvas.send input
+
+  describe.skip 'specifying only width', ->
+    it 'should calculate height', (done) ->
+      input = testutils.createCanvas 400, 300
+      out.once "data", (canvas) ->
+        chai.expect(canvas).to.be.an 'object'
+        chai.expect(canvas.width).to.equal 500
+        chai.expect(canvas.height).to.equal 400
+        done()
+      sock_width.send 500
+      sock_height.send 400
+      sock_canvas.send input
+


Add notification for package settings errors

--- src/package.coffee
+++ src/package.coffee
@@ -321,7 +321,9 @@
     loadSettingsFile = (settingsPath, callback) =>
       ScopedProperties.load settingsPath, (error, settings) =>
         if error?
-          console.warn("Failed to load package settings: #{settingsPath}", error.stack ? error)
+          detail = "#{error.message} in #{settingsPath}"
+          stack += "#{error.stack}\n  at #{settingsPath}:1:1"
+          atom.notifications.addFatalError("Failed to load the #{@name} package settings", {stack, detail, dismissable: true})
         else
           @settings.push(settings)
           settings.activate() if @settingsActivated


Point copy constructor

Point copy constructor

--- src/point.coffee
+++ src/point.coffee
@@ -27,7 +27,7 @@
   @constructor
   ###
   Point = (x, y) ->
-    Object.isObject(x)
+    if Object.isObject(x)
       {x, y} = x

     __proto__: Point::


extracting point class

extracting point class

--- src/point.coffee
+++ src/point.coffee
@@ -1,202 +1,206 @@
-###*
-Create a new point with given x and y coordinates. If no arguments are given
-defaults to (0, 0).
-@name Point
-@param {Number} [x]
-@param {Number} [y]
-@constructor
-###
-Point = (x, y) ->
-  ###*
-  The x coordinate of this point.
-  @name x
-  @fieldOf Point#
-  ###
-  x: x || 0
-  ###*
-  The y coordinate of this point.
-  @name y
-  @fieldOf Point#
-  ###
-  y: y || 0
-  ###*
-  Adds a point to this one and returns the new point. You may
-  also use a two argument call like point.add(x, y)
-  to add x and y values without a second point object.
-  @name add
-  @methodOf Point#
-
-  @param {Point} other The point to add this point to.
-  @returns A new point, the sum of both.
-  @type Point
-  ###
-  add: (first, second) ->
-    if second
-      Point(this.x + first, this.y + second)
-    else
-      Point(this.x + first.x, this.y + first.y)
-
-  ###*
-  Subtracts a point to this one and returns the new point.
-  @name subtract
-  @methodOf Point#
-
-  @param {Point} other The point to subtract from this point.
-  @returns A new point, this - other.
-  @type Point
-  ###
-  subtract: (other) ->
-    Point(this.x - other.x, this.y - other.y)
-
-  ###*
-   * Scale this Point (Vector) by a constant amount.
-   * @name scale
-   * @methodOf Point#
+( ->
+  ###*
+  Create a new point with given x and y coordinates. If no arguments are given
+  defaults to (0, 0).
+  @name Point
+  @param {Number} [x]
+  @param {Number} [y]
+  @constructor
+  ###
+  Point = (x, y) ->
+    ###*
+    The x coordinate of this point.
+    @name x
+    @fieldOf Point#
+    ###
+    x: x || 0
+    ###*
+    The y coordinate of this point.
+    @name y
+    @fieldOf Point#
+    ###
+    y: y || 0
+    ###*
+    Adds a point to this one and returns the new point. You may
+    also use a two argument call like point.add(x, y)
+    to add x and y values without a second point object.
+    @name add
+    @methodOf Point#
+
+    @param {Point} other The point to add this point to.
+    @returns A new point, the sum of both.
+    @type Point
+    ###
+    add: (first, second) ->
+      if second
+        Point(this.x + first, this.y + second)
+      else
+        Point(this.x + first.x, this.y + first.y)
+
+    ###*
+    Subtracts a point to this one and returns the new point.
+    @name subtract
+    @methodOf Point#
+
+    @param {Point} other The point to subtract from this point.
+    @returns A new point, this - other.
+    @type Point
+    ###
+    subtract: (other) ->
+      Point(this.x - other.x, this.y - other.y)
+
+    ###*
+     * Scale this Point (Vector) by a constant amount.
+     * @name scale
+     * @methodOf Point#
+     *
+     * @param {Number} scalar The amount to scale this point by.
+     * @returns A new point, this * scalar.
+     * @type Point
+    ###
+    scale: (scalar) ->
+      Point(this.x * scalar, this.y * scalar)
+
+    ###*
+    Floor the x and y values, returning a new point.
+
+    @name floor
+    @methodOf Point#
+    @returns A new point, with x and y values each floored to the largest previous integer.
+    @type Point
+    ###
+    floor: ->
+      Point(this.x.floor(), this.y.floor())
+
+    ###*
+     * Determine whether this point is equal to another point.
+     * @name equal
+     * @methodOf Point#
+     *
+     * @param {Point} other The point to check for equality.
+     * @returns true if the other point has the same x, y coordinates, false otherwise.
+     * @type Boolean
+    ###
+    equal: (other) ->
+      this.x == other.x && this.y == other.y
+
+    ###*
+    Calculate the magnitude of this Point (Vector).
+    @name magnitude
+    @methodOf Point#
+
+    @returns The magnitude of this point as if it were a vector from (0, 0) -> (x, y).
+    @type Number
+    ###
+    magnitude: ->
+      Point.distance(Point(0, 0), this)
+
+    ###*
+    Returns the direction in radians of this point from the origin.
+    @name direction
+    @methodOf Point#
+
+    @type Number
+    ###
+    direction: ->
+      Math.atan2(this.y, this.x)
+
+    ###*
+    Calculate the dot product of this point and another point (Vector).
+    @name dot
+    @methodOf Point#
+
+    @param {Point} other The point to dot with this point.
+    @returns The dot product of this point dot other as a scalar value.
+    @type Number
+    ###
+    dot: (other) ->
+      this.x * other.x + this.y * other.y
+
+    ###*
+    Calculate the cross product of this point and another point (Vector).
+    Usually cross products are thought of as only applying to three dimensional vectors,
+    but z can be treated as zero. The result of this method is interpreted as the magnitude
+    of the vector result of the cross product between [x1, y1, 0] x [x2, y2, 0]
+    perpendicular to the xy plane.
+    @name cross
+    @methodOf Point#
+
+    @param {Point} other The point to cross with this point.
+    @returns The cross product of this point with the other point as scalar value.
+    @type Number
+    ###
+    cross: (other) ->
+      this.x * other.y - other.x * this.y
+
+    ###*
+    The norm of a vector is the unit vector pointing in the same direction. This method
+    treats the point as though it is a vector from the origin to (x, y).
+    @name norm
+    @methodOf Point#
+
+    @returns The unit vector pointing in the same direction as this vector.
+    @type Point
+    ###
+    norm: (length=1.0) ->
+      this.scale(length/this.length())
+
+    ###*
+    Computed the length of this point as though it were a vector from (0,0) to (x,y)
+    @name length
+    @methodOf Point#
+
+    @returns The length of the vector from the origin to this point.
+    @type Number
+    ###
+    length: ->
+      Math.sqrt(this.dot(this))
+
+    ###*
+    Computed the Euclidean between this point and another point.
+    @name distance
+    @methodOf Point#
+
+    @param {Point} other The point to compute the distance to.
+    @returns The distance between this point and another point.
+    @type Number
+    ###
+    distance: (other) ->
+      Point.distance(this, other)
+
+  ###*
+   * @param {Point} p1
+   * @param {Point} p2
+   * @type Number
+   * @returns The Euclidean distance between two points.
+  ###
+  Point.distance = (p1, p2) ->
+    Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2))
+
+  ###*
+   * Construct a point on the unit circle for the given angle.
    *
-   * @param {Number} scalar The amount to scale this point by.
-   * @returns A new point, this * scalar.
+   * @param {Number} angle The angle in radians
    * @type Point
-  ###
-  scale: (scalar) ->
-    Point(this.x * scalar, this.y * scalar)
-
-  ###*
-  Floor the x and y values, returning a new point.
-
-  @name floor
-  @methodOf Point#
-  @returns A new point, with x and y values each floored to the largest previous integer.
-  @type Point
-  ###
-  floor: ->
-    Point(this.x.floor(), this.y.floor())
-
-  ###*
-   * Determine whether this point is equal to another point.
-   * @name equal
-   * @methodOf Point#
-   *
-   * @param {Point} other The point to check for equality.
-   * @returns true if the other point has the same x, y coordinates, false otherwise.
-   * @type Boolean
-  ###
-  equal: (other) ->
-    this.x == other.x && this.y == other.y
-
-  ###*
-  Calculate the magnitude of this Point (Vector).
-  @name magnitude
-  @methodOf Point#
-
-  @returns The magnitude of this point as if it were a vector from (0, 0) -> (x, y).
-  @type Number
-  ###
-  magnitude: ->
-    Point.distance(Point(0, 0), this)
-
-  ###*
-  Returns the direction in radians of this point from the origin.
-  @name direction
-  @methodOf Point#
-
-  @type Number
-  ###
-  direction: ->
-    Math.atan2(this.y, this.x)
-
-  ###*
-  Calculate the dot product of this point and another point (Vector).
-  @name dot
-  @methodOf Point#
-
-  @param {Point} other The point to dot with this point.
-  @returns The dot product of this point dot other as a scalar value.
-  @type Number
-  ###
-  dot: (other) ->
-    this.x * other.x + this.y * other.y
-
-  ###*
-  Calculate the cross product of this point and another point (Vector).
-  Usually cross products are thought of as only applying to three dimensional vectors,
-  but z can be treated as zero. The result of this method is interpreted as the magnitude
-  of the vector result of the cross product between [x1, y1, 0] x [x2, y2, 0]
-  perpendicular to the xy plane.
-  @name cross
-  @methodOf Point#
-
-  @param {Point} other The point to cross with this point.
-  @returns The cross product of this point with the other point as scalar value.
-  @type Number
-  ###
-  cross: (other) ->
-    this.x * other.y - other.x * this.y
-
-  ###*
-  The norm of a vector is the unit vector pointing in the same direction. This method
-  treats the point as though it is a vector from the origin to (x, y).
-  @name norm
-  @methodOf Point#
-
-  @returns The unit vector pointing in the same direction as this vector.
-  @type Point
-  ###
-  norm: (length=1.0) ->
-    this.scale(length/this.length())
-
-  ###*
-  Computed the length of this point as though it were a vector from (0,0) to (x,y)
-  @name length
-  @methodOf Point#
-
-  @returns The length of the vector from the origin to this point.
-  @type Number
-  ###
-  length: ->
-    Math.sqrt(this.dot(this))
-
-  ###*
-  Computed the Euclidean between this point and another point.
-  @name distance
-  @methodOf Point#
-
-  @param {Point} other The point to compute the distance to.
-  @returns The distance between this point and another point.
-  @type Number
-  ###
-  distance: (other) ->
-    Point.distance(this, other)
-
-###*
- * @param {Point} p1
- * @param {Point} p2
- * @type Number
- * @returns The Euclidean distance between two points.
-###
-Point.distance = (p1, p2) ->
-  Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2))
-
-###*
- * Construct a point on the unit circle for the given angle.
- *
- * @param {Number} angle The angle in radians
- * @type Point
- * @returns The point on the unit circle.
-###
-Point.fromAngle = (angle) ->
-  Point(Math.cos(angle), Math.sin(angle))
-
-###*
- * If you have two dudes, one standing at point p1, and the other
- * standing at point p2, then this method will return the direction
- * that the dude standing at p1 will need to face to look at p2.
- * @param {Point} p1 The starting point.
- * @param {Point} p2 The ending point.
- * @returns The direction from p1 to p2 in radians.
-###
-Point.direction = (p1, p2) ->
-  Math.atan2(
-    p2.y - p1.y,
-    p2.x - p1.x
-  )
-
+   * @returns The point on the unit circle.
+  ###
+  Point.fromAngle = (angle) ->
+    Point(Math.cos(angle), Math.sin(angle))
+
+  ###*
+   * If you have two dudes, one standing at point p1, and the other
+   * standing at point p2, then this method will return the direction
+   * that the dude standing at p1 will need to face to look at p2.
+   * @param {Point} p1 The starting point.
+   * @param {Point} p2 The ending point.
+   * @returns The direction from p1 to p2 in radians.
+  ###
+  Point.direction = (p1, p2) ->
+    Math.atan2(
+      p2.y - p1.y,
+      p2.x - p1.x
+    )
+
+  window["Point"] = Point
+)()
+


should not prepare format except as a cursor

--- src/quill.coffee
+++ src/quill.coffee
@@ -161,6 +161,8 @@
   prepareFormat: (name, value) ->
     format = @editor.doc.formats[name]
     return unless format?     # TODO warn
+    range = this.getSelection()
+    return unless range?.isCollapsed()
     format.prepare(value)

   setContents: (delta, source = Quill.sources.API) ->


Reintroduce all methods removed from Range because they're needed

--- src/range.coffee
+++ src/range.coffee
@@ -148,6 +148,12 @@
   translate: (delta) ->
     new @constructor(@start.translate(delta), @end.translate(delta))

+  add: (delta) ->
+    new @constructor(@start.add(delta), @end.add(delta))
+
+  translate: (startPoint, endPoint=startPoint) ->
+    new @constructor(@start.translate(startPoint), @end.translate(endPoint))
+
   # Public: Determines whether this range intersects with the argument.
   intersectsWith: (otherRange) ->
     if @start.isLessThanOrEqual(otherRange.start)
@@ -199,6 +205,14 @@
   isEmpty: ->
     @start.isEqual(@end)

+  toDelta: ->
+    rows = @end.row - @start.row
+    if rows == 0
+      columns = @end.column - @start.column
+    else
+      columns = @end.column
+    new Point(rows, columns)
+
   # Public:
   getRowCount: ->
     @end.row - @start.row + 1


squish log level into new Log

squish log level into new Log

--- src/robot.coffee
+++ src/robot.coffee
@@ -22,8 +22,7 @@
     @loadPaths   = []
     @enableSlash = false

-    @logLevel    = process.env.HUBOT_LOG_LEVEL || "info"
-    @logger      = new Log @logLevel
+    @logger      = new Log process.env.HUBOT_LOG_LEVEL or "info"

     @loadAdapter adapterPath, adapter if adapter?


Code and commentary diverged in that short time.  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/maowug/coffeescript.git/'


setup: Don't error participant startup on stderr data

node.js debug and warnings tend to go to stderr >.<

--- src/setup.coffee
+++ src/setup.coffee
@@ -24,25 +24,30 @@
     env: env
   prog = cmd.split(' ')[0]
   args = cmd.split(' ').splice(1)
-  console.log 'start', prog, args.join(' ')
+#  console.log 'start', prog, args.join(' ')
   child = child_process.spawn prog, args, options
   returned = false
   child.on 'error', (err) ->
-    console.log 'error', err
+#    console.log 'error', err
     return if returned
     returned = true
     return callback err, child
   # We assume that when somethis is send on stdout, starting is complete
   child.stdout.on 'data', (data) ->
-    console.log 'stdout', data.toString()
+#    console.log 'stdout', data.toString()
     return if returned
     returned = true
     return callback null, child
   child.stderr.on 'data', (data) ->
-    console.log 'stderr', data.toString()
+    debug 'participant stderr', data.toString()
+    #return if returned
+    #returned = true
+    #return callback new Error data.toString(), child
+  child.on 'exit', (code, signal) ->
+    debug 'child exited', code, signal
     return if returned
     returned = true
-    return callback new Error data.toString(), child
+    return callback new Error "Child exited with #{code} #{signal}"
   return child

 participantCommands = (graph, library, only, ignore) ->


bug fix

bug fix


update and refactoring, probably not done yet

--- src/sound.coffee
+++ src/sound.coffee
@@ -5,8 +5,34 @@
 ###

 class Sound
-    #closure
+    #closures
     _list = []
+    _play = (opt) ->
+        #create audio nodes
+        gainNode = audioContext.createGain()
+        @_source = audioContext.createBufferSource()
+
+        #set values on source node
+        @_source.buffer = @_buffer
+        @_source.loop = opt.loop ? @_config.loop
+        @_source.onended = =>
+            @_isEnded = true
+            @_elapsedTime += audioContext.currentTime - @_startTime
+            if @_elapsedTime >= @_buffer.duration
+                @_elapsedTime = 0
+
+        #set value on gain node
+        gainNode.gain.value = opt.volume ? @_config.volume
+
+        #connect nodes
+        @_source.connect gainNode
+        gainNode.connect audioContext.destination
+
+        #record start time
+        @_startTime = audioContext.currentTime
+
+        #start playing
+        @_source.start @_startTime, @_elapsedTime

     #class level objects
     @config:
@@ -32,7 +58,7 @@
                 snd.play()
             else
                 snd.play volume: 0, loop: false
-                setTimeout (-> snd.stop()), 50
+                setTimeout (-> snd.stop()), 50 #FIX: closure issue?
         return
     @_pauseAll = ->
         snd.pause() for snd in _list
@@ -47,12 +73,12 @@
             @_config[key] ?= value

         #prefix the sound path
-        if Sound.config.path.match /\/$/
-            @_config.url = Sound.config.path.concat @_config.url
-        else
-            if Sound.config.path
+        unless /(^\w+:\/\/|^\/)/.test @_config.url
+            if /\/$/.test Sound.config.path
+                @_config.url = Sound.config.path + @_config.url
+            else if Sound.config.path
                 Sound.config.path += '/'
-                @_config.url = Sound.config.path.concat @_config.url
+                @_config.url = Sound.config.path + @_config.url

         #not using web audio api
         if Sound.config.useAudioTag
@@ -69,15 +95,15 @@
             wav_src.type = 'audio/wav'

             #assign proper srcs
-            if @_config.url.match /\.mp3$/
+            if /\.mp3$/.test @_config.url
                 mp3_src.src = @_config.url
                 ogg_src.src = @_config.url.replace '.mp3', '.ogg'
                 wav_src.src = @_config.url.replace '.mp3', '.wav'
-            else if @_config.url.match /\.ogg$/
+            else if /\.ogg$/.test @_config.url
                 ogg_src.src = @_config.url
                 mp3_src.src = @_config.url.replace '.ogg', '.mp3'
                 wav_src.src = @_config.url.replace '.ogg', '.wav'
-            else if @_config.url.match /\.wav$/
+            else if /\.wav$/.test @_config.url
                 wav_src.src = @_config.url
                 mp3_src.src = @_config.url.replace '.wav', '.mp3'
                 ogg_src.src = @_config.url.replace '.wav', '.ogg'
@@ -108,12 +134,10 @@
             request.responseType = 'arraybuffer'

             #request event handlers
-            request.successCallback = (buffer) =>
-                @_buffer = buffer
-                if Greenhorn.isRunning() and @_config.autoplay
-                    @play()
+            request.successCallback = (@_buffer) =>
+                if Greenhorn.isRunning() and @_config.autoplay then @play()
             request.errorCallback = ->
-                throw new Error "AJAX request Error"
+                console.log "could not load sound file at url: #{@_config.url}"
             request.onload = ->
                 audioContext.decodeAudioData @response, @successCallback, @errorCallback

@@ -128,7 +152,7 @@
         if @_audio?
             !(@_audio.paused or @_audio.ended)
         else
-            @_isEnded
+            !@_isEnded
     elapsedTime: ->
         if @_audio?
             @_audio.currentTime * 1000
@@ -146,35 +170,12 @@
                 if @_isEnded
                     #set isEnded to false
                     @_isEnded = false
-
-                    #create audio nodes
-                    gainNode = audioContext.createGain()
-                    @_source = audioContext.createBufferSource()
-
-                    #set values on source node
-                    @_source.buffer = @_buffer
-                    @_source.loop = opt.loop ? @_config.loop
-                    @_source.onended = =>
-                        @_isEnded = true
-                        @_elapsedTime += audioContext.currentTime - @_startTime
-                        if @_elapsedTime >= @_buffer.duration
-                            @_elapsedTime = 0
-
-                    #set value on gain node
-                    gainNode.gain.value = opt.volume ? @_config.volume
-
-                    #connect nodes
-                    @_source.connect gainNode
-                    gainNode.connect audioContext.destination
-
-                    #record start time
-                    @_startTime = audioContext.currentTime
-
-                    #start playing
-                    @_source.start @_startTime, @_elapsedTime
+                    _play.call this, opt
+
     restart: (opt = {}) ->
         if Greenhorn.isRunning()
             if @_audio?
+                @_audio.pause()
                 @_audio.currentTime = 0
                 @_audio.loop = opt.loop ? @_config.loop
                 @_audio.volume = opt.volume ? @_config.volume
@@ -183,38 +184,15 @@
                 #stop source
                 @_source.stop()
                 @_elapsedTime = 0
-
-                #create audio nodes
-                gainNode = audioContext.createGain()
-                @_source = audioContext.createBufferSource()
-
-                #set values on source node
-                @_source.buffer = @_buffer
-                @_source.loop = opt.loop ? @_config.loop
-                @_source.onended = =>
-                    @_isEnded = true
-                    @_elapsedTime += audioContext.currentTime - @_startTime
-                    if @_elapsedTime >= @_buffer.duration
-                        @_elapsedTime = 0
-
-                #set value on gain node
-                gainNode.gain.value = opt.volume ? @_config.volume
-
-                #connect nodes
-                @_source.connect gainNode
-                gainNode.connect audioContext.destination
-
-                #record start time
-                @_startTime = audioContext.currentTime
-
-                #start playing
-                @_source.start @_startTime, @_elapsedTime
+                _play.call this, opt
+
     pause: ->
         if Greenhorn.isRunning()
             if @_audio?
                 @_audio.pause()
             else
                 @_source.stop()
+
     stop: ->
         if Greenhorn.isRunning()
             if @_audio?


app goes last

app goes last

--- src/startup.coffee
+++ src/startup.coffee
@@ -5,6 +5,6 @@
 Native = require 'native'

 window.atom = {}
+window.atom.native = new Native
+window.atom.event = new Event
 window.atom.app = new App
-window.atom.native = new Native
-window.atom.event = new Event


Compile on load

Compile on load

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


Added performance.now() shim

Added performance.now() shim

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

--- src/core.coffee
+++ src/core.coffee
@@ -0,0 +1,18 @@
+###
+  Shim for performance.now function
+###
+
+udefine 'performance', ['root'], (root) ->
+  performance = root.performance || {}
+
+  vendors = ['ms', 'moz', 'webkit', 'o']
+
+  unless performance.now
+    for x in vendors
+      performance.now = performance["#{x}Now"]
+      break if performance.now
+
+  unless performance.now
+    performance.now = -> Date.now?() || new Date().getTime()
+
+  performance


update

update

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -367,8 +367,8 @@
   #     queue.regist (param1, param2, callback) ->
   #       console.log param1, param2
   #       callback()
-  regist: (@handler) =>
-    workers.push new Worker @, @handler
+  regist: (handler) =>
+    workers.push new Worker @, handler

   # ### Re-Schedule Failed and Blocked Tasks
@@ -886,10 +886,11 @@
       else
         # console.log 'else'
         @redis.unwatch()
-        return @awake() if @_new_task
-        @redis.llen @key('SOURCE'), (err, a, b) =>
-          return @awake() if b
-          @is_idling = on
+        @is_idling = on
+        # return @awake() if @_new_task
+        # @redis.llen @key('SOURCE'), (err, a, b) =>
+        # return @awake() if b
+        # @is_idling = on

   # ### Process Each Group's First Task


Update Comment

Update Comment

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -177,13 +177,16 @@
   #   + `STATISTICS`, Redis hash, tracks basic statistics for the queue.
   key: (key) -> "#{prefix}:#{key}:#{@name}"

-  # ### Configurable Parameters:
-
-  # + Polling interval in milliseconds
-  # + Retry interval in milliseconds
-  # + Maximum times of retries
-  # + Storage capacity for newly finished tasks
-  # + Storage capacity for slowest tasks
+  # ### Configurable Parameters
+
+  # Prototypal inherited parameters which can be overriden by instance
+  # properties include:
+  #
+  #   + Polling interval in milliseconds
+  #   + Retry interval in milliseconds
+  #   + Maximum times of retries
+  #   + Storage capacity for newly finished tasks
+  #   + Storage capacity for slowest tasks
   polling_interval : 5
   retry_delay      : 0.1 * 1000
   retry_limit      : 2


Added core library

Added core library

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

--- src/mixer.coffee
+++ src/mixer.coffee
@@ -0,0 +1,37 @@
+do (root = @) ->
+  mixerList = {}
+
+  ownProp = Object.hasOwnProperty
+
+  # Expose mixer list if debug
+  root.mixerList = mixerList if DEBUG
+
+  root.mixer = (target, name, params...) ->
+    root.mixer(target, n, params) for n in name if Array.isArray name
+
+    if typeof mixinList[name] is 'function'
+      mixinList[name].apply(target, params)
+    else
+      for key, value of mixinList[name] when not ownProp.call target, key
+        target[key] = value
+
+    null
+
+  root.mixer.define = (name, definition) ->
+    return unless name? or definition?
+    return if mixinList[name]?
+
+    mixinList[name] = definition
+
+    null
+
+  root.mixer.remove = (name) ->
+    delete mixinList[name] if name? and mixinList[name]?
+
+    null
+
+  root.mixer.exists = (name) -> ownProp.call mixinList, name
+
+  # Provide AMD module as well, global property still needs to be available
+  # though
+  root.define? 'mixer', -> root.mixer


Another attempt at correct plugin filtering

--- src/watch.coffee
+++ src/watch.coffee
@@ -405,19 +405,22 @@
       plugin.optimize ?= plugin.minify if typeof plugin.minify is 'function'
       isOptimizer = !!plugin.optimize

+      # Does the user's config say this plugin should definitely be used?
+      return true if plugin.brunchPluginName in alwaysEnabled
+
+      if isOptimizer
+        # if the plugin specified a matching env, include the plugin
+        return true if plugin.defaultEnv and plugin.defaultEnv in currentEnvs
+        # otherwise decide based on the config.optimize setting
+        return config.optimize
+
+      # if we've gotten this far:
+
       # Use plugin-specified defaultEnv or assume it's meant for any env
-      env = plugin.defaultEnv or (if isOptimizer then 'production' else '*')
-
-      # Does the user's config say this plugin should definitely be used?
-      alwaysUsed = plugin.brunchPluginName in alwaysEnabled
-      # or Is it an optimizer while optimizers turned on?
-      optimizer = isOptimizer and config.optimize
-      # or Is it meant for any environment?
-      matchesAny = env is '*'
-      # or Is it meant for an active environment?
-      matchesCurrent = env in currentEnvs
-
-      alwaysUsed or optimizer or matchesAny or matchesCurrent
+      env = plugin.defaultEnv ?= '*'
+
+      # Finally, is it meant for either any environment or an active environment?
+      env is '*' or env in currentEnvs

     debug "Loaded plugins: #{plugins.map((plugin) -> plugin.brunchPluginName).join(', ')}"


Hide title bar when details view is rendered

--- src/views.coffee
+++ src/views.coffee
@@ -163,9 +163,19 @@

         initialize: ->
             @listenTo(app.vent, 'administration-divisions-fetched', @render)
+            @listenTo(app.vent, 'details_view:show', @hide)
+            @listenTo(app.vent, 'details_view:hide', @show)

         render: (divisionNamePartials)->
             @el.innerHTML = jade.template 'embedded-title-bar', 'titleText': divisionNamePartials
+
+        show: ->
+            @delegateEvents
+            @$el.removeClass 'hide'
+
+        hide: ->
+            @undelegateEvents()
+            @$el.addClass 'hide'

         preventDefault: (ev) ->
             ev.preventDefault()
@@ -268,6 +278,7 @@

             @$el.find('.container').addClass('details-open')
             @details_view.model = unit
+            app.vent.trigger 'details_view:show'
             unit.fetch(success: =>
                 @details_view.render()
             )
@@ -280,6 +291,7 @@
             window.debug_unit = unit

         hide_details: ->
+            app.vent.trigger 'details_view:hide'
             @$el.find('.container').removeClass('details-open')

         enable_typeahead: (selector) ->


upload images with query strings too

upload images with query strings too

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


Added some additional names to names.coffee

--- app/lib/world/names.coffee
+++ app/lib/world/names.coffee
@@ -57,6 +57,7 @@
     "Nikita"
     "Alana"
     "Lana"
+    "Coco"
   ]
   "Peasant": [
     "Yorik"
@@ -79,6 +80,7 @@
     "Bernadette"
     "Hershell"
     "Gawain"
+    "Icey"
   ]
   "Archer F": [
     "Phoebe"
@@ -104,6 +106,12 @@
     "Alden"
     "Cairn"
     "Jensen"
+    "Yilitha"
+    "Mirana"
+    "Lina"
+    "Luna"
+    "Alleria"
+    "Vereesa"
   ]
   "Archer M": [
     "Brian"
@@ -111,6 +119,15 @@
     "Roman"
     "Hunter"
     "Simon"
+    "Slyvos"
+    "Logos"
+    "Denin"
+    "Lycan"
+    "Loco"
+    "Vican"
+    "Mars"
+    "Necros"
+    "Dev"
   ]
   "Ogre Munchkin M": [
     "Brack"
@@ -132,6 +149,7 @@
     "Thabt"
     "Snortt"
     "Kog"
+    "Ursa"
   ]
   "Ogre Munchkin F": [
     "Iyert"
@@ -139,6 +157,9 @@
     "Shmeal"
     "Gurzunn"
     "Yugark"
+    "Dosha"
+    "Inski"
+    "Lacos"
   ]
   "Ogre M": [
     "Krogg"
@@ -150,13 +171,20 @@
     "Trung"
     "Axe Ox"
     "Vargutt"
+    "Tarlok"
+    "Gurulax"
+    "Mokrul"
   ]
   "Ogre F": [
     "Nareng"
     "Morthrug"
     "Glonc"
     "Marghurk"
-
+    "Holkam"
+    "Alkaz"
+    "Gar'ah"
+    "Mak'rah"
+    "Marnag"
   ]
   "Ogre Brawler": [
     "Grul'thock"
@@ -171,6 +199,8 @@
     "Borgag"
     "Grognar"
     "Ironjaw"
+    "York"
+    "Ork'han"
   ]
   "Ogre Fangrider": [
     "Dreek"
@@ -186,6 +216,7 @@
     "Gurzthrot"
     "Murgark"
     "Muttin"
+    "Bortrok"
   ]
   "Ogre Shaman": [
     "Sham'uk"
@@ -205,6 +236,11 @@
     "Zo'Goroth"
     "Mogadishu"
     "Nazgareth"
+    "Gror"
+    "Grek"
+    "Gom"
+    "Gogg"
+    "Ghuk"
   ]
   "Ogre Thrower": [
     "Kyrgg"


change avatar

change avatar

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


refactored future to support client side usage

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


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -906,10 +906,10 @@
       # Calculate blocked and pending tasks:
       #
       #   1. Set `blocked.groups` of result.
-      #   2. Initiate another transaction to count all `BLOCKED` tasks. Blocked tasks
-      #   are tasks in the `QUEUED` list whose group identifier is in the
-      #   `BLOCKED` set. **Note:** The first element of each `QUEUED` list will not be
-      #   counted, since that's the blocking (failed) task.
+      #   2. Initiate another transaction to count all `BLOCKED` tasks. Blocked
+      #   tasks are tasks in the `QUEUED` list whose group identifiers are in
+      #   the `BLOCKED` set. **Note:** The first element of each `QUEUED` list
+      #   will not be counted, since that's the blocking (failed) task.
       #   3. Calculate pending tasks.
       #
       # The equation used to calculate pending tasks is:


throw err from router so it gets caught by express errorHandler

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


Fix typo in method names

Fix typo in method names

--- src/positionally-aware-pane.coffee
+++ src/positionally-aware-pane.coffee
@@ -16,16 +16,16 @@
   constructor: (@pane, @allPanes) ->

   focusPaneAbove: ->
-    @bestChoiceForVerticalNavigation(@panesInAdjecentRowAbove())?.focus()
+    @bestChoiceForVerticalNavigation(@panesInAdjacentRowAbove())?.focus()

   focusPaneBelow: ->
-    @bestChoiceForVerticalNavigation(@panesInAdjecentRowBelow())?.focus()
+    @bestChoiceForVerticalNavigation(@panesInAdjacentRowBelow())?.focus()

   focusPaneOnLeft: ->
-    @bestChoiceForHorizontalNavigation(@panesInAdjecentColumnOnLeft())?.focus()
+    @bestChoiceForHorizontalNavigation(@panesInAdjacentColumnOnLeft())?.focus()

   focusPaneOnRight: ->
-    @bestChoiceForHorizontalNavigation(@panesInAdjecentColumnOnRight())?.focus()
+    @bestChoiceForHorizontalNavigation(@panesInAdjacentColumnOnRight())?.focus()

   focus: ->
     @pane.focus()
@@ -56,14 +56,14 @@

   ### Internal ###

-  panesInAdjecentRowAbove: ->
+  panesInAdjacentRowAbove: ->
     allPanesAbove = @otherPanes().filter (pane) => @isBelow(pane)
     yBottomValues = _.map allPanesAbove, (pane) -> pane.yBottom()
     maxYBottom = _.max yBottomValues
     panesVerticallyNearest = allPanesAbove.filter (pane) ->
       pane.yBottom() == maxYBottom

-  panesInAdjecentRowBelow: ->
+  panesInAdjacentRowBelow: ->
     allPanesBelow = @otherPanes().filter (pane) => @isAbove(pane)

     yTopValues = _.map allPanesBelow, (pane) -> pane.yTop()
@@ -71,7 +71,7 @@
     panesVerticallyNearest = allPanesBelow.filter (pane) ->
       pane.yTop() == minYTop

-  panesInAdjecentColumnOnLeft: ->
+  panesInAdjacentColumnOnLeft: ->
     allPanesOnLeft = @otherPanes().filter (pane) => @isRightOf(pane)
     xRightValues = _.map allPanesOnLeft, (pane) -> pane.xRight()
     maxXRight = _.max xRightValues
@@ -79,7 +79,7 @@
       pane.xRight() == maxXRight

   # Internal
-  panesInAdjecentColumnOnRight: ->
+  panesInAdjacentColumnOnRight: ->
     allPanesOnRight = @otherPanes().filter (pane) => @isLeftOf(pane)
     xLeftValues = _.map allPanesOnRight, (pane) -> pane.xLeft()
     minXLeft = _.min xLeftValues


Add auto setting to DataRange1d

Add auto setting to DataRange1d

--- bokehjs/src/coffee/range/data_range1d.coffee
+++ bokehjs/src/coffee/range/data_range1d.coffee
@@ -131,6 +131,9 @@
         new_range.end = end
       @set(new_range)

+    if @get('bounds') == 'auto'
+      @set('bounds', [start, end])
+
   reset: () ->
     @have_updated_interactively = false
     @set({


Logging to debug get_potential_signatures and get_required_signatures (appears that the api is not capturing all balance objects in the signature list) #98

--- dl/src/chain/transaction_operations.coffee
+++ dl/src/chain/transaction_operations.coffee
@@ -100,7 +100,8 @@
             "get_potential_signatures",
             [tr_object]
         ).then (potential_signatures)->
-            #DEBUG console.log('... get_potential_signatures',potential_signatures)
+            #DEBUG
+            console.log('... get_potential_signatures',potential_signatures,tr_object)
             potential_signatures

     get_required_signatures:(available_keys)->
@@ -110,7 +111,8 @@
             "get_required_signatures",
             [tr_object, available_keys]
         ).then (required_public_keys)->
-            #DEBUG console.log('... required_public_keys',required_public_keys)
+            #DEBUG
+            console.log('... get_required_signatures',required_public_keys)
             required_public_keys

     sign:(private_keys, chain_id = Apis.instance().chain_id)->


add db tests

add db tests

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

--- tests/db.coffee
+++ tests/db.coffee
@@ -0,0 +1,115 @@
+async = require 'async'
+
+should = require 'should'
+date = require 'date-utils'
+
+config      = require '../backend/config'
+replication = require '../backend/replication'
+binary      = require '../backend/binary'
+pouch       = require '../backend/db'
+request = require 'request-json-light'
+
+helpers = require './helpers/helpers'
+cliHelpers = require './helpers/cli'
+fileHelpers = require './helpers/files'
+
+params =
+    url: 'http://localhost:9104/'
+
+
+describe "DB Tests", ->
+
+    before cliHelpers.resetDatabase
+    after cliHelpers.resetDatabase
+
+    createBinary = (i, callback) ->
+        pouch.db.put
+            _id: "binary-#{i}"
+            docType: 'Binary'
+            binary:
+                file:
+                    id: "binary-#{i}"
+        , callback
+
+    createFile = (i, callback) ->
+        pouch.db.put
+            _id: "file-#{i}"
+            docType: 'File'
+            path: 'myfolder'
+            name: "filename-#{i}"
+        , callback
+
+    createFolder = (i, callback) ->
+        pouch.db.put
+            _id: "folder-#{i}"
+            docType: 'Folder'
+            path: 'myfolder'
+            name: "folder-#{i}"
+        , callback
+
+    before (done) ->
+        async.eachSeries [1..3], createBinary, ->
+            async.eachSeries [1..3], createFile, ->
+                async.eachSeries [1..3], createFolder, done
+
+
+    describe 'removeFilter', ->
+        it 'removes given view', (done) ->
+            id = "folder"
+            pouch.folders.all (err, res) ->
+                should.not.exist err
+                pouch.removeFilter id, (err) ->
+                    should.not.exist err
+                    pouch.folders.all (err, res) ->
+                        console.log res
+                        should.exist err
+                        done()
+
+
+    describe 'createDesignDoc', ->
+        it "creates a new design doc", (done) ->
+            id = "_design/folder"
+            queries =
+                all: """
+            function (doc) {
+                if (doc.docType !== undefined
+                    && doc.docType.toLowerCase() === "folder") {
+                    emit(doc._id, doc);
+                }
+            }
+            """
+            pouch.createDesignDoc id, queries, ->
+                pouch.folders.all (err, res) ->
+                    should.not.exist err
+                    res.rows.length.should.be.equal 3
+                    done()
+
+
+    describe 'addFilter', ->
+        # Add filter is run at init, we suppose here it is already launched.
+        it "creates all views", (done) ->
+            pouch.folders.all (err, res) ->
+                should.not.exist err
+                pouch.files.all (err, res) ->
+                    should.not.exist err
+                    pouch.binaries.all (err, res) ->
+                        should.not.exist err
+                        done()
+
+
+    describe 'removeIfExists', ->
+        it 'removes element with given id', (done) ->
+            pouch.db.get 'folder-3', (err) ->
+                should.not.exist err
+                pouch.removeIfExists 'folder-3', (err) ->
+                    should.not.exist err
+                    pouch.db.get 'folder-3', (err) ->
+                        should.exist err
+                        done()
+
+        it 'doesnt return an error when the doc is not there', (done) ->
+            pouch.removeIfExists 'folder-3', (err) ->
+                should.not.exist err
+                pouch.db.get 'folder-3', (err) ->
+                    should.exist err
+                    done()


Fixed the status report on error function response notification. (#2357)

* Fixed the status report on error function response notification.

* Removed the trailing semicolon.

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


Add tests for readme examples

Add tests for readme examples

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

--- test/test.coffee
+++ test/test.coffee
@@ -0,0 +1,35 @@
+should = require 'should'
+global.$ = require 'jquery'
+global._ = require 'underscore'
+global.Backbone = require 'backbone'
+require '../backbone.typeahead.coffee'
+
+describe 'Backbone Typeahead', ->
+  testRoutes =
+    'todos/new': 'show'
+    'todos/:todo_id/comments/:id': 'showComment'
+    'todos/:id': 'show'
+    'todos': 'index'
+
+  describe 'Readme Tests', ->
+    class Albums extends Backbone.TypeaheadCollection
+      typeaheadAttributes: ['band', 'name']
+
+    albums = new Albums([
+      { id: 1, band: 'A Flock of Seagulls', name: 'A Flock of Seagulls' }
+      { id: 2, band: 'Rick Astley', name: 'Whenever You Need Somebody' }
+      { id: 3, band: 'Queen', name: 'A Day at the Races' }
+      { id: 4, band: 'Queen', name: 'Tie Your Mother Down' }
+    ])
+
+    it 'should handle simple search', ->
+      expected = ['Whenever You Need Somebody', 'Tie Your Mother Down']
+      actual = _.map albums.typeahead('you'), (a) -> a.get('name')
+
+      expected.should.eql actual
+
+    it 'should handle simple facet', ->
+      expected = ['A Day at the Races']
+      actual = _.map albums.typeahead('ra', band: 'Queen'), (a) -> a.get('name')
+
+      expected.should.eql actual


Nothing important

Nothing important

--- src/Phantomjs.coffee
+++ src/Phantomjs.coffee
@@ -30,8 +30,8 @@
     @childProcess = new ChildProcess()
     @childProcess.spawn("phantomjs",args,options)

-    @childProcess.child.on "exit", (code,signal) =>
-      @emit "exit",code,signal
+    @childProcess.child.on "exit", (code, signal) =>
+      @emit "exit", code, signal

   kill: (signal="SIGINT")->
     log.debug "Phantomjs.kill()"


load env

load env

--- api/lib/migrate_posts.coffee
+++ api/lib/migrate_posts.coffee
@@ -3,9 +3,7 @@
 #

 _ = require 'underscore'
-env = require 'node-env-file'
 { resolve } = require 'path'
-env resolve __dirname, '../../.env'
 async = require 'async'
 cheerio = require 'cheerio'
 moment = require 'moment'
@@ -13,6 +11,13 @@
   'art', 'I', 'sy', 'work', 'love', 'works', 'views', 'study', 'post', 'share'
 ])
 { ObjectId } = mongojs = require 'mongojs'
+
+# Load environment vars
+env = require 'node-env-file'
+env switch process.env.NODE_ENV
+  when 'test' then resolve __dirname, '../../.env.test'
+  when 'production', 'staging' then ''
+  else resolve __dirname, '../../.env'
 { GRAVITY_MONGO_URL, GRAVITY_CLOUDFRONT_URL } = process.env

 # Load the Positron & Gravity databases


Use @ instead of this

Use @ instead of this

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


created simple client for the phisher api

error: pathspec 'ext/app/api/phisher_api.coffee' did not match any file(s) known to git

--- ext/app/api/phisher_api.coffee
+++ ext/app/api/phisher_api.coffee
@@ -0,0 +1,11 @@
+class PhisherApi extends BaseApi
+
+  verify:(args)->
+    options =
+      url: '/sites/verify'
+      params:
+        url: args.url
+      success: args.success
+      error: args.error
+    get(options)
+


specs

specs

--- apps/fair/test/routes.coffee
+++ apps/fair/test/routes.coffee
@@ -6,6 +6,8 @@
 routes = rewire '../routes'
 CurrentUser = require '../../../models/current_user.coffee'
 Fair = require '../../../models/fair.coffee'
+Fairs = require '../../../collections/fairs.coffee'
+FairOrganizer = require '../../../models/fair_organizer.coffee'
 Profile = require '../../../models/profile.coffee'
 FilterSuggest = require '../../../models/filter_suggest'
 FilteredSearchOptions = require '../../../models/filter_suggest'
@@ -191,4 +193,36 @@
     routes.fetchFairData @req, @res, @next
     @success()
     (@cache.setHash.args[0][1].fair?).should.be.ok
-    (@cache.setHash.args[0][1].filterSuggest?).should.be.ok+    (@cache.setHash.args[0][1].filterSuggest?).should.be.ok
+
+describe '#fetchFairByOrganizerYear', ->
+
+  beforeEach ->
+    sinon.stub Backbone, 'sync'
+
+    profile = new Profile _.extend fabricate('fair_organizer_profile'), owner:fabricate('fair_organizer')
+
+    @fairs = [
+      fabricate('fair', start_at: new Date("2-2-2014"), id: '2014', default_profile_id: '2014'),
+      fabricate('fair', start_at: new Date("2-2-2015"), id: '2015', default_profile_id: '2015'),
+      fabricate('fair', start_at: new Date("2-2-2016"), id: '2016', default_profile_id: '2016')
+    ]
+
+    @req = { params: { id: 'the-armory-show', year: '2015' } }
+    @res = { locals: { sd: {}, profile: profile } }
+    @next = sinon.stub()
+
+  afterEach ->
+    Backbone.sync.restore()
+
+  it 'fetches the correct fair by year through the fair organizer', ->
+    routes.fetchFairByOrganizerYear @req, @res, @next
+    Backbone.sync.args[0][2].success @fairs
+    @next.called.should.not.be.ok
+    Backbone.sync.args[1][1].attributes.id.should.equal '2015'
+
+  it 'nexts if the fair organizer does not have a fair with requested year', ->
+    @req = { params: { id: 'the-armory-show', year: '2017' } }
+    routes.fetchFairByOrganizerYear @req, @res, @next
+    Backbone.sync.args[0][2].success @fairs
+    @next.called.should.be.ok


Return the clone

Return the clone

--- src/spine.coffee
+++ src/spine.coffee
@@ -283,6 +283,7 @@
     return if @hasOwnProperty 'cid' # Make sure it's not the raw object
     for own key, value of @
       delete @[key] if @attributes()[key]?
+    this

   updateAttribute: (name, value, options) ->
     @[name] = value


Don't recompute pair boolean when building token

Pass in hasPairedCharacter to the Token constructor when it is
being broken out from the parent token instead of recomputing it.

--- src/token.coffee
+++ src/token.coffee
@@ -21,10 +21,10 @@
   firstTrailingWhitespaceIndex: null
   hasInvisibleCharacters: false

-  constructor: ({@value, @scopes, @isAtomic, @bufferDelta, @isHardTab}) ->
+  constructor: ({@value, @scopes, @isAtomic, @bufferDelta, @isHardTab, @hasPairedCharacter}) ->
     @screenDelta = @value.length
     @bufferDelta ?= @screenDelta
-    @hasPairedCharacter = textUtils.hasPairedCharacter(@value)
+    @hasPairedCharacter ?= textUtils.hasPairedCharacter(@value)

   isEqual: (other) ->
     # TODO: scopes is deprecated. This is here for the sake of lang package tests
@@ -125,6 +125,7 @@
       value: value[index..index + 1]
       scopes: @scopes
       isAtomic: true
+      hasPairedCharacter: true
     )

   buildHardTabToken: (tabLength, column) ->


bug fix

bug 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/bubblegroup/bubblebot.git/'


allow overriding databases

allow overriding databases


adding restart to rds

adding restart to rds


Use better class style.

Use better class style.

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/aha-app/bigquery-log-viewer.git/'


Add revpi-core-3 coffee file

Add revpi-core-3 coffee file

Signed-off-by: Sebastian Panceac <db043b2055cb3a47b2eb0b5aebf4e114a8c24a5a@balena.io>

error: pathspec 'revpi-core-3.coffee' did not match any file(s) known to git

--- revpi-core-3.coffee
+++ revpi-core-3.coffee
@@ -0,0 +1,48 @@
+deviceTypesCommon = require '@resin.io/device-types/common'
+{ networkOptions, commonImg, instructions } = deviceTypesCommon
+
+REVPI_DEBUG = "While not having the Revolution Pi board powered, connect your system to the board's USB port via a micro-USB cable."
+REVPI_POWER = "Power on the Revolution Pi board."
+REVPI_WRITE = "Write the OS to the internal MMC storage device. We recommend using Etcher."
+REVPI_POWEROFF = "When flashing is complete, power off the board and unplug the micro-USB cable."
+
+module.exports =
+	version: 1
+	slug: 'revpi-core-3'
+	aliases: [ 'revpi-core-3' ]
+	name: 'Revolution Pi Core 3'
+	arch: 'armv7hf'
+	state: 'released'
+	isDefault: true
+
+	instructions: [
+		REVPI_DEBUG
+		REVPI_POWER
+		REVPI_WRITE
+		REVPI_POWEROFF
+		instructions.CONNECT_AND_BOOT
+	]
+
+	gettingStartedLink:
+		windows: 'https://docs.resin.io/raspberrypi3/nodejs/getting-started/#adding-your-first-device'
+		osx: 'https://docs.resin.io/raspberrypi3/nodejs/getting-started/#adding-your-first-device'
+		linux: 'https://docs.resin.io/raspberrypi3/nodejs/getting-started/#adding-your-first-device'
+	supportsBlink: true
+
+	options: [ networkOptions.group ]
+
+	yocto:
+		machine: 'revpi-core-3'
+		image: 'resin-image'
+		fstype: 'resinos-img'
+		version: 'yocto-sumo'
+		deployArtifact: 'resin-image-revpi-core-3.resinos-img'
+		compressed: true
+
+	configuration:
+		config:
+			partition:
+				primary: 1
+			path: '/config.json'
+
+	initialization: commonImg.initialization


Add message for chrome users about scrolling select boxes

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

--- app/assets/javascripts/coffee/chrome.js.coffee
+++ app/assets/javascripts/coffee/chrome.js.coffee
@@ -0,0 +1,32 @@
+###
+Chrome version 32 changed how scroll bars work.
+This is causing problems with some select fields
+with many options.    There's no way
+to click on the scroll bar.   Suggest
+an alternative of using keys or the scroll wheel
+until it is fixed.
+###
+#
+
+$ ->
+  is_chrome = /chrome/.test navigator.userAgent.toLowerCase()
+
+  if is_chrome
+    updateSelect = ->
+      $('select').filter ->
+        return @children.length > 4
+      .addClass("popup")
+      .attr "data-help" ,
+        "If you are having trouble scrolling the select box, you can use the middle mouse button \
+        or the page up / page down keys.   This problem should be fixed with the next release of Google Chrome"
+    updateSelect()
+    $(document).ajaxComplete -> updateSelect()
+
+
+
+
+
+
+
+
+


Ajout d'un d'un grunt production

Ajout d'un d'un grunt production

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/dreimert/annuaire-anciens-eleves.git/'


dependencies auto update enabled

dependencies auto update enabled

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/Christianjuth/Extension-Framework.git/'


added google analytics, woot woot

added google analytics, woot woot

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

--- app/assets/javascripts/google_analytics.js.coffee
+++ app/assets/javascripts/google_analytics.js.coffee
@@ -0,0 +1,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()
+      ), true
+    else
+      GoogleAnalytics.trackPageview()
+
+  @trackPageview: (url) ->
+    unless GoogleAnalytics.isLocalRequest()
+      if url
+        window._gaq.push ["_trackPageview", url]
+      else
+        window._gaq.push ["_trackPageview"]
+      window._gaq.push ["_trackPageLoadTime"]
+
+  @isLocalRequest: ->
+    GoogleAnalytics.documentDomainIncludes "local"
+
+  @documentDomainIncludes: (str) ->
+    document.domain.indexOf(str) isnt -1
+
+  @analyticsId: ->
+    # your google analytics ID(s) here...
+    'UA-61063656-1'
+
+GoogleAnalytics.load()


fix(credentials): fix port change

fix(credentials): fix port change

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


Update the progress bar code

Update the progress bar code

--- lib/Task/ActivityTask/BindingTask/Read/OptimisticLookahead.coffee
+++ lib/Task/ActivityTask/BindingTask/Read/OptimisticLookahead.coffee
@@ -12,7 +12,6 @@
     @count = 0
     Promise.bind(@)
     .then @acquireCredential
-    .then -> @progressBarSetTotal(0) # known to be unknown
     .then ->
       new Promise (resolve, reject) =>
         @reject = reject


Fix student solution view.

Fix student solution view.

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


display proper checkboxes on dashboard

display proper checkboxes on dashboard

#88134960

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


Добавил напоминалку.

Добавил напоминалку.

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


Revert test since `startEditorWindow` no longer returns a promise

--- spec/atom-environment-spec.coffee
+++ spec/atom-environment-spec.coffee
@@ -263,11 +263,9 @@
       }
       atomEnvironment = new AtomEnvironment({applicationDelegate: atom.applicationDelegate, window, document: fakeDocument})
       spyOn(atomEnvironment.packages, 'getAvailablePackagePaths').andReturn []
-      waitsForPromise ->
-        atomEnvironment.startEditorWindow()
-      runs ->
-        atomEnvironment.unloadEditorWindow()
-        atomEnvironment.destroy()
+      atomEnvironment.startEditorWindow()
+      atomEnvironment.unloadEditorWindow()
+      atomEnvironment.destroy()

   describe "::openLocations(locations) (called via IPC from browser process)", ->
     beforeEach ->


remove stray log

remove stray log

--- client/lib/middleware.coffee
+++ client/lib/middleware.coffee
@@ -18,7 +18,6 @@
 @locals = (req, res, next) ->
   res.locals.sd.URL = req.url
   res.locals.sd.USER = req.user?.toJSON()
-  console.log INTERCOM_SECRET
   res.locals.sd.USER_HASH = crypto.createHmac('sha256', INTERCOM_SECRET)
     .update(req.user.id).digest('hex') if req.user
   res.locals.user = req.user


fixed an important bug in the coffeescript solution

the previous solution was allowed repeated cards in the answer! this is
not allowed in the problem description. a new permutations function is
introduced (also recursive) and used while generating the list of
possible card arrangements.

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


test commit

test commit

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

--- scripts/test.coffee
+++ scripts/test.coffee
@@ -0,0 +1,3 @@
+module.exports = (robot) ->
+  robot.hear /hug/i, (res) ->
+    res.send "(heart)"


Add packages.cson

Add packages.cson

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

--- .atom/packages.cson
+++ .atom/packages.cson
@@ -0,0 +1,102 @@
+'packages': [
+  'advanced-new-file'
+  'atom-yeoman'
+  'emmet'
+  'emmet-atom'
+  'ex-mode'
+  'json-schema'
+  'linter'
+  'monokai'
+  'omnisharp-atom'
+  'parcel'
+  'vim-mode'
+  'atom-dark-syntax'
+  'atom-dark-ui'
+  'atom-light-syntax'
+  'atom-light-ui'
+  'base16-tomorrow-dark-theme'
+  'base16-tomorrow-light-theme'
+  'one-dark-ui'
+  'one-dark-syntax'
+  'one-light-syntax'
+  'one-light-ui'
+  'solarized-dark-syntax'
+  'solarized-light-syntax'
+  'about'
+  'archive-view'
+  'autocomplete-atom-api'
+  'autocomplete-css'
+  'autocomplete-html'
+  'autocomplete-plus'
+  'autocomplete-snippets'
+  'autoflow'
+  'autosave'
+  'background-tips'
+  'bookmarks'
+  'bracket-matcher'
+  'command-palette'
+  'deprecation-cop'
+  'dev-live-reload'
+  'encoding-selector'
+  'exception-reporting'
+  'find-and-replace'
+  'fuzzy-finder'
+  'git-diff'
+  'go-to-line'
+  'grammar-selector'
+  'image-view'
+  'incompatible-packages'
+  'keybinding-resolver'
+  'link'
+  'markdown-preview'
+  'metrics'
+  'notifications'
+  'open-on-github'
+  'package-generator'
+  'release-notes'
+  'settings-view'
+  'snippets'
+  'spell-check'
+  'status-bar'
+  'styleguide'
+  'symbols-view'
+  'tabs'
+  'timecop'
+  'tree-view'
+  'update-package-dependencies'
+  'welcome'
+  'whitespace'
+  'wrap-guide'
+  'language-c'
+  'language-clojure'
+  'language-coffee-script'
+  'language-csharp'
+  'language-css'
+  'language-gfm'
+  'language-git'
+  'language-go'
+  'language-html'
+  'language-hyperlink'
+  'language-java'
+  'language-javascript'
+  'language-json'
+  'language-less'
+  'language-make'
+  'language-mustache'
+  'language-objective-c'
+  'language-perl'
+  'language-php'
+  'language-property-list'
+  'language-python'
+  'language-ruby'
+  'language-ruby-on-rails'
+  'language-sass'
+  'language-shellscript'
+  'language-source'
+  'language-sql'
+  'language-text'
+  'language-todo'
+  'language-toml'
+  'language-xml'
+  'language-yaml'
+]


Fixed error handling.

Fixed error handling.

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


AdjustableColumns

AdjustableColumns

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

--- src/js/app/MovableDivider.coffee
+++ src/js/app/MovableDivider.coffee
@@ -0,0 +1,16 @@
+React = require 'React'
+{_div} = require 'hyper'
+$ = require 'ejquery'
+
+module.exports = React.createClass
+
+  componentDidMount: ->
+    $(@getDOMNode()).draggable
+      axis: 'x'
+      drag: (e, ui) =>
+        @props.onDrag ui.offset.left
+        ui.position = ui.originalPosition
+
+  render: ->
+    @transferPropsTo _div
+        className: 'movableDivider'


accept json in body

accept json in body

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/justinlhudson/WebApplication-Server.git/'


refactoring to jquery sortable setup

refactoring to jquery sortable setup

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


fix c/s logging in the bilateral module

fix c/s logging in the bilateral module

--- library/membrane/bilateral.coffee
+++ library/membrane/bilateral.coffee
@@ -122,13 +122,15 @@
         assert _.isString(@service), "invalid service data"
         assert _.isString(@location), "location misconfied"
         assert _.isString(@nsp), "bilateral nsp malfunction"
-        try uplinking = "Uplink %s at #{@location}, nsp=%s"
+        assert uplinking = "Uplink %s at %s using nsp=%s"
         _.forIn this, (value, reference, context) => do =>
             return unless reference of (this.uplinks or {})
             assert mangled = try "#{@location}/#{reference}"
             mangled += "/#{nsp}" if _.isString nsp = this.nsp
+            assert try xref = ref = reference.toString().bold
+            assert try xloc = @location.toString().underline
+            logger.info uplinking, xref, xloc, (try nsp.bold)
             assert value; return this.socket.on mangled, =>
-                try logger.info uplinking, reference, nsp or 0
                 value.call this, i(arguments)..., (params...) =>
                     id = @socket.sacks = (@socket.sacks ?= 0) + 1
                     ack = type: "ack", name: mangled, ack: "data"


Inline call to StateChangeLogger.log. Delete field instead of setting to null.

--- src/nsqdconnection.coffee
+++ src/nsqdconnection.coffee
@@ -79,10 +79,6 @@

   connectionState: ->
     @statemachine or new ConnectionState this
-
-  log: (message) ->
-    StateChangeLogger.log 'NSQDConnection', @statemachine.current_state_name,
-      @id, message

   connect: ->
     # Using nextTick so that clients of Reader can register event listeners
@@ -167,7 +163,8 @@
       sync_goto: true

   log: (message) ->
-    @conn.log message
+    StateChangeLogger.log 'NSQDConnection', @current_state_name, @conn?.id,
+      message

   afterIdentify: ->
     'SUBSCRIBE'
@@ -287,7 +284,7 @@
         @stop()
         @conn.destroy()
         @conn.emit NSQDConnection.CLOSED
-        @conn = null
+        delete @conn

       close: ->
         # No-op. Once closed, subsequent calls should do nothing.


Refactor list of inputs in ajax

Refactor list of inputs in ajax

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


Remove unnecessary regex

Remove unnecessary regex

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


:lipstick:

:lipstick:

--- src/text-editor-component.coffee
+++ src/text-editor-component.coffee
@@ -440,12 +440,10 @@
       return unless which is 2

       if selection = clipboard.readText('selection')
-        {editor} = @props
-        editor.insertText(selection)
+        @props.editor.insertText(selection)

     @subscribe @props.editor.onDidChangeSelectionRange =>
-      {editor} = @props
-      if selectedText = editor.getSelectedText()
+      if selectedText = @props.editor.getSelectedText()
         clipboard.writeText(selectedText, 'selection')

   observeConfig: ->


Work on roles & permissions

Work on roles & permissions

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


oops new file

oops new file

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

--- test/integration/new_view.coffee
+++ test/integration/new_view.coffee
@@ -0,0 +1,65 @@
+$ = jQuery = require 'jquery'
+Browser = require 'zombie'
+should = require 'should'
+
+url = 'http://localhost:3001' # DRY DRY DRY
+login_url = "#{url}/login"
+
+describe 'Use a plugin to create a new view', ->
+  browser = new Browser()
+  browser.waitDuration = "10s"
+
+  before (done) ->
+    browser.visit login_url, done
+    @datasetUrl = null
+    @viewPathname = null
+
+  before (done) ->
+    browser.fill '#username', 'ehg'
+    browser.fill '#password', 'testing'
+    browser.pressButton '#login', ->
+      browser.wait done
+
+  context 'when I am on the datasets page', ->
+
+    context 'when I click on a dataset', ->
+      before (done) ->
+        link = browser.query('a.dataset')
+        browser.fire 'click', link, ->
+          browser.wait 1000, ->
+            browser.wait done
+
+      it "takes me to the dataset's page", ->
+        result = browser.location.href
+        result.should.include "#{url}/dataset/"
+        @datasetUrl = result
+
+      context 'when I click on the Spreadsheet tool', ->
+        before (done) ->
+          link = browser.query('a.tool')
+          browser.fire 'click', link, ->
+            browser.wait 1000, ->
+              browser.wait done
+
+        it 'takes me to the new view', ->
+          result = browser.location.href
+          result.should.match /dataset[/][^/]+[/]view[/][^/]+/
+          @viewPathname = browser.location.pathname
+
+        it 'shows me stuff', ->
+
+      context "when I return to the dataset's page", ->
+        before (done) ->
+          browser.visit @datasetUrl, done
+
+        it 'lists the new view', ->
+          link = browser.query("a.view[href='#{@viewPathname}']")
+          should.exist link
+
+      context "when I return to the dataset list", ->
+        before (done) ->
+          browser.visit "#{url}/", done
+
+        it 'lists the new view', ->
+          link = browser.query("a.view[href='#{@viewPathname}']")
+          should.exist link


:white_check_mark: Add tests to config spec

Add tests to check if the get command properly merges the stored values
with the defined defaults in the schema.

Two cases:
- Obj has no property changes.
- Obj has one or more changes to a property.

--- spec/config-spec.coffee
+++ spec/config-spec.coffee
@@ -1109,6 +1109,24 @@
           nestedInt: 24
           nestedObject:
             superNestedInt: 36
+
+        expect(atom.config.get("foo")).toEqual {
+          bar:
+            anInt: 12
+            anObject:
+              nestedInt: 24
+              nestedObject:
+                superNestedInt: 36
+        }
+        atom.config.set("foo.bar.anObject.nestedObject.superNestedInt", 37)
+        expect(atom.config.get("foo")).toEqual {
+          bar:
+            anInt: 12
+            anObject:
+              nestedInt: 24
+              nestedObject:
+                superNestedInt: 37
+        }

       it 'can set a non-object schema', ->
         schema =


Unfocus spec

Unfocus spec

--- spec/editor-spec.coffee
+++ spec/editor-spec.coffee
@@ -1860,7 +1860,7 @@
         beforeEach ->
           editor.setSelectedBufferRanges([[[0, 4], [0, 13]], [[1, 6], [1, 10]]])

-        fdescribe ".cutSelectedText()", ->
+        describe ".cutSelectedText()", ->
           it "removes the selected text from the buffer and places it on the clipboard", ->
             editor.cutSelectedText()
             expect(buffer.lineForRow(0)).toBe "var  = function () {"


Remove deprecated requires from spec-helper

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -9,7 +9,8 @@
 fs = require 'fs-plus'
 Grim = require 'grim'
 KeymapManager = require '../src/keymap-extensions'
-{$, WorkspaceView, Workspace} = require 'atom'
+Workspace = require '../src/workspace'
+{$} = require '../src/space-pen-extensions'
 Config = require '../src/config'
 {Point} = require 'text-buffer'
 Project = require '../src/project'


Remove workspaceView from spec-helper

Remove workspaceView from spec-helper

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -135,8 +135,9 @@
   atom.menu.template = []
   atom.contextMenu.clear()

-  atom.workspaceView?.remove?()
-  atom.workspaceView = null
+  atom.workspace?.destroy()
+  atom.workspace = null
+  atom.__workspaceView = null
   delete atom.state.workspace

   atom.project?.destroy()


fix dolog tests

fix dolog tests

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


Start migrating to Grunt for build automation, refs #179

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

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,42 @@
+module.exports = ->
+  # Project configuration
+  @initConfig
+    pkg: @file.readJSON 'package.json'
+
+    # Build setup: concatenate source files
+    concat:
+      full:
+        src: [
+          'src/*.js'
+          'src/**/*.js'
+          'locale/*.js'
+        ]
+        dest: 'examples/create.js'
+      edit:
+        src: [
+          'src/jquery.Midgard.midgardEditable.js'
+          'src/jquery.Midgard.midgardStorage.js'
+          'src/collectionWidgets/*.js'
+          'src/editingWidgets/*.js'
+        ]
+        dest: 'examples/create-editonly.js'
+
+    # JavaScript minification
+    uglify:
+      options:
+        banner: '/* Create.js <%= pkg.version %> - Inline editing toolkit. See http://createjs.org for more information */'
+        report: 'min'
+      full:
+        files:
+          'examples/create.min.js': ['examples/create.js']
+      edit:
+        files:
+          'examples/create-editonly.min.js': ['examples/create-editonly.js']
+
+  # Build dependencies
+  @loadNpmTasks 'grunt-contrib-concat'
+  @loadNpmTasks 'grunt-contrib-uglify'
+
+  # Local tasks
+  @registerTask 'build', ['concat:full', 'uglify:full']
+  @registerTask 'editonly', ['concat:edit', 'uglify:edit']


ClientSync: removed @playerId and add @playerReady

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


Add failing symlink spec

Add failing symlink spec

--- src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee
+++ src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee
@@ -59,6 +59,17 @@
               expect(finderView.list.find("li:contains(#{fs.base(path)})")).toExist()
             expect(finderView.list.children().first()).toHaveClass 'selected'
             expect(finderView.find(".loading")).not.toBeVisible()
+
+        it "includes symlinked file paths", ->
+          rootView.attachToDom()
+          finderView.maxItems = Infinity
+          rootView.trigger 'fuzzy-finder:toggle-file-finder'
+
+          waitsFor "all project paths to load", 5000, ->
+            not finderView.reloadProjectPaths
+
+          runs ->
+            expect(finderView.list.find("li:contains(symlink-to-file)")).toExist()

       describe "when root view's project has no path", ->
         beforeEach ->


Remove language-make snippets

Remove language-make snippets

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


timestamp is no longer a number

timestamp is no longer a number

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


add mousewheel event in case the log file doesnt overflow the viewport

--- SingularityUI/app/views/tail.coffee
+++ SingularityUI/app/views/tail.coffee
@@ -48,7 +48,7 @@
         @$linesWrapper = @$contents.children('.lines-wrapper')

         # Attach scroll event manually because Backbone is poopy about it
-        @$contents.on 'scroll', @handleScroll
+        @$contents.on 'scroll, mousewheel, DOMMouseScroll', @handleScroll

         # Some stuff in the app can change this stuff. We wanna reset it
         $('html, body').css 'min-height', '0px'


Clean json

Clean json

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


feedback test with default messages

feedback test with default messages

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


Tweak option description

Tweak option description

--- src/browser/main.coffee
+++ src/browser/main.coffee
@@ -73,7 +73,7 @@
   options.alias('l', 'log-file').string('l').describe('l', 'Log all output to file.')
   options.alias('n', 'new-window').boolean('n').describe('n', 'Open a new window.')
   options.alias('s', 'spec-directory').string('s').describe('s', 'Set the spec directory (default: Atom\'s spec directory).')
-  options.boolean('safe').describe('safe', 'Do not load any packages from ~/.atom/packages or ~/.atom/dev/packages.')
+  options.boolean('safe').describe('safe', 'Do not load packages from ~/.atom/packages or ~/.atom/dev/packages.')
   options.alias('t', 'test').boolean('t').describe('t', 'Run the specified specs and exit with error code on failures.')
   options.alias('v', 'version').boolean('v').describe('v', 'Print the version.')
   options.alias('w', 'wait').boolean('w').describe('w', 'Wait for window to be closed before returning.')


this is how we write this on .com

this is how we write this on .com

--- src/packages/tabs/lib/tab-view.coffee
+++ src/packages/tabs/lib/tab-view.coffee
@@ -82,7 +82,7 @@
     currentDraggedTabIndex = draggedTab.index()
     toEditor.editSessions.splice(currentDraggedTabIndex, 0, fromEditor.editSessions.splice(previousDraggedTabIndex, 1)[0])

-    if fromPane.find('.tab').length == 0
+    if !fromPane.find('.tab').length
       fromPane.view().remove()
     else if fromPaneIndex != toPaneIndex && draggedTab.hasClass('active')
       fromEditor.setActiveEditSessionIndex(0)


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

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

--- src/engine_stats.coffee
+++ src/engine_stats.coffee
@@ -0,0 +1,16 @@
+###*
+The Stats module provides methods to query the engine to find game objects.
+
+@name Stats
+@fieldOf Engine
+@module
+@param {Object} I Instance variables
+@param {Object} self Reference to the engine
+###
+Engine.Stats = (I, self) ->
+  measure: (field, filter="", frequency=30) ->
+    ; #TODO
+
+  gatherData: ->
+    self.find()
+


api documentation for model.fromJson

api documentation for model.fromJson


add coffeeScript utility method for better namespaced classes

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


Guard against undefined labels

Guard against undefined labels

--- src/menu-manager.coffee
+++ src/menu-manager.coffee
@@ -73,6 +73,8 @@

   # Private
   normalizeLabel: (label) ->
+    return undefined unless label?
+
     if process.platform is 'win32'
       label.replace(/\&/g, '')
     else


Moved the line that adds the 'dz-started' class where it belongs.

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -268,8 +268,7 @@
     dragleave: (e) -> @element.classList.remove "dz-drag-hover"

     # Called whenever files are dropped or selected
-    selectedfiles: (files) ->
-      @element.classList.add "dz-started" if @element == @previewsContainer
+    selectedfiles: noop

     # Called whenever there are no files left in the dropzone anymore, and the
     # dropzone should be displayed as if in the initial state.
@@ -279,6 +278,8 @@
     # Called when a file is added to the queue
     # Receives `file`
     addedfile: (file) ->
+      @element.classList.add "dz-started" if @element == @previewsContainer
+
       file.previewElement = Dropzone.createElement @options.previewTemplate.trim()
       file.previewTemplate = file.previewElement # Backwards compatibility