implemants tracking timer (proto)

implemants tracking timer (proto)

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


new users should be warned about cson

new users should be warned about cson

improper trailing and leading spaces can cause your bindings to fail.Since cson has very little adoption relative to json, I think it's important to warn new users that they need to understand CoffeeScript notation or else a single space could break their file. I spent one full hour today trying to get an auto-indent mapping to work. The solution involved adding one leading space!

--- dot-atom/keymap.cson
+++ dot-atom/keymap.cson
@@ -19,3 +19,5 @@
 # You can find more information about keymaps in these guides:
 # * https://atom.io/docs/latest/customizing-atom#customizing-key-bindings
 # * https://atom.io/docs/latest/advanced/keymaps
+#
+# Bindings not working? Be aware that son follows CoffeeScript notation with differs with json.


adds super-navigate-back to supersonic

adds super-navigate-back to supersonic

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


New namespace for entities

New namespace for entities

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

--- source/class/entity.coffee
+++ source/class/entity.coffee
@@ -0,0 +1,39 @@
+###
+Constants
+
+@namespace Atoms.Core
+@class Constants
+
+@author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
+###
+"use strict"
+
+class Atoms.Class.Entity extends Atoms.Core.Module
+
+  @extend Atoms.Core.Event
+  @records : {}
+  @attributes: []
+
+  @fields: (attributes...) ->
+    @records    = {}
+    @attributes = if attributes.length then attributes else []
+    @unbind()
+    @
+
+  # Static Methods
+
+  # Instance Methods
+  constructor: (attributes) ->
+    super
+    @className = @constructor.name
+    @uid = @constructor.uid()
+
+
+
+
+# Utilities & Shims
+unless typeof Object.create is 'function'
+  Object.create = (o) ->
+    Func = ->
+    Func.prototype = o
+    new Func()


SidebarSharedMachinesList: Added new class.

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


Relationship: add relationship filtering support for relationship events

--- node_modules_koding/jraphical/lib/relationship.coffee
+++ node_modules_koding/jraphical/lib/relationship.coffee
@@ -127,15 +127,19 @@
   save:(callback)->
     save_.call this, (err, model)=>
       return callback err if err
-      @constructor.emit 'RelationshipSaved', this
-      callback err, model
+      if isEmitRequired @sourceName, @as
+        console.log @sourceName, @as
+        @constructor.emit 'RelationshipSaved', this
+      callback null, model

   remove_ = @::remove
   remove:(callback)->
     remove_.call this, (err)=>
       return callback err if err
-      @constructor.emit 'RelationshipRemoved', this
-      callback err
+      if isEmitRequired @sourceName, @as
+        console.log @sourceName, @as
+        @constructor.emit 'RelationshipRemoved', this
+      callback null

   @oldStaticRemove = @remove
   @remove =(rest..., callback)->
@@ -145,15 +149,19 @@
         return callback err if err
         if res.length > 0
           for rel in res
-            Relationship.emit "RelationshipRemoved", rel
-        callback err
+            if isEmitRequired rel.sourceName, rel.as
+              console.log rel.sourceName, rel.as
+              Relationship.emit "RelationshipRemoved", rel
+        callback null

   update_ = @::update
   update:(rest..., callback)->
     update_.call this, rest..., (err)=>
       return callback err if err
-      @constructor.emit 'RelationshipUpdated', this
-      callback err
+      if isEmitRequired @sourceName, @as
+        console.log @sourceName, @as
+        @constructor.emit 'RelationshipUpdated', this
+      callback null

   @oldStaticUpdate = @update
@@ -164,5 +172,13 @@
         return callback err if err
         if res.length > 0
           for rel in res
-            Relationship.emit "RelationshipUpdated", rel
-        callback err
+            if isEmitRequired rel.sourceName, rel.as
+              console.log rel.sourceName, rel.as
+              Relationship.emit "RelationshipUpdated", rel
+        callback null
+
+  isEmitRequired = (sourceName, as)->
+    sourceConstructor = Base.constructors[sourceName]
+    relEvents = sourceConstructor?.broadcastableRelationships
+    return relEvents and (as in relEvents)
+


let searching non ascii chars

let searching non ascii chars

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


Debug preprocessor coloration (include & define)

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/Morgan9195/language-script.git/'


Increase input throttle to 200ms

Increase input throttle to 200ms

--- src/app/select-list.coffee
+++ src/app/select-list.coffee
@@ -16,7 +16,7 @@
   @viewClass: -> 'select-list'

   maxItems: Infinity
-  inputThrottle: 50
+  inputThrottle: 200
   filteredArray: null
   cancelling: false


Add string type delimiter "|" for property types.

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


Add helper script for extracting list of options and languages

error: pathspec 'script/list-options-and-languages.coffee' did not match any file(s) known to git

--- script/list-options-and-languages.coffee
+++ script/list-options-and-languages.coffee
@@ -0,0 +1,31 @@
+jsonStringify = require('json-stable-stringify')
+Languages = require('../src/languages')
+languages = new Languages().languages
+# console.log(languages.length)
+_ = require('lodash')
+# options = _.chain(languages)
+#             .map((lang) -> return lang.options or [])
+#             .flatten()
+#             .reduce((result, value) ->
+#               _.merge(result, value)
+#               return result
+#             , {})
+#             .value()
+# console.log(jsonStringify(options, {
+#   space: 2
+# }))
+
+langs = _.chain(languages)
+          .map((lang) ->
+            return {
+              name: lang.name,
+              namespace: lang.namespace,
+              extensions: lang.extensions or [],
+              atomGrammars: lang.grammars or [],
+              sublimeSyntaxes: []
+            }
+          )
+          .value()
+console.log(jsonStringify(langs, {
+  space: 2
+}))


syncEventLog() is a better method name

syncEventLog() is a better method name

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


Refs #68; Better event documentation and fixed the way queue size works.

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


add util

add util

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


Add some of the basic utility functions, copied over from R/qtlcharts

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

--- src/util.coffee
+++ src/util.coffee
@@ -0,0 +1,241 @@
+# A variety of utility functions used by the different panel functions
+
+# determine rounding of axis labels
+formatAxis = (d, extra_digits=0) ->
+    d = d[1] - d[0]
+    ndig = Math.floor( Math.log(d % 10) / Math.log(10) )
+    ndig = 0 if ndig > 0
+    ndig = Math.abs(ndig) + extra_digits
+    d3.format(".#{ndig}f")
+
+# unique values of array (ignore nulls)
+unique = (x) ->
+    output = {}
+    output[v] = v for v in x when v
+    output[v] for v of output
+
+# Pull out a variable (column) from a two-dimensional array
+pullVarAsArray = (data, variable) ->
+    v = []
+    for i of data
+        v = v.concat data[i][variable]
+    v
+
+# Select a set of categorical colors
+# ngroup is positive integer
+# palette = "dark" or "pastel"
+selectGroupColors = (ngroup, palette) ->
+    return [] if ngroup == 0
+
+    if palette == "dark"
+        return ["slateblue"] if ngroup == 1
+        return ["MediumVioletRed", "slateblue"] if ngroup == 2
+        return colorbrewer.Set1[ngroup] if ngroup <= 9
+        return d3.scale.category20().range()[0...ngroup]
+    else
+        return ["#bebebe"] if ngroup == 1
+        return ["lightpink", "lightblue"] if ngroup == 2
+        return colorbrewer.Pastel1[ngroup] if ngroup <= 9
+        # below is rough attempt to make _big_ pastel palette
+        return ["#8fc7f4", "#fed7f8", "#ffbf8e", "#fffbb8",
+                "#8ce08c", "#d8ffca", "#f68788", "#ffd8d6",
+                "#d4a7fd", "#f5f0f5", "#cc968b", "#f4dcd4",
+                "#f3b7f2", "#f7f6f2", "#bfbfbf", "#f7f7f7",
+                "#fcfd82", "#fbfbcd", "#87feff", "#defaf5"][0...ngroup]
+
+# expand element/array (e.g., of colors) to a given length
+#     single elment -> array, then repeated to length n
+expand2vector = (input, n) ->
+    return input unless input? # return null if null
+    return input if Array.isArray(input) and input.length >= n
+    input = [input] unless Array.isArray(input)
+    input = (input[0] for i of d3.range(n)) if input.length == 1 and n > 1
+    input
+
+# median of a vector
+median = (x) ->
+    return null if !x?
+    n = x.length
+    x.sort((a,b) -> a-b)
+    if n % 2 == 1
+        return x[(n-1)/2]
+    (x[n/2] + x[(n/2)-1])/2
+
+# maximum difference between adjacent values in a vector
+maxdiff = (x) ->
+    return null if x.length < 2
+    result = x[1] - x[0]
+    return result if x.length < 3
+    for i in [2...x.length]
+        d = x[i] - x[i-1]
+        result = d if d > result
+    result
+
+# matrix extent, min, max, and max of absolute values
+matrixMin = (mat) ->
+    result = mat[0][0]
+    for i of mat
+        for j of mat[i]
+            result = mat[i][j] if result > mat[i][j]
+    result
+
+matrixMax = (mat) ->
+    result = mat[0][0]
+    for i of mat
+        for j of mat[i]
+            result = mat[i][j] if result < mat[i][j]
+    result
+
+matrixMaxAbs = (mat) ->
+    result = Math.abs(mat[0][0])
+    for i of mat
+        for j of mat[i]
+            result = Math.abs(mat[i][j]) if result < Math.abs(mat[i][j])
+    result
+
+matrixExtent = (mat) -> [matrixMin(mat), matrixMax(mat)]
+
+# move an object to front or back
+d3.selection.prototype.moveToFront = () ->
+    this.each () -> this.parentNode.appendChild(this)
+
+d3.selection.prototype.moveToBack = () ->
+    this.each () ->
+        firstChild = this.parentNode.firstchild
+        this.parentNode.insertBefore(this, firstChild) if firstChild
+
+# force an object to be an array (rather than a scalar)
+forceAsArray = (x) ->
+    return x unless x? # if null, return null
+    return x if Array.isArray(x)
+    [x]
+
+# any values in vec that appear in missing are made null
+missing2null = (vec, missingvalues=['NA', '']) ->
+    vec.map (value) -> if missingvalues.indexOf(value) > -1 then null else value
+
+# display error at top of page
+displayError = (message, divid=null) ->
+    div = "div.error"
+    div += "##{divid}" if divid?
+    if d3.select(div).empty() # no errors yet
+        d3.select("body")
+          .insert("div", ":first-child")
+          .attr("class", "error")
+    d3.select(div)
+      .append("p")
+      .text(message)
+
+# sum values in an array
+sumArray = (vec) -> (vec.reduce (a,b) -> (a*1)+(b*1))
+
+# calculate cross-tabulation
+calc_crosstab = (data) ->
+    nrow = data.ycat.length
+    ncol = data.xcat.length
+
+    result = ((0 for col in [0..ncol]) for row in [0..nrow]) # matrix of 0's
+
+    # count things up
+    for i of data.x
+        result[data.y[i]][data.x[i]] += 1
+
+    # row and column sums
+    rs = rowSums(result)
+    cs = colSums(result)
+
+    # fill in column sums
+    for i in [0...ncol]
+        result[nrow][i] = cs[i]
+
+    # fill in row sums
+    for i in [0...nrow]
+        result[i][ncol] = rs[i]
+
+    # fill in total
+    result[nrow][ncol] = sumArray(rs)
+
+    result
+
+# rowSums: the sums for each row
+rowSums = (mat) -> (sumArray(x) for x in mat)
+
+# transpose: matrix transpose
+transpose = (mat) -> ((mat[i][j] for i in [0...mat.length]) for j in [0...mat[0].length])
+
+# colSums = the sums for each column
+colSums = (mat) -> rowSums(transpose(mat))
+
+# log base 2
+log2 = (x) ->
+    return(x) unless x?
+    Math.log(x)/Math.log(2.0)
+
+# log base 10
+log10 = (x) ->
+    return(x) unless x?
+    Math.log(x)/Math.log(10.0)
+
+# absolute value, preserving nulls
+abs = (x) ->
+    return(x) unless x?
+    Math.abs(x)
+
+# mean of y for each possible value of g
+mean_by_group = (g, y) ->
+    means = {}
+    n = {}
+    for i of g
+        if n[g[i]]?
+            means[g[i]] += y[i]
+            n[g[i]] += 1
+        else
+            means[g[i]] = y[i]
+            n[g[i]] = 1
+    for i of means
+        means[i] /= n[i]
+    means
+
+# SD of y for each possible value of g
+sd_by_group = (g, y) ->
+    means = mean_by_group(g, y)
+    sds = {}
+    n = {}
+    for i of g
+        dev = (y[i] - means[g[i]])
+        if n[g[i]]?
+            sds[g[i]] += (dev*dev)
+            n[g[i]] += 1
+        else
+            sds[g[i]] = (dev*dev)
+            n[g[i]] = 1
+
+    for i of sds
+        sds[i] = if n[i] < 2 then null else Math.sqrt(sds[i]/(n[i]-1))
+
+    sds
+
+# count groups
+count_groups = (g) ->
+    n = {}
+    for i of g
+        if n[g[i]]?
+            n[g[i]] += 1
+        else
+            n[g[i]] = 1
+    n
+
+# CI for mean(y) for each possible value of g
+#  (as mean +/- m*SD)
+ci_by_group = (g, y, m=2) ->
+    n = count_groups(g)
+    means = mean_by_group(g, y)
+    sds = sd_by_group(g,y)
+    ci = {}
+    for i of means
+        ci[i] =
+            mean: means[i]
+            low: if n[i]>0 then means[i] - m*sds[i]/Math.sqrt(n[i]) else means[i]
+            high: if n[i]>0 then means[i] + m*sds[i]/Math.sqrt(n[i]) else means[i]
+
+    ci


referencetype is better than itemtype

referencetype is better than itemtype

error: pathspec 'resource/translators/Better' did not match any file(s) known to git
error: pathspec 'BibLaTeX.coffee' did not match any file(s) known to git


Remove _normal and _bigger from twitter avatar url

Closes #5501

--- server/methods/getAvatarSuggestion.coffee
+++ server/methods/getAvatarSuggestion.coffee
@@ -27,7 +27,7 @@
 	if user.services.twitter?.profile_image_url_https? and RocketChat.settings.get 'Accounts_OAuth_Twitter'
 		avatars.push
 			service: 'twitter'
-			url: user.services.twitter.profile_image_url_https
+			url: user.services.twitter.profile_image_url_https.replace(/_normal|_bigger/, '')

 	if user.services.gitlab?.avatar_url? and RocketChat.settings.get 'Accounts_OAuth_Gitlab'
 		avatars.push


remove root object from api response

remove root object from api response

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/3zcurdia/feedanalyzer.git/'


Adjusted key mapping to match description in help file

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


Remove redundant check, make isSelected's behaviour match its contract

--- lib/dom_utils.coffee
+++ lib/dom_utils.coffee
@@ -171,13 +171,11 @@
   # being accessed.
   isSelected: (element) ->
     if element.isContentEditable
-      node = document.getSelection()?.anchorNode
+      node = document.getSelection().anchorNode
       node and @isDOMDescendant element, node
     else
-      # Note.  This makes the wrong decision if the user has placed the caret at the start of element.  We
-      # cannot distinguish that case from the user having made no selection.
       try
-        element.selectionEnd != 0
+        element.selectionStart != element.selectionEnd
       catch
         # This input element doesn't support selectionStart/selectionEnd.
         # NOTE(mrmr1993): We choose true here because it does the right thing everywhere in the code. I am


Added cli tests back.

Added cli tests back.

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

--- test/cli.coffee
+++ test/cli.coffee
@@ -0,0 +1,83 @@
+fs            = require 'fs'
+should        = require('chai').should()
+{existsSync}  = require '../src/utils'
+{join}        = require 'path'
+{exec}        = require 'child_process'
+
+describe 'cli', ->
+  stdout = null
+  reqFiles = [
+    'require.define(["/a","70f886d883"]'
+    'require.define(["/b","8908bb92f8"]'
+    'require.define(["/c","318af1af20"]'
+    'require.define(["/entry","21568343a3"]'
+  ]
+  reqDirectories = [
+    'require.define(["/test/assets/foo","58c67562d2"]'
+  ]
+  reqModules = [
+    'require.define(["/node_modules/mod","e63313c6a9"]'
+  ]
+  reqTemplates = [
+    'require.define(["/test/assets/template","04e021b689"]'
+  ]
+  prelude = 'require = (function() {'
+  jadeRuntime = 'jade=function(exports){Array.isArray||(Array.isArray=function(arr)'
+  callEntry = "require('21568343a3');"
+  afterScripts = "alert('after');"
+  beforeScripts = "alert('before');"
+
+  before (done) ->
+    # Generate dummy npm module if necessary.
+    mod = join __dirname, '..', 'node_modules', 'mod'
+    if not existsSync mod
+      fs.mkdirSync mod
+      fs.writeFileSync join(mod, 'index.js'), "module.exports = {x: 42};"
+
+    pathTo = (file) -> join __dirname, file
+    cmd = "#{pathTo '../bin/requisite'}
+          -e #{pathTo './assets/entry'}
+          -b #{pathTo './assets/vendor/before.js'}
+          -a #{pathTo './assets/vendor/after.js'}"
+
+    exec cmd, (error, _stdout, stderr) ->
+      throw error if error
+      throw stderr if stderr
+      stdout = _stdout
+      done()
+
+  describe 'bundle#bundle()', ->
+    it 'should include the appropriate prelude', ->
+      stdout.should.have.string prelude
+
+    it 'should find and define all absolute/relatively required files properly', ->
+      for str in reqFiles
+        stdout.should.have.string str
+
+    it 'should find and define all absolute/relatively required directories properly', ->
+      for str in reqDirectories
+        stdout.should.have.string str
+
+    it 'should find and define all modules required from node_modules', ->
+      for str in reqModules
+        stdout.should.have.string str
+
+    it 'should include appropriate vendor scripts after bundled code', ->
+      stdout.should.have.string afterScripts
+
+    it 'should include appropriate vendor scripts before bundled code', ->
+      stdout.should.have.string beforeScripts
+
+    it 'should find and define all modules required from node_modules', ->
+      for str in reqModules
+        stdout.should.have.string str
+
+    it 'should find and define all jade templates', ->
+      for str in reqTemplates
+        stdout.should.have.string str
+
+    it 'should include the jade runtime', ->
+      stdout.should.have.string jadeRuntime
+
+    it 'should automatically call the entry module', ->
+      stdout.should.have.string callEntry


Add command about show lunch menu list

Add command about show lunch menu list

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


Convert all tags to lowercase, and only add nonempty tags.

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


Organize imports

Organize imports

--- src/atom.coffee
+++ src/atom.coffee
@@ -1,18 +1,20 @@
-fs = require 'fs-plus'
-{$} = require './space-pen-extensions'
-_ = require 'underscore-plus'
-Package = require './package'
+crypto = require 'crypto'
 ipc = require 'ipc'
+os = require 'os'
+path = require 'path'
 remote = require 'remote'
 shell = require 'shell'
-crypto = require 'crypto'
-path = require 'path'
-os = require 'os'
 dialog = remote.require 'dialog'
 app = remote.require 'app'
+
+_ = require 'underscore-plus'
 {Document} = require 'telepath'
+fs = require 'fs-plus'
+{Subscriber} = require 'emissary'
+
+{$} = require './space-pen-extensions'
 DeserializerManager = require './deserializer-manager'
-{Subscriber} = require 'emissary'
+Package = require './package'
 SiteShim = require './site-shim'
 WindowEventHandler = require './window-event-handler'


Specs for SelectField

Specs for SelectField

error: pathspec 'spec/lanes/components/select-field/SelectFieldSpec.coffee' did not match any file(s) known to git

--- spec/lanes/components/select-field/SelectFieldSpec.coffee
+++ spec/lanes/components/select-field/SelectFieldSpec.coffee
@@ -0,0 +1,80 @@
+#= require lanes/components/select-field
+
+Brand = Lanes.Test.defineModel(
+    props: {id: 'integer', code: 'string', name: 'string'}
+)
+
+BRAND_DATA = {total:3, success:true, message:"Retrieve succeeded", data:[
+    {id: 1, code: "GM",    name: "General Motors"}
+    {id: 2, code: "FORD",  name: "Ford Motor Co."}
+    {id: 3, code: "DODGE", name: "Chrysler/Dodge"}
+]}
+
+Car = Lanes.Test.defineModel(
+    props: {id: 'integer', code: 'string', brand_id: 'integer'}
+    session:
+        carTypes: 'array'
+
+    associations:
+        brand: {model: Brand}
+)
+
+describe "Lanes.Components.SelectField", ->
+    beforeEach (done) ->
+        @car = new Car
+        LT.syncRespondWith(BRAND_DATA)
+        @brands = new Brand.Collection
+        @brands.ensureLoaded().then(done)
+
+    it "renders read only", ->
+        sf = LT.renderComponent(LC.SelectField, props:{model: @car, name: 'brand', labelField: 'name'})
+        expect(_.dom(sf).qs('.display').text).toBe('')
+        @car.set(brand: @brands.at(0))
+        expect(_.dom(sf).qs('.display').text).toBe('General Motors')
+
+
+    it "renders as edit", ->
+        @car.set(brand: @brands.at(1))
+        sf = LT.renderComponent(LC.SelectField, props:{
+            model: @car, name: 'brand', labelField: 'name', editOnly: true, collection: @brands
+        })
+        expect(_.dom(sf).qs('input[type=text]').value).toEqual('Ford Motor Co.')
+
+    it 'uses a custom data source', ->
+        sf = LT.renderComponent(LC.SelectField, props:{
+            model: @car, name: 'brand', editOnly: true
+            getSelection: -> { label: 'Toyota', id: 4 }
+        })
+        expect(_.dom(sf).qs('input[type=text]').value).toEqual('Toyota')
+
+    it 'sets value when changed', ->
+        @car.set(brand: @brands.at(1))
+        sf = LT.renderComponent(LC.SelectField, props:{
+            model: @car, name: 'brand', labelField: 'name', editOnly: true, collection: @brands
+        })
+        _.dom(sf).qs('.rw-select').click()
+        _.dom(sf).qs('li.rw-list-option:last-child').click()
+        expect(@car.brand.code).toEqual('DODGE')
+
+    it 'can select multiple values', ->
+        sf = LT.renderComponent(LC.SelectField, props:{
+            multi: true, model: @car, name: 'carTypes',
+            labelField: 'name', editOnly: true, collection: @brands
+        })
+        spyOn(@brands, 'fetch').and.callThrough()
+        _.dom(sf).qs('.rw-input').focus()
+        expect(@brands.fetch).toHaveBeenCalled()
+
+        expect( _.dom(sf).qsa('.rw-list-option').length ).toEqual(@brands.length)
+        _.dom(sf).qs('.rw-list-option:nth-child(1)').click()
+        _.dom(sf).qs('.rw-input').focus()
+        _.dom(sf).qs('.rw-list-option:nth-child(3)').click()
+        expect(_.pluck(@car.carTypes, 'id')).toEqual([1, 3])
+
+    it 'renders label for multiple values', ->
+        @car.carTypes = [ @brands.at(0), @brands.at(2) ]
+        sf = LT.renderComponent(LC.SelectField, props:{
+            multi: true, model: @car, name: 'carTypes',
+            labelField: 'name', collection: @brands
+        })
+        expect(_.dom(sf).qs('.display').text).toEqual('General Motors and Chrysler/Dodge')


first version of personal statistics #45

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

--- src/server/models/ComputePersonal.coffee
+++ src/server/models/ComputePersonal.coffee
@@ -0,0 +1,108 @@
+db = require('./db')
+Sequelize = require('sequelize')
+PLAYER_ROLES = require('./constants').PLAYER_ROLES
+GAME_RESULT = require('./constants').GAME_RESULT
+rating = require('./rating_formula_342')
+
+handleError(err)->
+    if err
+        done(err, null)
+
+module.exports = (playerName, done)->
+    profile = {
+        "name": "",
+        "rating": 0,
+        "winsCitizen": 0,
+        "winsSheriff": 0,
+        "winsMafia": 0,
+        "winsDon": 0,
+        "gamesCitizen": 0,
+        "gamesSheriff": 0,
+        "gamesMafia": 0,
+        "gamesDon": 0,
+        "likesCitizen": 0,
+        "likesSheriff": 0,
+        "likesMafia": 0,
+        "likesDon": 0,
+        "bestPlayerCitizen": 0,
+        "bestPlayerSheriff": 0,
+        "bestPlayerMafia": 0,
+        "bestPlayerDon": 0,
+        "bestMoveAccuracy": 0.0,
+        "firstKilledNightCitizen": 0,
+        "firstKilledNightSheriff": 0,
+        "firstKilledNightMafia": 0,
+        "firstKilledNightDon": 0,
+        "firstKilledDayCitizen": 0,
+        "firstKilledDaySheriff": 0,
+        "firstKilledDayMafia": 0,
+        "firstKilledDayDon": 0,
+        "foulsCitizen": 0,
+        "foulsSheriff": 0,
+        "foulsMafia": 0,
+        "foulsDon": 0
+        "efficiency": []
+    }
+    db.Player.find({where: {name: playerName}}).success((player)->
+        db.PlayerGame.findAll({where: {PlayerId: player.id}}).success((playerGames)->
+            chainer = new Sequelize.Utils.QueryChainer
+            for playerGame in playerGames
+                chainer.add(playerGame, 'getGame', [])
+            chainer.runSerially().success((games)->
+                profile.name = playerName
+                bestMoveAttempts = 0
+                foundedMafiaOnBestMove = 0
+                for i in [0...playerGames.length]
+                    role = playerGames[i]
+                    result = games[i].result
+                    delta = 0
+                    if playerGame.role in [PLAYER_ROLES.CITIZEN, PLAYER_ROLES.SHERIFF]
+                        delta = if result == GAME_RESULT.CITIZENS_WIN then 1 else -1
+                    if playerGame.role in [PLAYER_ROLES.MAFIA, PLAYER_ROLES.DON]
+                        delta = if result == GAME_RESULT.MAFIA_WIN then 1 else -1
+                    profile.efficiency.push({
+                        gameID: games[i].id
+                        date: games[i].date
+                        winsMinusLosses: delta
+                    })
+                    profile.rating += rating(playerGame, result)
+                    profile.winsCitizen += 1 if result == GAME_RESULT.CITIZENS_WIN and playerGame.role == PLAYER_ROLES.CITIZEN
+                    profile.winsSheriff += 1 if result == GAME_RESULT.CITIZENS_WIN and playerGame.role == PLAYER_ROLES.SHERIFF
+                    profile.winsMafia += 1 if result == GAME_RESULT.MAFIA_WIN and playerGame.role == PLAYER_ROLES.MAFIA
+                    profile.winsDon += 1 if result == GAME_RESULT.MAFIA_WIN and playerGame.role == PLAYER_ROLES.DON
+                    profile.gamesCitizen += 1 if playerGame.role == PLAYER_ROLES.CITIZEN
+                    profile.gamesSheriff += 1 if playerGame.role == PLAYER_ROLES.SHERIFF
+                    profile.gamesMafia += 1 if playerGame.role == PLAYER_ROLES.MAFIA
+                    profile.gamesDon += 1 if playerGame.role == PLAYER_ROLES.DON
+                    profile.likesCitizen += playerGame.likes if playerGame.role == PLAYER_ROLES.CITIZEN
+                    profile.likesSheriff += playerGame.likes if playerGame.role == PLAYER_ROLES.SHERIFF
+                    profile.likesMafia += playerGame.likes if playerGame.role == PLAYER_ROLES.MAFIA
+                    profile.likesDon += playerGame.likes if playerGame.role == PLAYER_ROLES.DON
+                    profile.bestPlayerCitizen += 1 if playerGame.role == PLAYER_ROLES.CITIZEN and playerGame.is_best
+                    profile.bestPlayerSheriff += 1 if playerGame.role == PLAYER_ROLES.SHERIFF and playerGame.is_best
+                    profile.bestPlayerMafia += 1 if playerGame.role == PLAYER_ROLES.MAFIA and playerGame.is_best
+                    profile.bestPlayerDon += 1 if playerGame.role == PLAYER_ROLES.DON and playerGame.is_best
+                    bestMoveAttempts += 1 if playerGame.took_best_move
+                    foundedMafiaOnBestMove += playerGame.best_move_accuracy if playerGame.took_best_move
+                    profile.firstKilledNightCitizen += 1 if playerGame.role == PLAYER_ROLES.CITIZEN and playerGame.is_killed_first_at_night
+                    profile.firstKilledNightSheriff += 1 if playerGame.role == PLAYER_ROLES.SHERIFF and playerGame.is_killed_first_at_night
+                    profile.firstKilledNightMafia += 1 if playerGame.role == PLAYER_ROLES.MAFIA and playerGame.is_killed_first_at_night
+                    profile.firstKilledNightDon += 1 if playerGame.role == PLAYER_ROLES.DON and playerGame.is_killed_first_at_night
+                    profile.firstKilledDayCitizen += 1 if playerGame.role == PLAYER_ROLES.CITIZEN and playerGame.is_killed_first_by_day
+                    profile.firstKilledDaySheriff += 1 if playerGame.role == PLAYER_ROLES.SHERIFF and playerGame.is_killed_first_by_day
+                    profile.firstKilledDayMafia += 1 if playerGame.role == PLAYER_ROLES.MAFIA and playerGame.is_killed_first_by_day
+                    profile.firstKilledDayDon += 1 if playerGame.role == PLAYER_ROLES.DON and playerGame.is_killed_first_by_day
+                    profile.foulsCitizen += playerGame.fouls if playerGame.role == PLAYER_ROLES.CITIZEN
+                    profile.foulsSheriff += playerGame.fouls if playerGame.role == PLAYER_ROLES.SHERIFF
+                    profile.foulsMafia += playerGame.fouls if playerGame.role == PLAYER_ROLES.MAFIA
+                    profile.foulsDon += playerGame.fouls if playerGame.role == PLAYER_ROLES.DON
+                profile.bestMoveAccuracy = if bestMoveAttempts then foundedMafiaOnBestMove / bestMoveAttempts else 0.0
+                profile.efficiency.sort((a, b)->
+                    return if a.date > b.date then 1 else -1
+                )
+                for i in [1...playerGames.length]
+                    profile.efficiency[i].winsMinusLosses += profile.efficiency[i - 1].winsMinusLosses
+                done(null, profile)
+            ).error(handleError)
+        ).error(handleError)
+    ).error(handleError)


Check event chain has an address

Check event chain has an address

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


:memo: Add types in Pane.destroyItem docs

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


More benchmarks

More benchmarks

--- benchmark/benchmark-suite.coffee
+++ benchmark/benchmark-suite.coffee
@@ -132,9 +132,31 @@
         benchmark "DOM", 20000, ->
           editor.gutter.getLineNumberElementsForClass('omgwow')

-      describe "getLineNumberElement.", ->
-        benchmark "DOM", 20000, ->
-          editor.gutter.getLineNumberElementDOM(12)
+      benchmark "getLineNumberElement.DOM", 20000, ->
+        editor.gutter.getLineNumberElement(12)
+
+      benchmark "toggle-class", 2000, ->
+        editor.gutter.addClassToLine(40, 'omgwow')
+        editor.gutter.removeClassFromLine(40, 'omgwow')
+
+      describe "find-then-unset.", ->
+        classes = ['one', 'two', 'three', 'four']
+
+        benchmark "single-class", 200, ->
+          editor.gutter.addClassToLine(30, 'omgwow')
+          editor.gutter.addClassToLine(40, 'omgwow')
+          editor.gutter.removeClassFromAllLines('omgwow')
+
+        benchmark "multiple-class", 200, ->
+          editor.gutter.addClassToLine(30, 'one')
+          editor.gutter.addClassToLine(30, 'two')
+
+          editor.gutter.addClassToLine(40, 'two')
+          editor.gutter.addClassToLine(40, 'three')
+          editor.gutter.addClassToLine(40, 'four')
+
+          for klass in classes
+            editor.gutter.removeClassFromAllLines(klass)

     describe "line-htmlification.", ->
       div = null


Add peopleofwalmart.com integration

Add peopleofwalmart.com integration

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

--- src/scripts/walmart.coffee
+++ src/scripts/walmart.coffee
@@ -0,0 +1,16 @@
+# Show a random image from peopleofwalmart.com
+#
+# walmart me - Show random Walmart image
+# mart me - Show random Walmart image
+#
+module.exports = (robot) ->
+  robot.respond /(wal)?mart( me)?/i, (msg) ->
+    random = Math.floor(Math.random() * 770)
+    msg.http("http://www.peopleofwalmart.com/photos/random-photos/page/" + random)
+    .get() (err, res, body) ->
+      col1 = body.indexOf '<div class="column_one">'
+      if (col1 != -1)
+        body = body.substring col1
+        match = body.match /http:\/\/media.peopleofwalmart.com\/wp-content\/uploads\/\d\d\d\d\/\d\d\/.+?\.jpg/g
+        if (match)
+          msg.send match[0]


Little fix on dashboard, now show billable people in first row, and non-billable on second, regarding their role (#19)

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


CLIO-23455: Cleaned up spec; removed jQuery dependencies.

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


capitalization fix.

capitalization fix.

--- apps/home/client/index.coffee
+++ apps/home/client/index.coffee
@@ -69,7 +69,7 @@
   renderSuggestedArtworks: ->
     @user.fetchSuggestedHomepageArtworks success: (artworks) =>
       if artworks.models.length
-        this.setFeaturedArtworksHeader('New for You on Artsy')
+        this.setFeaturedArtworksHeader('New for you on Artsy')
         $('#home-featured-artworks').html featuredArtworksTemplate(artworks: artworks.models[0..3])
       else
         this.renderFeaturedArtworks()


Only save user if not existing yet.

Only save user if not existing yet.

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/jhbruhn/keybase-gui.git/'


Implements SaleArtworks collection

Implements SaleArtworks collection

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

--- collections/sale_artworks.coffee
+++ collections/sale_artworks.coffee
@@ -0,0 +1,16 @@
+_           = require 'underscore'
+sd          = require('sharify').data
+Backbone    = require 'backbone'
+{ Fetch }   = require 'artsy-backbone-mixins'
+
+module.exports = class SaleArtworks extends Backbone.Collection
+  _.extend @prototype, Fetch(sd.ARTSY_URL)
+
+  comparator: 'position'
+
+  url: ->
+    "#{sd.ARTSY_URL}/api/v1/sale/#{@id}/sale_artworks"
+
+  initialize: (models, options = {}) ->
+    { @id } = options
+    super


change scroll delta

change scroll delta

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


fix project visibility after creating new project

[#88496616]


provide configuration options for sliding

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/Creative-Licence-Digital/backbone.viewstack.git/'


AdminModal: Use plusSigns generator in geoPattern.

--- client/admin/lib/views/groupgeneralsettingsview.coffee
+++ client/admin/lib/views/groupgeneralsettingsview.coffee
@@ -146,7 +146,7 @@
     if logo
       avatarEl.style.backgroundImage = "url(#{logo})"
     else
-      pattern = geoPattern.generate jGroup.title
+      pattern = geoPattern.generate jGroup.title, generator: 'plusSigns'

       avatarEl.style.backgroundImage = pattern.toDataUrl()
       avatarEl.style.borderColor     = pattern.color


AdminMembersView: Inline @addSubView calls.

--- client/admin/lib/views/members/adminmembersview.coffee
+++ client/admin/lib/views/members/adminmembersview.coffee
@@ -22,7 +22,7 @@

   createTabView: ->

-    @tabView = new KDTabView hideHandleCloseIcons: yes
+    @addSubView @tabView = new KDTabView hideHandleCloseIcons: yes

     @tabView.addPane @allMembersPane     = new KDTabPaneView name: 'All Members'
     @tabView.addPane @adminsPane         = new KDTabPaneView name: 'Admins'
@@ -30,6 +30,4 @@
     @tabView.addPane @blockedMembersPane = new KDTabPaneView name: 'Blocked'

     @tabView.showPaneByIndex 0
-    @allMembersPane.addSubView new TeamMembersView
-
-    @addSubView @tabView
+    @allMembersPane.addSubView new TeamMembersView {}, @getData()


Fixed: validate() was returning an object.

--- client/landing/app/MainApp/kodingappscontroller.coffee
+++ client/landing/app/MainApp/kodingappscontroller.coffee
@@ -502,7 +502,7 @@
                   color           : "#444444"
                   diameter        : 12
                 callback          : =>
-                  unless newAppModal.modalTabs.forms.form.inputs.name.validate()
+                  unless newAppModal.modalTabs.forms.form.inputs.name.validate().valid
                     newAppModal.modalTabs.forms.form.buttons.Create.hideLoader()
                     return
                   name        = newAppModal.modalTabs.forms.form.inputs.name.getValue()


removing addition logging.

removing addition logging.

--- vminpoly.coffee
+++ vminpoly.coffee
@@ -285,5 +285,4 @@
   window.onresize = onresize
   return

-console.log 'About to do the engine unless...', browserSupportsUnitsNatively()
 initLayoutEngine() unless browserSupportsUnitsNatively()


added boilerplate index file

added boilerplate index file

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

--- index.coffee
+++ index.coffee
@@ -0,0 +1,12 @@
+fs = require 'fs'
+path = require 'path'
+
+module.exports = (robot, scripts) ->
+  scriptsPath = path.resolve(__dirname, 'src')
+  fs.exists scriptsPath, (exists) ->
+    if exists
+      for script in fs.readdirSync(scriptsPath)
+        if scripts? and '*' not in scripts
+          robot.loadFile(scriptsPath, script) if script in scripts
+        else
+          robot.loadFile(scriptsPath, script)


Add class on main section.

Add class on main section.

--- core/htdocs_source/src/pods/oxisection-main/component.coffee
+++ core/htdocs_source/src/pods/oxisection-main/component.coffee
@@ -1,7 +1,10 @@
 `import Em from "vendor/ember"`

 Component = Em.Component.extend
+    classNameBindings: ["type"]
+
     type: Em.computed "content.type", -> "oxisection-" + @get "content.type"
+
     actions:
         buttonClick: (button) ->
             Em.set button, "loading", true


There are some cases where `dependent.dependencies` can be undefined

--- src/fs_utils/file_list.coffee
+++ src/fs_utils/file_list.coffee
@@ -85,6 +85,7 @@
   compileDependencyParents: (path) ->
     parents = @files
       .filter (dependent) =>
+        dependent.dependencies and
         dependent.dependencies.length > 0 and
         path in dependent.dependencies and
         not @compiled[dependent.path]


cmd-shift-I

cmd-shift-I

--- static/key-bindings.coffee
+++ static/key-bindings.coffee
@@ -3,7 +3,7 @@
   'cmd-o': (app) -> app.open()

 window:
-  'cmd-shift-i': (window) -> window.showConsole()
+  'cmd-shift-I': (window) -> window.showConsole()
   'cmd-r': (window) -> window.reload()

 editor:


Correct operator spacing lint error.

Correct operator spacing lint error.

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


fix (tabs) Do not calculate height because of spinner hide feat, use default value from css.

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


Snippets: adding fancy autocomplete snippets for oft-used functions

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

--- snippets/language-mathematica.cson
+++ snippets/language-mathematica.cson
@@ -0,0 +1,50 @@
+".source.mathematica":
+  "Begin ... `Private`":
+    prefix: "begin"
+    body: '''
+      Begin["${1:\\`Private\\`}"]
+      $0
+      End[]
+    '''
+  BeginPackage:
+    prefix: "package"
+    body: '''
+      BeginPackage["${TM_FILENAME/\\.m$/`/}"]
+      $0
+      EndPackage[]
+    '''
+  Cases:
+    prefix: "cases"
+    body: "Cases[${1:list}, ${2:{$3\\}${4: /; ${5:{$6\\}}}${7: ${8::>} ${9:{$10\\}}}}]$0"
+  "If/Condition/True/False":
+    prefix: "if"
+    body: "If[${1:(* condition *)}, \n\t${2:(* value when true *)},\n\t${3:(* value when false *)}\n]"
+  Map:
+    prefix: "map"
+    body: "Map[\n\t${1:(* function *)}, \n\t${2:(* expression *)}${3:,\n\t${4:(* levelspec *)}}\n]"
+  Module:
+    prefix: "module"
+    body: '''
+      Module[{${1:${2:var}}},
+      	${0:expr}
+      ]
+    '''
+  With:
+    prefix: "with"
+    body: '''
+      With[{${1:var} = ${2:val}},
+      	${0:expr}
+      ]
+    '''
+  SetDelayed:
+    prefix: ":="
+    body: "$1[$2] := $0"
+  "Special: rule":
+    prefix: "r"
+    body: "$1 -> $2$0"
+  "Special: rule delayed":
+    prefix: "rd"
+    body: "$1 :> $2$0"
+  Select:
+    prefix: "select"
+    body: "Select[${1:(* list *)}, ${0:(* filter *)}${2:, ${3:(* first n elemens *)}}]"


Make work in IE9

Make work in IE9

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


update drawer default config

update drawer default config

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


Update to imageButton for android

Update to imageButton for android

error: pathspec 'Framework/Views/Controls/ImageButton_Framework_Android.coffee' did not match any file(s) known to git

--- Framework/Views/Controls/ImageButton_Framework_Android.coffee
+++ Framework/Views/Controls/ImageButton_Framework_Android.coffee
@@ -0,0 +1,51 @@
+root.ImageButton_Framework_Android = class ImageButton_Framework_Android extends root.ImageButton_Framework
+  constructor:(options = {}) ->
+    options = root._.extend {}, options
+    super options
+
+  createBackButton: (settings) =>
+
+  createButton: (settings) =>
+
+    @button = Ti.UI.createView {
+      height: Ti.UI.FILL
+      width: settings.width
+      top: settings.top
+      right: settings.right
+      bottom: settings.bottom
+      left: settings.left
+    }
+
+    @buttonBackground = Ti.UI.createView {
+      width: settings.width
+      height: Ti.UI.FILL
+      backgroundColor: '#000'
+      opacity: 0.5
+    }
+
+    if settings.iconSettings?
+      @icon = Ti.UI.createImageView(settings.iconSettings)
+      @icon.touchEnabled = false
+      @icon.zIndex = 1000
+      @button.add @icon
+
+    @button.add @buttonBackground
+
+    @setEnabled(settings.enabled)
+
+    @button
+
+  setTitle: (title) =>
+
+  togglePressed: =>
+
+  onTouchStart: =>
+
+  onTouchEnd: =>
+    @options.onClick()
+
+  setEnabled: (enabled) =>
+    if enabled
+      @button.addEventListener "click", @onTouchEnd
+    else
+      @button.removeEventListener "click", @onTouchEnd


Delete unused icon, reorder dropdown.

Delete unused icon, reorder dropdown.

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


Add a smoketest to load the top-level React component

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

--- test/main/smoketest.coffee
+++ test/main/smoketest.coffee
@@ -0,0 +1,5 @@
+require '../testHelper'
+require '../../app/assets/javascripts/main'
+
+describe 'top-level react router', ->
+  it 'loads without an error', ->


Add word to filter bypass

Add word to filter bypass

remote: Repository unavailable due to DMCA takedown.
remote: See the takedown notice for more details:
remote:   https://github.com/github/dmca/blob/master/2018/2018-09-28-TeraPC.md.
fatal: unable to access 'https://github.com/meishuu/tera-discord-relay.git/': The requested URL returned error: 403


warn if no hostname; filter only "started" services.

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


linting

linting

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


Prevent autoscrolling scroll-view when cursor is at end of longest line

If the longest line is longer than the width of the scroll view, we need
to allow 2px horizontally to prevent the hidden input from
autoscrolling.

--- src/editor-scroll-view-component.coffee
+++ src/editor-scroll-view-component.coffee
@@ -169,6 +169,7 @@
     return {top: 0, left: 0} unless @isMounted() and focused and editor.getCursor()?

     {top, left, height, width} = editor.getCursor().getPixelRect()
+    width = 2 if width is 0 # Prevent autoscroll at the end of longest line
     top -= editor.getScrollTop()
     left -= editor.getScrollLeft()
     top = Math.max(0, Math.min(editor.getHeight() - height, top))


activity: create PublicChannelLink component

error: pathspec 'client/activity/lib/components/publicchannellink/index.coffee' did not match any file(s) known to git

--- client/activity/lib/components/publicchannellink/index.coffee
+++ client/activity/lib/components/publicchannellink/index.coffee
@@ -0,0 +1,19 @@
+kd = require 'kd'
+React = require 'kd-react'
+Link  = require 'app/components/common/link'
+
+
+module.exports = class PublicChannelLink extends React.Component
+
+  @defaultProps = { to: null }
+
+
+  channel: (key) -> @props.to?.getIn ['channel', key]
+
+
+  render: ->
+    <Link {...@props}
+      className={kd.utils.curry "PublicChannelLink", @props.className}
+      href="/Channels/#{@channel('name') ? '#'}">
+      {@props.children}
+    </Link>


client: stackeditor: created a new class for credential list item

error: pathspec 'client/stack-editor/lib/credentials/credentiallistitem.coffee' did not match any file(s) known to git

--- client/stack-editor/lib/credentials/credentiallistitem.coffee
+++ client/stack-editor/lib/credentials/credentiallistitem.coffee
@@ -0,0 +1,112 @@
+kd      = require 'kd'
+JView   = require 'app/jview'
+Tracker = require 'app/util/tracker'
+
+
+module.exports = class CredentialListItem extends kd.ListItemView
+
+  JView.mixin @prototype
+
+  constructor: (options = {}, data) ->
+
+    options.cssClass = kd.utils.curry "StackEditor-CredentialItem #{kd.utils.slugify data.provider}", options.cssClass
+
+    super options, data
+
+    delegate = @getDelegate()
+    { identifier, owner, title, verified } = credential = @getData()
+
+    @deleteButton = new kd.ButtonView
+      cssClass  : 'solid compact outline red secondary delete'
+      title     : 'DELETE'
+      callback  : =>
+        delegate.emit 'ItemAction', { action : 'RemoveItem', item : this }
+
+    @showCredentialButton = new kd.ButtonView
+      cssClass  : 'solid compact outline secondary show'
+      title     : 'SHOW'
+      callback  : =>
+        delegate.emit 'ItemAction', { action : 'ShowItem', item : this }
+
+    @verifyButton = new kd.ButtonView
+      cssClass : 'solid compact outline verify'
+      title    : 'USE THIS & CONTINUE'
+      loader   :
+        color  : '#666'
+      callback : @bound 'verifyCredential'
+
+    @inuseView = new kd.CustomHTMLView
+      cssClass : 'custom-tag hidden inuse'
+      partial  : 'IN USE'
+      tooltip  :
+        title  : 'This stack template currently using this credential'
+
+    { stackTemplate }       = @getOptions()
+    { selectedCredentials } = delegate.getOptions()
+
+    credentials = stackTemplate?.credentials ? {}
+    credentials = (credentials[val].first for val of credentials)
+    credentials = credentials.concat (selectedCredentials or [])
+
+    if identifier in credentials
+      credential.inuse = yes
+      @inuseView.show()
+
+    @warningView = new kd.CustomHTMLView
+      cssClass : 'warning-message hidden'
+
+    delegate.on 'ResetInuseStates', @inuseView.bound 'hide'
+
+
+  setVerified: (state, reason) ->
+
+    if state
+      @unsetClass 'failed'
+      @warningView.hide()
+      @getDelegate().emit 'ItemSelected', this
+    else
+      @setClass 'failed'
+      Tracker.track Tracker.STACKS_AWS_KEYS_FAILED
+      @warningView.updatePartial if reason
+        "Failed to verify: #{reason}"
+      else
+        "We couldn't verify this credential, please check the ones you
+         used or add a new credential to be able to continue to the
+         next step."
+
+      @warningView.show()
+
+
+  verifyCredential: ->
+
+    { identifier } = @getData()
+
+    @warningView.hide()
+
+    @getDelegate()
+      .verify this
+      .timeout 10000
+      .then (response) =>
+        if status = response?[identifier]
+          if message = status.message
+            message = message.split('\n')[..-2].join ''
+          @setVerified status.verified, message
+        else
+          @setVerified no
+      .catch (err) =>
+        @setVerified no, err.message
+
+      .finally @verifyButton.bound 'hideLoader'
+
+
+  pistachio: ->
+
+    """
+

+

+        {span.title{ #(title)}} {{> @inuseView}}
+

+
{{> @showCredentialButton}}{{> @deleteButton}}{{> @verifyButton}}

+

+    {{> @warningView}}
+    """


allow search component state based on init arg


chore: clean up

chore: clean up

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


+~ Validators draft

+~ Validators draft

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


Try to make paren usage more consistent -- only allowed to be omitted for function calls starting near the beginning of the line (looks a bit like rails).

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


remove cozy- in application name

remove cozy- in application name

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


Gruntfile upgrade

Gruntfile upgrade

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/caresx/PO-Client-Tools.git/'


chore: fix grunt task mapping

chore: fix grunt task mapping

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -3,6 +3,8 @@

   # Load all grunt tasks
   require("jit-grunt") grunt,
+    "bump-commit": "grunt-bump"
+    "bump-only": "grunt-bump"
     gitclean: "grunt-git"
     gitclone: "grunt-git"
     gitpull: "grunt-git"
@@ -264,11 +266,11 @@
         stdout: true

       # Direct sync compiled static files to remote server
-      syncServer:
+      sync_server:
         command: "rsync -avz --delete --progress <%= config.cfg.ignore_files %> <%= config.dist %>/ <%= config.cfg.remote_host %>:<%= config.cfg.remote_dir %> > rsync.log"

       # Copy compiled static files to local directory for further post-process
-      syncLocal:
+      sync_local:
         command: "rsync -avz --delete --progress <%= config.cfg.ignore_files %> <%= jekyll.dist.options.dest %>/ /Users/sparanoid/Workspace/Sites/sparanoid.com<%= config.base %> > rsync.log"

       # Sync images to a separate CloudFront
@@ -640,7 +642,7 @@

   grunt.registerTask "sync", "Build site + rsync static files to remote server", [
     "build"
-    "shell:syncLocal"
+    "shell:sync_local"
   ]

   grunt.registerTask "s3", "Sync image assets with `s3cmd`", [


Add AppLinkView for Application Links

Add AppLinkView for Application Links


:minibus: Rename linter to linter-old

:minibus: Rename linter to linter-old

error: pathspec 'lib/linter-old.coffee' did not match any file(s) known to git

--- lib/linter-old.coffee
+++ lib/linter-old.coffee
@@ -0,0 +1,128 @@
+Path = require 'path'
+{CompositeDisposable} = require 'atom'
+
+class LinterTrace
+  constructor: (@Message, @File, @Position) ->
+
+class LinterMessage then constructor: (@Message, @File, @Position, @Trace) ->
+
+class LinterError extends LinterMessage
+
+class LinterWarning extends LinterMessage
+
+class Linter
+
+  Subscriptions: null
+  SubLintOnFly: null
+  InProgress: false
+  InProgressFly: false
+  LintOnFly: true
+  View: null
+  ViewPanel: null
+  StatusBar: null
+  Messages:[]
+  MessagesRegular:[]
+  MessagesFly:[]
+  Linters: []
+
+  constructor: ->
+    @View = new (require './view')(this)
+    @ViewPanel = atom.workspace.addBottomPanel item: @View.root, visible: false
+
+    @Subscriptions = new CompositeDisposable
+    @SubLintOnFly = new CompositeDisposable
+
+    @Subscriptions.add atom.workspace.onDidChangeActivePaneItem =>
+      return unless atom.workspace.getActiveTextEditor()
+      @lint()
+
+    @Subscriptions.add atom.workspace.observeTextEditors (editor) =>
+      return unless editor.getPath()
+      editor.onDidSave(@lint.bind(@, false))
+      @Subscriptions.add editor.onDidChangeCursorPosition ({newBufferPosition}) =>
+        @View.updateBubble(newBufferPosition)
+      return unless @LintOnFly
+      @SubLintOnFly.add editor.onDidStopChanging @lint.bind(@, true)
+  #
+  # We have two types of linters, Regular and OnFly, if we store both of their
+  # messages in one array, we'll lose the messages of regular ones, once we do
+  # lintOnChange, so therefore I've modified the lint function to execute only the
+  # ones that are required and then concat with the other.
+  # When the save event is triggered, the onChange is false so it triggers the onFly
+  # ones too.
+  #
+  lint: (onChange) ->
+    onChange = Boolean onChange
+    return if @progress onChange
+    # We need to consume both onFly and Regular linters on save
+    @lint true unless onChange
+
+    ActiveEditor = atom.workspace.getActiveTextEditor()
+    Buffer = ActiveEditor.getBuffer()
+    return unless ActiveEditor
+
+    Scopes = ActiveEditor.scopeDescriptorForBufferPosition(ActiveEditor.getCursorBufferPosition()).scopes
+    Promises = []
+
+    @Linters.forEach (Linter) ->
+      return if onChange and not Linter.lintOnFly
+      return if (not onChange) and Linter.lintOnFly
+      Matching = Scopes.filter (Entry) -> Linter.scopes.indexOf(Entry) isnt -1
+      return unless Matching.length
+      Promises.push Linter.lint(
+        ActiveEditor, Buffer,
+        {
+          Error: LinterError,
+          Warning: LinterWarning,
+          Trace: LinterTrace
+        },
+        onChange
+      )
+
+    Promise.all(Promises).then (Results) =>
+      @progress onChange, false
+      Messages = []
+      for Result in Results
+        continue if (not Result) or (typeof Result) isnt 'object'
+        if Result instanceof Array
+          Messages = Messages.concat(Result)
+      if onChange
+        @MessagesFly = Messages
+      else
+        @MessagesRegular = Messages
+      @Messages = @MessagesFly.concat(@MessagesRegular)
+      @render()
+    , =>
+      console.error arguments
+      @progress onChange, false
+
+  render: ->
+    # Update `LeftTile` of `StatusBar`
+    @View.updateLeftTile @Messages.length
+
+    if not @Messages.length
+      @ViewPanel.hide() if @ViewPanel.isVisible()
+      @View.remove()
+    else
+      @View.update()
+      @ViewPanel.show() unless @ViewPanel.isVisible()
+
+  deactivate: ->
+    @ViewPanel.destroy()
+    @View.remove()
+    @SubLintOnFly.dispose()
+    @Subscriptions.dispose()
+
+  progress: (onChange, newValue) ->
+    if typeof newValue is 'undefined'
+      if onChange
+        return @InProgressFly
+      else
+        return @InProgress
+    else
+      if onChange
+        @InProgressFly = newValue
+      else
+        @InProgress = newValue
+
+module.exports = Linter


added untracked files

added untracked files

error: pathspec 'lib/y-richtext.coffee' did not match any file(s) known to git

--- lib/y-richtext.coffee
+++ lib/y-richtext.coffee
@@ -0,0 +1,137 @@
+Selections = require '../../y-selections'
+
+# A class holding the information about rich text
+class RichText
+  # @param content [String] an initial string
+  # @param editor [Editor] an editor instance
+  # @param author [String] the name of the local author
+  constructor: (content, editor, author) ->
+    # TODO: generate a UID (you can get a unique id by calling `@_model.getUid()` - is this what you mean?)
+    @_selections = new Selections()
+    @_characters = new Characters content, @_selections
+    @author = author
+
+    @editor = editor
+    @editor.observeLocalText @passDelta
+    @editor.observeLocalCursor @updateCursorPosition
+
+  _getModel: (Y, Operation) ->
+    if not @_model?
+      # call the _getModel for each
+      sels = @_selections._getModel(Y, Operation)
+      chars = @_characters._getModel(Y, Operation)
+      cursors = new Operation.ListManager(@).execute()
+
+      model = new Operation.MapManager(@).execute()
+      model.val "selections", @_selections
+      model.val "characters", @_characters
+      model.val "cursors", cursors
+
+      @setCursor @editor.getCursorPosition()
+      @_setModel model
+
+      # listen to events on the model using the function propagateToEditor
+      @_model.observe @propagateToEditor
+    return @_model
+
+  _setModel: (model) ->
+    @_model = model
+
+    noneFound = true
+    for cursor in (@get "cursors").val()
+      if cursor.author == @author
+        @updateCursorPosition(cursor.position)
+        noneFound = false
+        break
+
+    if noneFound
+      @setCursor @editor.getCursorPosition()
+    else
+
+    delete @_characters
+    delete @_selections
+
+  set: (key, val) ->
+    @_model.val key, val
+  get: (key) ->
+    @_model.val key
+  delete: (key) ->
+    @_model.delete key
+
+  # insert our own cursor in the cursors list
+  # @param position [Integer] the position where to insert it
+  setCursor = (position) ->
+    word = (@get "characters").val(position)
+    selfCursor =
+      author: @author
+      position: word
+      color: "grey" # FIXME
+    (@get "cursors").insert 0, selfCursor
+    @selfCursor = (@get "cursors").ref 0
+
+  # pass a delta to the character instance
+  # @param delta [Object] a delta (see ot-types for more info)
+  passDelta = (delta) ->
+    (@get "characters").delta delta
+
+  # @override updateCursorPosition(index)
+  #   update the position of our cursor to the new one using an index
+  #   @param index [Integer] the new index
+  # @override updateCursorPosition(character)
+  #   update the position of our cursor to the new one using a character
+  #   @param character [Character] the new character
+  updateCursorPosition = (obj) ->
+    if typeof obj == "number"
+      char = (@get "characters").val(obj)
+    else
+      char = obj
+    selfCursor = @selfCursor.val()
+    selfCursor.position = char
+
+  # describe how to propagate yjs events to the editor
+  propagateToEditor = (events) ->
+    for event in events
+      switch event.name
+        when "cursors"
+          id = event.object.author
+          index = (@get "characters").indexOf event.object.char
+          text = event.object.author
+          color = "grey" # FIXME
+
+          if event.type == "update" or event.type == "add"
+            @editor.setCursor id, index, text, color
+
+        when "characters"
+          charPos = (@get "characters").indexOf event.object
+          delta = {ops: [{retain: charPos}]}
+          del = {delete: 1}
+          ins = {insert: event.object.char, attributes: event.object.attributes}
+          if event.type == "update"
+            #TODO: inherit attributes
+            delta.ops.push del
+            delta.ops.push ins
+
+          else if event.type == "add"
+            delta.ops.push ins
+
+          else if event.type == "delete"
+            delta.ops.push del
+
+          @editor.setContents delta
+
+        when "selections"
+          left = (event.object.left or event.oldValue.left)
+          right = (event.object.right or event.oldValue.right)
+          selectionStart = (@get "characters").indexOf left
+          selectionEnd = (@get "characters").indexOf right
+          attributes = event.object.attributes
+          if event.type == "update" or event.type == "insert"
+            delta = {ops: [{retain: selectionStart},
+              {retain: selectionEnd-selectionStart, attributes: attributes}
+            ]}
+            @editor.setContents delta
+          else if event.type == "delete"
+            #FIXME: depending on how it is implemented, selections can be
+            # overridden by negating their values (set them to null) or they
+            # can just be deleted
+            console.log "Ohow… what am I supposed to do there?"


correctly compile string conditions

correctly compile string conditions

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


Fix goto_position in sequence coffeescript.

Replace single-quotes with double-quotes so that #{@ajaxUrl} is
interpolated.


add user_flags to login function

add user_flags to login function

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


test/credentials: add before func to prepare credentials

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

--- client/test/lib/dashboard/credentials.coffee
+++ client/test/lib/dashboard/credentials.coffee
@@ -0,0 +1,25 @@
+teamsHelpers = require '../helpers/teamshelpers.js'
+helpers = require '../helpers/helpers.js'
+utils = require '../utils/utils.js'
+credentialsUrl = "#{helpers.getUrl(yes)}/Home/Stacks/credentials"
+
+
+module.exports =
+
+  before: (browser, done) ->
+
+    ###
+    * we are creating users list here to send invitation and join to team
+    * so we will be able to run our test for different kind of member role
+    ###
+    targetUser1 = utils.getUser no, 1
+    targetUser1.role = 'member'
+
+    users =
+      targetUser1
+
+    teamsHelpers.inviteAndJoinWithUsers browser, [ users ], (result) ->
+      teamsHelpers.createCredential browser, 'aws', 'aws1', yes, ->
+        teamsHelpers.createCredential browser, 'aws', 'aws2', yes, ->
+          done()
+


Router: Added tests.

Router: Added tests.

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

--- src/tests/core/test_router.coffee
+++ src/tests/core/test_router.coffee
@@ -0,0 +1,64 @@
+goog = goog or goog = require: ->
+
+goog.require 'spark.core.Router'
+
+
+describe 'spark.core.Router', ->
+
+  flag   = null
+  router = null
+
+  beforeEach ->
+    flag   = null
+    router = new spark.core.Router
+    router.addRoute '/activity',    -> flag = 'activity'
+    router.addRoute '/profile',     -> flag = 'profile'
+    router.addRoute '/profile/:id', -> flag = 'profile with id'
+
+
+  it 'should extend spark.core.Object', ->
+    expect(router instanceof spark.core.Object).toBeTruthy()
+
+
+  it 'should have a class level HistoryManager instance', ->
+    expect(router.getHistoryManager() instanceof spark.core.HistoryManager).toBeTruthy()
+
+
+  it 'should work when HistoryManager token explicitly set', ->
+    router.getHistoryManager().setToken '/profile'
+
+    expect(flag).toBe 'profile'
+
+
+  it 'should have routes', ->
+    router.init()
+    routes = router.getRoutes()
+
+    expect(routes['/activity']).toBeDefined()
+    expect(routes['/profile/:id']).toBeDefined()
+
+
+  it 'should have regexes for routes', ->
+    routes  = router.getRoutes()
+    regexes = router.routeRegexes
+
+    if regexes
+      expect(regexes['/activity']).not.toBeDefined()
+      expect(regexes['/profile/:id']).toBeDefined()
+      expect(regexes['/profile/:id'].toString().indexOf('(\\w+)')).toBeGreaterThan -1
+
+
+  it 'should route', ->
+    expect(flag).toBeNull()
+
+    router.route '/activity'
+
+    expect(flag).toBe 'activity'
+
+    router.route '/profile/fatihacet'
+
+    expect(flag).toBe 'profile with id'
+
+    router.route '/this/route/is/not/added/to/router'
+
+    expect(flag).toBe 'profile with id'


Convert tests to use model.$valid instead of model#validate()

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


Remove incorrect error message

Remove incorrect error message

The markdown API is no longer used.

--- src/packages/markdown-preview/lib/markdown-preview-view.coffee
+++ src/packages/markdown-preview/lib/markdown-preview-view.coffee
@@ -57,15 +57,7 @@

     @html $$$ ->
       @h2 'Previewing Markdown Failed'
-      if failureMessage?
-        @h3 failureMessage
-      else
-        @h3 'Possible Reasons'
-        @ul =>
-          @li =>
-            @span 'You aren\'t online or are unable to reach '
-            @a 'github.com', href: 'https://github.com'
-            @span '.'
+      @h3 failureMessage if failureMessage?

   setLoading: ->
     @html($$$ -> @div class: 'markdown-spinner', 'Loading Markdown...')


Update

Update

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


Create contribution controllers

Create contribution controllers

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

--- app/assets/javascripts/controllers/contributions.coffee
+++ app/assets/javascripts/controllers/contributions.coffee
@@ -0,0 +1,12 @@
+Dashboard.ContributionsTabController = Ember.ArrayController.extend Dashboard.SearchableBaseController, Dashboard.PaginableControllerMixin,
+  baseRouteName: 'contributions'
+
+  defaultSearchFields:
+    query: null
+    between_values:
+      initial: null
+      final: null
+
+Dashboard.ContributionsSearchController = Dashboard.ContributionsTabController.extend Dashboard.SearchableController,
+  baseRouteName: 'contributions'
+


Changed scoring/rebounding per minute charts so that players with no stats in those categories won't be displayed.

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


IE-compatible jQuery load handler

IE-compatible jQuery load handler

--- app/assets/javascripts/uploadcare/core/jquery.js.coffee
+++ app/assets/javascripts/uploadcare/core/jquery.js.coffee
@@ -7,9 +7,17 @@
   return uploadcare.jQuery -> uploadcare.ready()

 script = document.createElement('script')
-script.addEventListener 'load', ->
+script.setAttribute('src', jquerySrc)
+
+load = ->
   uploadcare.jQuery = jQuery.noConflict(true)
   uploadcare.jQuery -> uploadcare.ready()

-script.src = jquerySrc
-document.head.appendChild(script)
+if document.addEventListener?
+  script.addEventListener('load', load, false)
+else
+  script.attachEvent 'onreadystatechange', ->
+    load() if script.readyState == 'loaded' || script.readyState == 'complete'
+
+first = document.getElementsByTagName('script')[0]
+first.parentNode.insertBefore(script, first)


restore live function

restore live function

--- app/assets/javascripts/uploadcare/widget/live.js.coffee
+++ app/assets/javascripts/uploadcare/widget/live.js.coffee
@@ -56,10 +56,10 @@
         widgetElement.remove()

   ns.start = (s) ->
+    do live = ->
+      initialize($('@uploadcare-uploader'))
     if settings.common(s).live
       setInterval(live, 100)
-    do live = ->
-      initialize($('@uploadcare-uploader'))

   $ ->
     if not window["UPLOADCARE_MANUAL_START"]


add hidden_field field

add hidden_field field

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

--- src/scripts/fields/hidden_field.coffee
+++ src/scripts/fields/hidden_field.coffee
@@ -0,0 +1,24 @@
+Formbuilder.registerField 'hidden_field',
+
+  order: 10
+
+  type: 'non_input'
+
+  view: """
+    Hidden Field:
+
<%= _.escape(rf.get(Formbuilder.options.mappings.DESCRIPTION)) %>

+  """
+
+  edit: """
+
Data

+    <textarea data-rv-input='model.<%= Formbuilder.options.mappings.DESCRIPTION %>'
+      placeholder='Add a longer description to this field'></textarea>
+  """
+
+  addButton: """
+     Hidden Field
+  """
+
+  defaultAttributes: (attrs) ->
+    attrs.label = 'Hidden Field'
+    attrs


Properly replace variables in path.

Properly replace variables in path.

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/commercetools/graphite-feeder.git/'


Masonry each product_ul on the page.

Masonry each product_ul on the page.

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


Add transformer symbol

Add transformer symbol

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

--- src/symbol/default/transformer.coffee
+++ src/symbol/default/transformer.coffee
@@ -0,0 +1,16 @@
+enclosure = require './common/enclosure'
+Icon = require './common/icon'
+
+module.exports = (symbol, element) ->
+  element.refDes = 'T'
+
+  schematic = element.schematic
+  schematic.showPinNames ?= true
+  schematic.showPinNumbers ?= true
+
+  pins = element.pins
+  for k, v of pins
+    if pins[k].nc isnt true
+      pins[k].passive = true
+
+  enclosure symbol, element


Check in the draft of the router implementation

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

--- library/gearing/router.coffee
+++ library/gearing/router.coffee
@@ -0,0 +1,86 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "underscore"
+logger = require "winston"
+colors = require "colors"
+eyes = require "eyes"
+
+# A simple yet solid HTTP request router. This is designed to map
+# HTTP requests to the correpsonding handlers by examining URL and
+# the supplied host, among other things. The exact matching logic
+# is up to the handlers that implement the corresponding methods.
+# This router just provides the infrastructure and boilerplating.
+module.exports.Router = class Router extends Object
+
+    # Install the routable that should handle the requests that are
+    # not handled via the registered routables. The routable has to
+    # implement the same interface as the usual routable. This method
+    # ensures this by performing the same tests as register method.
+    # Remember that it should implement the widescope matching logic.
+    installFallback: (routable) ->
+        inspected = eyes.inspect(routable)
+        [matches, process] = [routable.matches, routable.process]
+        goneMatches = "The #{routable} has no valid matches method"
+        goneProcess = "The #{routable} has no valid process method"
+        passMatches = _.isFunction(matches) and matches?.length is 3
+        passProcess = _.isFunction(process) and process?.length is 3
+        throw new Error(goneMatches) unless passMatches
+        throw new Error(goneProcess) unless passProcess
+        logger.info("Installing #{inspected} as fallback".magenta)
+        @fallback = routable
+
+    # Try registering a new routable object. The method checks for
+    # the object to be of the correct type, basically making sure
+    # that it is capable of doing the routing functionality code.
+    # If something is wrong, this method will throw an exception.
+    # The method is idempotent, ergo no duplication of routables.
+    registerRoutable: (routable) ->
+        inspected = eyes.inspect(routable)
+        [matches, process] = [routable.matches, routable.process]
+        goneMatches = "The #{routable} has no valid matches method"
+        goneProcess = "The #{routable} has no valid process method"
+        passMatches = _.isFunction(matches) and matches?.length is 3
+        passProcess = _.isFunction(process) and process?.length is 3
+        throw new Error(goneMatches) unless passMatches
+        throw new Error(goneProcess) unless passProcess
+        logger.info("Adding #{inspected} to the registry".magenta)
+        (@registry ?= []) push routable unless routable in @registry
+
+    # The method implements a middleware (for Connect) that looks
+    # up the relevant routable and dispatches the request to the
+    # routable. If no corresponding routable is found, the method
+    # transfers the control to the pre-installed, default routable.
+    # A set of tests are performed to ensure the logical integrity.
+    lookupMiddleware: (request, response, next) ->
+        incoming = eyes.inspect(request)
+        parameters = [request, response, next]
+        predicate = (routable) -> routable.matches(parameters...)
+        matched = _.find(@registry or [],  predicate) or null
+        return matched.process(parameters...) and next() if matched?
+        logger.warn("No routable for #{incoming} request".yellow)
+        matches = @fallback?.matches(request, response, next)
+        return @fallback.process(parameters...) and next() if matches
+        logger.warn("Fallback failed for #{incoming}".yellow); next()


Delay the execution of the data events script until the last possible moment so all of the variables are filled in. Allow the data events init script itself to produce side-effects.

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/fulcrumapp/fulcrum-expressions.git/'


User.Autoplay parameter active

User.Autoplay parameter active

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


Add the test cases for OrderItemBuilder.coffee

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

--- backend/spec/javascripts/comable/admin/order_item_builder_spec.coffee
+++ backend/spec/javascripts/comable/admin/order_item_builder_spec.coffee
@@ -0,0 +1,56 @@
+#= require jquery
+#= require jasmine-jquery
+#= require comable/admin/order_item_builder
+
+describe 'OrderItemBuilder', ->
+  described_class = null
+  subject = null
+
+  beforeEach ->
+    described_class = OrderItemBuilder
+    subject = described_class.prototype
+
+  describe '#fillOrderItem', ->
+    variant = {
+      id: 1
+      text: 'T-Shirt (Red)'
+      sku: 'tshirt-red'
+      price: 1000
+      image_url: 'image.png'
+    }
+
+    it 'fills variant-id filed', ->
+      setFixtures('
<input type="text" data-name="variant-id" />
')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('input')).toHaveValue(variant.id.toString())
+
+    it 'fills name filed', ->
+      setFixtures('
<input type="text" data-name="name" />
')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('input')).toHaveValue(variant.text)
+
+    it 'fills sku filed', ->
+      setFixtures('
<input type="text" data-name="sku" />
')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('input')).toHaveValue(variant.sku)
+
+    it 'fills price filed', ->
+      setFixtures('
<input type="text" data-name="price" />
')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('input')).toHaveValue(variant.price.toString())
+
+    it 'fills subtotal-price filed', ->
+      setFixtures('
<input type="text" data-name="subtotal-price" />
')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('input')).toHaveValue(variant.price.toString())
+
+    it 'fills image-url filed', ->
+      setFixtures('

')
+      $orderItem = $('.js-new-order-item').first()
+      subject.fillOrderItem($orderItem, variant)
+      expect($orderItem.find('img')).toHaveAttr('src', variant.image_url)


Added absent "blur" method (focus was already exist)

--- client/Framework/components/buttons/KDButtonView.coffee
+++ client/Framework/components/buttons/KDButtonView.coffee
@@ -126,6 +126,8 @@
   enable:-> @$().attr "disabled", no

   focus:-> @$().trigger "focus"
+
+  blur:-> @$().trigger "blur"

   click:(event)->


activity: export generic message link component

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


Added test structure for env.data.apps (to be completed)

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

--- tests/spec/data/data-apps-spec.coffee
+++ tests/spec/data/data-apps-spec.coffee
@@ -0,0 +1,76 @@
+
+testConfig = require '../../test-config'
+coreModule = require testConfig.project_root + '/src/core'
+dataModule = require testConfig.project_root + '/src/data'
+
+describe 'Data - apps module', () ->
+
+	env = {
+		mode: 'test'
+	}
+	beforeEach () ->
+		env = {
+			mode: 'test'
+		}
+		coreModule(env).initEnv()
+		coreModule(env).initConfig()
+		coreModule(env).initUtilities()
+		dataModule(env)
+
+	it 'Application creation - env.data.apps.create', (done) ->
+		expect(env.data.apps.create).toBeDefined()
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application retrieval by owner - env.data.apps.getByOwner', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+
+	it 'Application retrieval by id - env.data.apps.get', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application update by id - env.data.apps.get', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application key reset - env.data.apps.get', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application removal - env.data.apps.get', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application domain update - env.data.apps.updateDomains', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application domain add - env.data.apps.addDomain', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application domain retrieval - env.data.apps.getDomains', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application domain removal - env.data.apps.remDomain', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application backend set - env.data.apps.setBackend', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application backend check - env.data.apps.checkDomain', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application owner retrieval - env.data.apps.getOwner', (done) ->
+		throw new Error('Test not implemented')
+		done()
+
+	it 'Application secret check - env.data.apps.checkSecret', (done) ->
+		throw new Error('Test not implemented')
+		done()


Added context to the i18n editor for components.

--- app/views/i18n/I18NEditComponentView.coffee
+++ app/views/i18n/I18NEditComponentView.coffee
@@ -20,6 +20,9 @@
             @wrapRow "#{propDoc.name} description (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
         else if _.isString propDoc.description
           @wrapRow "#{propDoc.name} description", ['description'], propDoc.description, i18n[lang]?.description, path, 'markdown'
+        if context = propDoc.context
+          for key, value of context
+            @wrapRow "#{propDoc.name} context value", ["context", key], value, i18n[lang]?.context[key], path

       #- Component return value descriptions
       if i18n = propDoc.returns?.i18n
@@ -41,4 +44,4 @@
                 @wrapRow "#{propDoc.name} arg description #{argDoc.name} (#{progLang})", [progLang, 'description'], description, i18n[lang]?[progLang]?.description, path, 'markdown'
             else if _.isString argDoc.description
               @wrapRow "#{propDoc.name} arg description #{argDoc.name}", ['description'], argDoc.description, i18n[lang]?.description, path, 'markdown'
- +


Auto detect JSX grammar (.jsx or pragma)

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

--- index.coffee
+++ index.coffee
@@ -0,0 +1,7 @@
+path   = require("path")
+pragma = /^\s*\/\*\*[\s\*]*@jsx\s*React\.DOM[\s\*]*\*\//
+
+module.exports = activate: () ->
+  atom.workspace.eachEditor (editor) ->
+    if path.extname(editor.getPath()) is ".jsx" or editor.getText().match(pragma)
+      editor.setGrammar atom.syntax.grammarsByScopeName["source.jsx"]


[front] Allow specifying the #! line

[front] Allow specifying the #! line

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


app/util: require kd lazily in appendHeadElement

--- client/app/lib/util/appendHeadElement.coffee
+++ client/app/lib/util/appendHeadElement.coffee
@@ -1,6 +1,6 @@
-kd = require 'kd'
+module.exports = ({ type, url }, callback) ->

-module.exports = ({ type, url }, callback) ->
+  kd = require 'kd'

   switch type
     when 'style'


test/helpers: add invite user test

test/helpers: add invite user test

--- client/test/lib/helpers/myteamhelpers.coffee
+++ client/test/lib/helpers/myteamhelpers.coffee
@@ -3,6 +3,34 @@

 module.exports =
+
+  inviteUser: (browser) ->
+
+    invitationsModalSelector = '.HomeAppView--section.send-invites'
+    sendInvitesButton = "#{invitationsModalSelector} .custom-link-view.HomeAppView--button.primary.fr"
+
+    browser
+      .waitForElementVisible invitationsModalSelector, 20000
+
+    userEmail = @fillInviteInputByIndex browser, 1
+    successMessage = "Invitation is sent to #{userEmail}"
+
+    browser
+      .waitForElementVisible sendInvitesButton, 5000
+      .click sendInvitesButton
+
+    @acceptConfirmModal browser, successMessage
+
+    userEmail = @fillInviteInputByIndex browser, 3
+    successMessage = "Invitation is sent to #{userEmail}"
+
+    browser
+      .pause 10000
+      .waitForElementVisible sendInvitesButton, 5000
+      .click sendInvitesButton
+
+      .waitForElementVisible '.kdnotification', 10000
+      .assert.containsText '.kdnotification', successMessage

   rejectConfirmModal: (browser) ->


Add keyboard example

Add keyboard example

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

--- examples/keyboard.coffee
+++ examples/keyboard.coffee
@@ -0,0 +1,109 @@
+###
+# Instanssi 2012 Keyboard light controller.
+# Execute with Node.js and CoffeeScript
+###
+
+
+
+tty = require('tty')
+dgram = require('dgram')
+
+process.stdin.resume()
+tty.setRawMode(true)
+
+
+class RGB
+
+  constructor: (@nick, @ip, @port) ->
+    @client = dgram.createSocket("udp4")
+    @reset()
+
+  reset: ->
+    @packet = [ 1 ]
+    @packet.push 0
+    for c in @nick
+      @packet.push c.charCodeAt 0
+    @packet.push 0
+
+  set: (i, r, g, b) ->
+    @packet.push 1
+    @packet.push i
+    @packet.push 0
+    @packet.push r
+    @packet.push g
+    @packet.push b
+
+  send: ->
+    buf = new Buffer @packet
+    console.log buf
+    @client.send buf, 0, buf.length, @port, @ip
+    @reset()
+
+
+mapping =
+  q: 0
+  w: 1
+  e: 2
+  r: 3
+  t: 4
+  y: 5
+  u: 6
+  i: 7
+  o: 8
+  p: 9
+  å: 10
+  a: 11
+  s: 12
+  d: 13
+  f: 14
+  g: 15
+  h: 16
+  j: 17
+  k: 18
+  l: 19
+  ö: 20
+  ä: 21
+  z: 22
+  x: 23
+  c: 24
+  v: 25
+  b: 26
+  n: 27
+  m: 28
+
+rgb = new RGB "esa", "192.168.10.1", 9909
+
+rgb.set 1, 255, 0, 0
+console.log rgb.packet
+
+rgb.send()
+
+process.stdin.on 'keypress', (char, key) ->
+  return if not key
+
+  code = char.charCodeAt(0)
+  if  code is 27 # esc
+    process.exit 0
+
+  console.log key
+
+  if id = mapping[key.name]
+
+    if key.shift
+      rgb.set id, 255, 0, 0
+    else if key.ctrl
+      rgb.set id, 0, 255, 0
+    else
+      rgb.set id, 0, 0, 255
+
+    rgb.send()
+    setTimeout ->
+      rgb.set id, 0, 0, 0
+      rgb.send()
+    , 100
+
+  else
+    console.error "Unkown key", char, code
+
+
+


new simple mocking utility

new simple mocking utility

 On branch master

	new file:   nodejs_server/lib/mock.coffee

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


remove unused method VirtualizationController#getOsKite


stack-editor: call reinitFromStack action if stack template is default

--- client/stack-editor/lib/editor/index.coffee
+++ client/stack-editor/lib/editor/index.coffee
@@ -34,7 +34,7 @@
 EnvironmentFlux = require 'app/flux/environment'
 ContentModal = require 'app/components/contentModal'
 createShareModal = require './createShareModal'
-
+isDefaultTeamStack = require 'app/util/isdefaultteamstack'
 { actions : HomeActions } = require 'home/flux'

 module.exports = class StackEditorView extends kd.View
@@ -353,6 +353,7 @@
   createMainButtons: ->

     { appManager } = kd.singletons
+    { stackTemplate } = @getData()

     @header.addSubView @buttons = new kd.CustomHTMLView { cssClass: 'buttons' }

@@ -378,6 +379,8 @@
       loader         : yes
       callback       : =>
         appManager.tell 'Stacks', 'exitFullscreen'  unless @getOption 'skipFullscreen'
+        if isDefaultTeamStack stackTemplate._id
+          return EnvironmentFlux.actions.reinitStackFromWidget()
         @handleGenerateStack()


Show a random :octocat: from the octodex

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

--- src/scripts/octocat.coffee
+++ src/scripts/octocat.coffee
@@ -0,0 +1,21 @@
+# Show random octocat
+#
+# octocat me - a randomly selected octocat
+# octocat bomb me <number> - octocat-splosion!
+
+xml2js = require('xml2js')
+
+module.exports = (robot) ->
+  robot.respond /octocat\s*(?:me)?$/i, (msg) ->
+    show_octocats msg, 1
+  robot.respond /octocat\s+(?:bomb)\s*(?:me)?\s*(\d+)?/i, (msg) ->
+    count = msg.match[1] || 5
+    show_octocats msg, count
+show_octocats = (msg, count) ->
+  msg.http('http://feeds.feedburner.com/Octocats')
+    .query(format: 'xml')
+    .get() (err, res, body) ->
+      parser = new xml2js.Parser()
+      parser.parseString body, (err, result) ->
+        octocats = (r["content"]["div"]["a"]["img"]["@"]["src"] for r in result["entry"])
+        msg.send msg.random octocats for i in [1..count]


q shortcut

q shortcut

--- index.coffee
+++ index.coffee
@@ -32,7 +32,7 @@
 controller.on 'ambient', (bot, message) ->
   checkMessage(bot, message)

-controller.hears ['query( )?(\\w+)? (.+)'], ['direct_mention'], (bot, message) ->
+controller.hears ['(?:query|q)( )?(\\w+)? (.+)'], ['direct_mention'], (bot, message) ->
   [txt, ignore, lookerName, query] = message.match

   looker = if lookerName


Load only last 50 messagens on load

Load only last 50 messagens on load

--- server/publications.coffee
+++ server/publications.coffee
@@ -38,6 +38,8 @@
 		# return ChatSubscription.find { uid: this.userId, ts: { $gte: moment().subtract(2, 'days').startOf('day').toDate() } }

 Meteor.publish 'dashboardRoom', (rid, start) ->
+	self = this
+
 	unless this.userId
 		return this.ready()

@@ -46,9 +48,19 @@
 	if typeof rid isnt 'string'
 		return this.ready()

-	return ChatMessage.find
-		rid: rid
-		ts: $gte: start
+	cursor = ChatMessage.find {rid: rid}, {sort: {ts: -1}, limit: 50}
+
+	observer = cursor.observeChanges
+		added: (id, record) ->
+			self.added 'data.ChatMessage', id, record
+		changed: (id, record) ->
+			self.changed 'data.ChatMessage', id, record
+	# 	removed: (id) ->
+	# 		self.removed 'ChatMessage', id
+
+	@ready()
+	@onStop ->
+		observer.stop()

 Meteor.publish 'allUsers', ->
 	unless this.userId