added test for scales

added test for scales

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

--- test/gg/scales-test.coffee
+++ test/gg/scales-test.coffee
@@ -0,0 +1,99 @@
+require "../env"
+vows = require "vows"
+assert = require "assert"
+suite = vows.describe "scales.coffee"
+
+makeTable = (nrows=100) ->
+  rows = _.map _.range(0, nrows), (d) ->
+    {
+      a: d
+      b: d/2
+      c: d*2
+      d: d%5
+      e: d%10
+    }
+  new gg.RowTable rows
+
+
+spec =
+  a:
+    type: "linear"
+    range: [0, 100]
+  b:
+    type: "linear"
+    range: [2,5]
+
+console.log gg
+
+suite.addBatch
+  "default scales":
+    topic: ->
+      scale = gg.Scale.defaultFor "x"
+      scale.mergeDomain [0, 100]
+      scale
+    "has correct domain": (scale) ->
+      assert.arrayEqual scale.domain(), [0, 100]
+
+    "when cloned":
+      topic: (scale) -> scale.clone()
+      "has aesthetic": (scale) -> assert.equal scale.aes, "x"
+      "has correct domain": (scale) ->
+        assert.arrayEqual scale.domain(), [0, 100]
+
+
+  "scales factory":
+    topic: new gg.ScaleFactory spec
+
+    "creates scales":
+      topic: (factory) -> factory.scales(['a', 'b'])
+
+      "when trained on table":
+        topic: (scales) ->
+          scales.train makeTable 100
+          scales
+
+        "has correct domain and range": (scales) ->
+          assert.arrayEqual scales.scale('a').domain(), [0,99]
+          assert.arrayEqual scales.scale('a').range(), [0, 100]
+          assert.arrayEqual scales.scale('b').domain(), [0, 49.5]
+          assert.arrayEqual scales.scale('b').range(), [2,5]
+
+        "when cloned":
+          topic: (scales) -> scales.clone()
+
+          "has correct domain and range": (scales) ->
+            assert.arrayEqual scales.scale('a').domain(), [0,99]
+            assert.arrayEqual scales.scale('a').range(), [0, 100]
+            assert.arrayEqual scales.scale('b').domain(), [0, 49.5]
+            assert.arrayEqual scales.scale('b').range(), [2,5]
+
+        "when range is reversed":
+          topic: (scales) ->
+            scales.scale('a').range([100, 0])
+            scales.scale('b').range([50, 0])
+            scales
+
+
+          "has correct domain and range": (scales) ->
+            scales = scales.clone()
+            assert.arrayEqual scales.scale('a').domain(), [0,99]
+            assert.arrayEqual scales.scale('a').range(), [100, 0]
+            assert.arrayEqual scales.scale('b').domain(), [0, 49.5]
+            assert.arrayEqual scales.scale('b').range(), [50, 0]
+
+          "supports setting 'a''s scale": (scales) ->
+            copy = scales.scale('a').clone()
+            scales.scale(copy)
+            assert.arrayEqual scales.scale('a').domain(), [0,99]
+            assert.arrayEqual scales.scale('a').range(), [100, 0]
+            assert.arrayEqual scales.scale('b').domain(), [0, 49.5]
+            assert.arrayEqual scales.scale('b').range(), [50, 0]
+
+
+
+
+
+
+
+suite.export module
+


Collection of Features

Collection of Features

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

--- collections/features.coffee
+++ collections/features.coffee
@@ -0,0 +1,5 @@
+Backbone = require 'backbone'
+Feature = require '../models/feature.coffee'
+
+module.exports = class Features extends Backbone.Collection
+  model: Feature


Fixed timezone issue

Fixed timezone issue

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


fix for params while refreshing commits page [#98190874]

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


source file eslintrc.cson

source file eslintrc.cson

for configuration and the ability to add notes

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

--- eslintrc.cson
+++ eslintrc.cson
@@ -0,0 +1,125 @@
+{
+  "ecmaFeatures": {
+    "modules": true
+    "experimentalObjectRestSpread": true
+  }
+
+  "env": {
+    "browser": false
+    "es6": true
+    "node": true
+  }
+
+  "globals": {
+    "document": false
+    "navigator": false
+    "window": false
+  },
+
+  "rules": {
+    "accessor-pairs": 2
+    "arrow-spacing": [2, { "before": true, "after": true }]
+    "brace-style": [2, "1tbs", { "allowSingleLine": true }]
+    "comma-dangle": [2, "never"]
+    "comma-spacing": [2, { "before": false, "after": true }]
+    "comma-style": [2, "last"]
+    "constructor-super": 2
+    "curly": [2, "multi-line"]
+    "dot-location": [2, "property"]
+    "eol-last": 2
+    "eqeqeq": [2, "allow-null"]
+    "generator-star-spacing": [2, { "before": true, "after": true }]
+    "handle-callback-err": [2, "^(err|error)$" ]
+    "indent": [2, 2, { "SwitchCase": 1 }]
+    "key-spacing": [2, { "beforeColon": false, "afterColon": true }]
+    "new-cap": [2, { "newIsCap": true, "capIsNew": false }]
+    "new-parens": 2
+    "no-array-constructor": 2
+    "no-caller": 2
+    "no-class-assign": 2
+    "no-cond-assign": 2
+    "no-const-assign": 2
+    "no-control-regex": 2
+    "no-debugger": 2
+    "no-delete-var": 2
+    "no-dupe-args": 2
+    "no-dupe-keys": 2
+    "no-duplicate-case": 2
+    "no-empty-character-class": 2
+    "no-empty-label": 2
+    "no-eval": 2
+    "no-ex-assign": 2
+    "no-extend-native": 2
+    "no-extra-bind": 2
+    "no-extra-boolean-cast": 2
+    "no-extra-parens": [2, "functions"]
+    "no-fallthrough": 2
+    "no-floating-decimal": 2
+    "no-func-assign": 2
+    "no-implied-eval": 2
+    "no-inner-declarations": [2, "functions"]
+    "no-invalid-regexp": 2
+    "no-irregular-whitespace": 2
+    "no-iterator": 2
+    "no-label-var": 2
+    "no-labels": 2
+    "no-lone-blocks": 2
+    "no-mixed-spaces-and-tabs": 2
+    "no-multi-spaces": 2
+    "no-multi-str": 2
+    "no-multiple-empty-lines": [2, { "max": 1 }]
+    "no-native-reassign": 2
+    "no-negated-in-lhs": 2
+    "no-new": 2
+    "no-new-func": 2
+    "no-new-object": 2
+    "no-new-require": 2
+    "no-new-wrappers": 2
+    "no-obj-calls": 2
+    "no-octal": 2
+    "no-octal-escape": 2
+    "no-proto": 2
+    "no-redeclare": 2
+    "no-regex-spaces": 2
+    "no-return-assign": 2
+    "no-self-compare": 2
+    "no-sequences": 2
+    "no-shadow-restricted-names": 2
+    "no-spaced-func": 2
+    "no-sparse-arrays": 2
+    "no-this-before-super": 2
+    "no-throw-literal": 2
+    "no-trailing-spaces": 2
+    "no-undef": 2
+    "no-undef-init": 2,
+    "no-unexpected-multiline": 2
+    "no-unneeded-ternary": 2
+    "no-unreachable": 2
+    "no-unused-vars": [2, { "vars": "all", "args": "none" }]
+    "no-useless-call": 2
+    "no-with": 2
+    "object-curly-spacing": [2, "always"]
+    "one-var": [2, { "initialized": "never" }]
+    "operator-linebreak": [2, "after"]
+    "quotes": [2, "single", "avoid-escape"]
+    "radix": 2
+    "semi": [2, "never"]
+    "space-after-keywords": [2, "always"]
+    "space-before-blocks": [2, "always"]
+    "space-before-function-paren": [2, "always"]
+    "space-in-parens": [2, "never"]
+    "space-infix-ops": 2
+    "space-return-throw-case": 2
+    "space-unary-ops": [2, { "words": true, "nonwords": false }]
+    "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }]
+    "use-isnan": 2
+    "valid-typeof": 2
+    "wrap-iife": [2, "any"]
+    "yoda": [2, "never"]
+
+    # Standard Plugin Options but just using eslint because I am fine with them.
+    "object-curly-spacing": [2, "never"]
+    "array-bracket-spacing": [2, "never"]
+    "computed-property-spacing": [2, "never"]
+  }
+}


Change tooltip placement based on toolbar position

--- lib/tool-bar-button-view.coffee
+++ lib/tool-bar-button-view.coffee
@@ -12,7 +12,18 @@

     if options.tooltip
       @prop 'title', options.tooltip
-      @subscriptions.add atom.tooltips.add(this, title: options.tooltip)
+      toolbarPosition = atom.config.get('tool-bar.position')
+      tooltipPlacement = (toolbarPosition is "Top")    and "bottom" or
+                         (toolbarPosition is "Right")  and "left"   or
+                         (toolbarPosition is "Bottom") and "top"    or
+                         (toolbarPosition is "Left")   and "right"
+      @subscriptions.add atom.tooltips.add(
+        this,
+        {
+          title: options.tooltip
+          placement: tooltipPlacement
+        }
+      )

     if options.iconset
       @addClass "#{options.iconset} #{options.iconset}-#{options.icon}"


Prepare Mocha BDD runner!

Prepare Mocha BDD runner!

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


Include models/ dir into release scope

Include models/ dir into release scope

We need to simplify grunt copy rules
   to copy everything from src but test/
Now it's unobvious that some files in new folders
   aren't released by default and need a special rule

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


starting some tests for facebook thrift's base handler

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

--- test/thrift/facebook_base_handler_spec.coffee
+++ test/thrift/facebook_base_handler_spec.coffee
@@ -0,0 +1,12 @@
+SocialCoffee= require '../../lib/version'
+Thrift      = require '../../lib/thrift/handler'
+
+# We use Thrift.Handler during tests since it extends FacebookBase
+
+describe 'FacebookBase', ->
+
+    describe '#getVersion', ->
+        it 'should return current service version', (done) ->
+            Thrift.Handler.getVersion (error, result) ->
+                result.should.equal SocialCoffee.version
+                done()


chore(build): make test pass

chore(build): make test pass

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


chore (test) Do not invent new mock windows

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


Restricted Roughedge and Sharpened Sword for Kithgard Gates Builder's Hammer swap, too.

--- app/views/game-menu/InventoryModal.coffee
+++ app/views/game-menu/InventoryModal.coffee
@@ -375,8 +375,8 @@
           #continue if item is 'leather-tunic' and inWorldMap and @options.levelID is 'the-raised-sword'  # Don't tell them they need it until they need it in the level  # ... when we make it so that you can buy it
           equipped = equipment[slot]
           continue if equipped and not (
-            (item is 'builders-hammer' and equipped in [gear['simple-sword'], gear['long-sword']]) or
-            (item in ['simple-sword', 'long-sword'] and equipped is gear['builders-hammer']) or
+            (item is 'builders-hammer' and equipped in [gear['simple-sword'], gear['long-sword'], gear['sharpened-sword'], gear['roughedge']]) or
+            (item in ['simple-sword', 'long-sword', 'roughedge', 'sharpened-sword'] and equipped is gear['builders-hammer']) or
             (item is 'leather-boots' and equipped is gear['simple-boots']) or
             (item is 'simple-boots' and equipped is gear['leather-boots'])
           )
@@ -469,3 +469,5 @@
   'bronze-shield': '544c310ae0017993fce214bf'
   'wooden-glasses': '53e2167653457600003e3eb3'
   'basic-flags': '545bacb41e649a4495f887da'
+  'roughedge': '544d7d918494308424f564a7'
+  'sharpened-sword': '544d7deb8494308424f564ab'


better callback

better callback

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


Add a test for the comparison function c255lbigintcmp

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

--- test/test-cmp.coffee
+++ test/test-cmp.coffee
@@ -0,0 +1,74 @@
+fs = require "fs"
+
+env = do -> this
+env.eval(fs.readFileSync("../curve255.js").toString())
+
+stdout  = process.stdout
+stderr  = process.stderr
+write   = (x) -> stdout.write x
+echo    = (x) -> write x + "\n"
+
+fromHex  = env.c255lhexdecode
+toHex    = env.c255lhexencode
+
+hex2ibh = (x) ->
+  x = new Array(64 + 1 - x.length).join("0") + x; # Pad with '0' at the front
+  # Invert bytes
+  return x.split(/(..)/).reverse().join("");
+
+toIbh = (x) -> hex2ibh(toHex x)
+
+printKey = (x) -> write(toIbh x)
+
+cmp = env.c255lbigintcmp
+xor = (a, b) ->
+  r = env.c255lzero()
+  for x in [15..0]
+    r[x] = a[x] ^ b[x]
+  r
+
+doit = (e, k) ->
+  # printKey e
+  # write " "
+  # printKey k
+  # write " "
+  ek = env.curve25519_raw e, k
+  # printKey ek
+  # write "\n"
+  ek
+
+e1  = fromHex "3"
+e2  = fromHex "5"
+k   = fromHex "9"
+
+# First collect 1000 keys
+
+collectedKeys = [ ]
+
+l = 0
+while l < 20
+  e1k    = doit e1, k
+  e2e1k  = doit e2, e1k
+  e2k    = doit e2, k
+  e1e2k  = doit e1, e2k
+  if 0 isnt cmp e1e2k, e2e1k
+    echo "fail"
+    process.exit 1
+  e1  = xor e1,  e2k
+  e2  = xor e2,  e1k
+  k   = xor k,   e1e2k
+  collectedKeys.push k
+  l++
+
+addmodp = env.c255laddmodp
+one = env.c255lone()
+
+for m in collectedKeys
+  n = addmodp m, one
+  throw "Unexpected result" if -1 isnt cmp m, n
+  throw "Unexpected result" if 1 isnt cmp n, m
+  throw "Unexpected result" if 0 isnt cmp m, m
+  throw "Unexpected result" if 0 isnt cmp n, n
+  # m = n
+
+console.log "Passed!"


Update App test paths.

Update App test paths.

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


TODO comment MsgBus service

TODO comment MsgBus service

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


home/billing: accept callbacks in planslist actionbar

--- client/home/lib/billing/components/planslist/view.coffee
+++ client/home/lib/billing/components/planslist/view.coffee
@@ -24,16 +24,24 @@
         renderRowAtIndex={@bound 'renderRowAtIndex'}
         renderEmptySectionAtIndex={@bound 'renderEmptySectionAtIndex'}
       />
-      <ActionBar />
+      <ActionBar
+        onMembersClick={@props.onMembersClick}
+        onDetailsClick={@props.onDetailsClick} />

-ActionBar = ->
+ActionBar = ({ onMembersClick, onDetailsClick }) ->
   <fieldset className="HomeAppView--ActionBar">
-
+
       VIEW MEMBERS

-
+
       PRICING DETAILS

   </fieldset>


activity: define `MessagePane::removeMessage` method

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


FlexSplit: set constants on main class for external uses

--- client/new-stack-editor/lib/views/flexsplit/index.coffee
+++ client/new-stack-editor/lib/views/flexsplit/index.coffee
@@ -5,6 +5,9 @@

 module.exports = class FlexSplit extends kd.View

+  # Keep copy of constants on FlexSplit for external uses
+  for own key, value of Flex
+    FlexSplit[key] = value

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


toggle cron and quartz schedules

toggle cron and quartz schedules

--- SingularityUI/app/views/requestFormEdit.coffee
+++ SingularityUI/app/views/requestFormEdit.coffee
@@ -5,6 +5,14 @@
     initialize: ->
         super
         app.$page.hide()
+
+    events: ->
+        _.extend super,
+            'change #schedule-type': 'handleScheduleTypeChange'
+
+    handleScheduleTypeChange: (e) ->
+        scheduleType = $(e.currentTarget).val()
+        @$("#schedule").val @model.get('request')[scheduleType]

     renderEditForm: ->
         request = @model.toJSON()
@@ -33,7 +41,9 @@
             @$("#waitAtLeast-#{request.type}").val request.request.waitAtLeastMillisAfterTaskFinishesForReschedule

         if request.type is 'SCHEDULED'
-            @$("#schedule").val request.request.schedule
+            @$("#schedule").val request.request.quartzSchedule
+            @setSelect2Val '#schedule-type', 'quartzSchedule'
+
             @$("#retries-on-failure").val request.request.numRetriesOnFailure
             @$("#scheduled-expected-runtime").val request.request.scheduledExpectedRuntimeMillis


Amazon: use credential key instead credential itself, add instanceType to template


Remove not used collectParticipants method from JPrivateMessage


Extra spaces removed

Extra spaces removed


Backend code to remove account

Backend code to remove account

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/goofy-bz/kresus.git/'


AdminIntegrationsView: Add integrationType flag.

--- client/admin/lib/views/integrations/adminintegrationsview.coffee
+++ client/admin/lib/views/integrations/adminintegrationsview.coffee
@@ -24,7 +24,8 @@
     tabView.addPane all        = new KDTabPaneView name: 'All Services'
     tabView.addPane configured = new KDTabPaneView name: 'Configured Integrations'

-    all.addSubView new AdminIntegrationsListView
+    all.addSubView        new AdminIntegrationsListView integrationType: 'new'
+    configured.addSubView new AdminIntegrationsListView integrationType: 'configured'

     tabView.showPaneByIndex 0
     @addSubView tabView


app-settings-menu: Removed logic for deprecated elements and fixed editor height.

--- client/landing/app/Applications/Ace.kdapplication/AppView.coffee
+++ client/landing/app/Applications/Ace.kdapplication/AppView.coffee
@@ -41,11 +41,7 @@

   setViewListeners:->

-    @ace.on "ace.ready", =>
-      @saveButton.enable()
-      @advancedSettings.enable()
-      @previewButton.enable()
-      @compileAndRunButton.enable()
+    @ace.on "ace.ready", => @advancedSettings.enable()

     @ace.on "ace.changeSetting", (setting, value)=>
       @ace["set#{setting.capitalize()}"]? value
@@ -123,11 +119,11 @@

   _windowDidResize:->

-    height = @getHeight() - 10
+    height = @getHeight() - 9
     editorHeight = height - @$('.editor-header').height()
     bottomBarHeight = @$('.editor-bottom-bar').height()
     @$('.editor-main').height editorHeight
-    @ace.setHeight editorHeight - bottomBarHeight - 10
+    @ace.setHeight editorHeight - bottomBarHeight - 9

   openSaveDialog: (callback) ->


initial spec for ride class

initial spec for ride class

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

--- spec/ride_spec.coffee
+++ spec/ride_spec.coffee
@@ -0,0 +1,8 @@
+Ride = require '../ride'
+describe "Ride", ->
+  it "should be create without parameters", ->
+      r = new Ride "hamburg->leipzig"
+      r2 = new Ride
+      r2.orig = "hamburg"
+      r2.dest = "leipzig"
+      expect(r).toEqual(r2)


compute/connect: add debug statements

compute/connect: add debug statements

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

--- client/app/lib/providers/connectcompute.coffee
+++ client/app/lib/providers/connectcompute.coffee
@@ -1,5 +1,7 @@
 React = require 'app/react'
 kd = require 'kd'
+
+debug = require('debug')('compute:connect')

 # FIXME: so naive, but works for now.
 makeSingular = (plural) -> plural.slice 0, -1
@@ -49,6 +51,7 @@

       return  unless @_mounted

+      debug 'onStorageUpdate'

       @setState makeState config, @props

@@ -88,6 +91,8 @@

       computeController.storage.off 'change', @bound 'onStorageUpdate'

+      debug 'componentWillUnmount'
+
       Object.keys(@events).forEach (eventId) =>
         computeController.off eventId, @events[eventId]
         delete @events[eventId]


Tests: AppManager: Use expect.spyOn.

Tests: AppManager: Use expect.spyOn.

--- client/app/test/applicationmanager.test.coffee
+++ client/app/test/applicationmanager.test.coffee
@@ -1,6 +1,5 @@
 kd                 = require 'kd'
 expect             = require 'expect'
-sinon              = require 'sinon'
 globals            = require 'globals'
 AppController      = require '../lib/appcontroller'
 registerAppClass   = require '../lib/util/registerAppClass'
@@ -23,13 +22,13 @@

       isRegistered = no
       appInstance  = new AppController name: 'FooApp'
-      sinon.spy(appManager, 'setListeners')
+      expect.spyOn appManager, 'setListeners'

       appManager.on 'AppRegistered', -> isRegistered = yes
       appManager.register appInstance

       expect(appManager.appControllers.FooApp.instances).toInclude appInstance
-      expect(appManager.setListeners.calledOnce).toBe yes
+      expect(appManager.setListeners).toHaveBeenCalled()
       expect(isRegistered).toBe yes

@@ -47,11 +46,11 @@

     it 'should warn if there is no name', ->

-      sinon.spy(kd, 'warn')
+      expect.spyOn kd, 'warn'

       appManager.tell()

-      expect(kd.warn.calledOnce).toBe yes
+      expect(kd.warn).toHaveBeenCalled()

   describe '::create', ->


work on koding router (wip)

work on koding router (wip)

--- client/landing/app/MainApp/kodingrouter.coffee
+++ client/landing/app/MainApp/kodingrouter.coffee
@@ -12,9 +12,6 @@
       new KDNotificationView title: "You're already here!"
       console.trace()

-  cleanupRoute:(contentDisplay)->
-    delete @openRoutes[@openRoutesById[contentDisplay.id]]
-
   handleRoute =(groupId, route)->
     console.log 'invoking a route by group id...'

@@ -29,8 +26,20 @@
       @handleRoute @getDefaultRoute(), replaceState: yes
     else
       KD.getSingleton('mainController').doGoHome()
+
+  getContentTitle =(model)->
+    {JAccount, JStatusUpdate} = KD.remote.api
+    @utils.shortenText (switch model.constructor
+      when JAccount then "#{model.profile.firstName} #{model.profile.lastName}"
+      when JStatusUpdate then model.body
+      else title
+    ), 100
+
+  cleanupRoute:(contentDisplay)->
+    delete @openRoutes[@openRoutesById[contentDisplay.id]]

-  go =(app, group, query, rest...)->
+  go:(app, group, query, rest...)->
+    @setPageTitle app
     unless group?
       appManager.openApplication app
     else
@@ -58,7 +67,11 @@

   getDefaultRoute:-> '/Activity'

+  setPageTitle:(title="Koding")->
+    document.title = title
+
   openContent:(name, section, state, route)->
+    @setPageTitle getContentTitle state
     appManager.tell section, 'createContentDisplay', state, (contentDisplay)=>
       @openRoutes[route] = contentDisplay
       @openRoutesById[contentDisplay.id] = route
@@ -97,6 +110,12 @@

   getRoutes =->
     mainController = KD.getSingleton 'mainController'
+
+    openApp       = @createContentDisplayHandler 'Apps'
+    openActivity  = @createContentDisplayHandler 'Activity'
+    openMember    = @createContentDisplayHandler 'Members'
+    openGroup     = @createContentDisplayHandler 'Groups'
+    openTopic     = @createContentDisplayHandler 'Topics'

     routes =

@@ -111,18 +130,18 @@
       '/:name?/Recover'   : ({params:{name}})-> mainController.doRecover name

       # nouns
-      '/:name?/Groups'    : ({params:{name}, query})-> go 'Groups'  , name, query
-      '/:name?/Activity'  : ({params:{name}, query})-> go 'Activity', name, query
-      '/:name?/Members'   : ({params:{name}, query})-> go 'Members' , name, query
-      '/:name?/Topics'    : ({params:{name}, query})-> go 'Topics'  , name, query
-      '/:name?/Develop'   : ({params:{name}, query})-> go 'StartTab', name, query
-      '/:name?/Apps'      : ({params:{name}, query})-> go 'Apps'    , name, query
-      '/:name?/Account'   : ({params:{name}, query})-> go 'Account' , name, query
+      '/:name?/Groups'    : ({params:{name}, query})-> @go 'Groups'  , name, query
+      '/:name?/Activity'  : ({params:{name}, query})-> @go 'Activity', name, query
+      '/:name?/Members'   : ({params:{name}, query})-> @go 'Members' , name, query
+      '/:name?/Topics'    : ({params:{name}, query})-> @go 'Topics'  , name, query
+      '/:name?/Develop'   : ({params:{name}, query})-> @go 'StartTab', name, query
+      '/:name?/Apps'      : ({params:{name}, query})-> @go 'Apps'    , name, query
+      '/:name?/Account'   : ({params:{name}, query})-> @go 'Account' , name, query

       # content displays:
-      '/:name?/Topics/:topicSlug'       : @createContentDisplayHandler 'Topics'
-      '/:name?/Activity/:activitySlug'  : @createContentDisplayHandler 'Activity'
-      '/:name?/Apps/:appSlug'           : @createContentDisplayHandler 'Apps'
+      '/:name?/Topics/:topicSlug'       : openTopic
+      '/:name?/Activity/:activitySlug'  : openActivity
+      '/:name?/Apps/:appSlug'           : openApp

       '/recover/:recoveryToken': ({params:{recoveryToken}})->
         mainController.appReady ->
@@ -194,16 +213,14 @@
               appManager.tell "Members", "createContentDisplay", account

       # top level names:
-      '/:name': ({params})->
+      '/:name':({params})->
         status_404 = => @handleNotFound params.name
         KD.remote.cacheable params.name, (err, model, name)->
+          console.log arguments
           switch name?.constructorName
-            when 'JAccount'
-              appManager.tell 'Members', 'createContentDisplay', model
-            when 'JGroup'
-              appManager.tell 'Groups', 'createContentDisplay', model
-            when 'JTopic'
-              appManager.tell 'Topics', 'createContentDisplay', model
+            when 'JAccount' then openMember   model
+            when 'JGroup'   then openGroup    model
+            when 'JTopic'   then openTopic    model
             else status_404()

     sharedRoutes = KODING_ROUTES.concat KODING_ROUTES.map (route)->


buffering status on stream button

buffering status on stream button

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


+test require variations

+test require variations

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

--- test/lib/instance-variations.coffee
+++ test/lib/instance-variations.coffee
@@ -0,0 +1,37 @@
+assert = require 'assert'
+
+describe 'test require strung', ->
+
+  testString = 'test string'
+
+  describe 'without arguments', ->
+
+    it 'should return builder function', ->
+
+      strung = require '../../lib'
+
+      assert.equal typeof(strung), 'function', 'strung should be a Function'
+
+  describe 'with empty arguments', ->
+
+    it 'should return a Strung class instance', ->
+
+      strung = require('../../lib')()
+
+      assert.notEqual typeof(strung), 'function', 'strung should be a class instance'
+
+  describe 'with string argument', ->
+
+    it 'should create a Strung class instance with string', ->
+
+      strung = (require '../../lib') testString
+
+      assert.equal strung._source, testString
+
+  describe 'with destructuring for class', ->
+
+    it 'should extract exported class', ->
+
+      {Strung} = require '../../lib'
+
+      assert Strung


JMachine::setChannelId: to keep collaboration channelID on JMachine

--- workers/social/lib/social/models/computeproviders/machine.coffee
+++ workers/social/lib/social/models/computeproviders/machine.coffee
@@ -25,6 +25,7 @@
       groups            : 'sparse'
       domain            : 'sparse'
       status            : 'sparse'
+      channelId         : 'unique'

     sharedEvents        :
       static            : [ ]
@@ -53,6 +54,8 @@
           (signature Object, Function)
         unshare         :
           (signature Object, Function)
+        setChannelId    :
+          (signature Object, Function)

         # Disabled for now ~ GG
         # setAsOwner      :
@@ -140,6 +143,9 @@
         templateId      : ObjectId
         revision        : String

+      channelId         :
+        type            : String
+

   # Helpers
   # -------
@@ -768,3 +774,40 @@
       machine.shareWith$ client, options, (err) ->

         callback err, machine
+
+
+  setChannelId: permit 'set label',
+
+    success: revive
+
+      shouldReviveClient   : yes
+      shouldLockProcess    : yes
+      shouldReviveProvider : no
+
+    , (client, options, callback) ->
+
+      { channelId } = options
+      { r: { user } } = client
+
+      # Only an owner of this machine can modify it
+      unless isOwner user, this
+        return callback new KodingError 'Access denied'
+
+      if channelId
+
+        if typeof channelId isnt 'string' or channelId.length > 20
+          return callback new KodingError 'Invalid ChannelID provided'
+
+        @update { $set: { channelId } }, (err) =>
+          return callback err  if err
+          return callback null, this
+
+      else
+
+        @update { $unset: { channelId: 1 } }, (err) =>
+          return callback err  if err
+
+          delete this.data.channelId
+          delete this.channelId
+
+          return callback null, this


Add the `add()` method to the ProviderSet 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/JoshuaToenyes/stout-core.git/'


Fix my js_loader patch

Fix my js_loader patch

* still call the callback when skipping duplicate file.  This updates the completed flags, and so the overall "we're done" callback fires properly.

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 tests for Apollos forgotPassword

add tests for Apollos forgotPassword

error: pathspec 'tests/mocha/apollos/user/forgotPassword.coffee' did not match any file(s) known to git

--- tests/mocha/apollos/user/forgotPassword.coffee
+++ tests/mocha/apollos/user/forgotPassword.coffee
@@ -0,0 +1,24 @@
+MochaWeb?.testOnly ->
+
+  assert = chai.assert
+
+  describe 'Apollos', ->
+    describe 'user', ->
+      describe 'forgotPassword', ->
+
+        if Meteor.isClient
+          before ->
+            Apollos.user.forgotPassword 'apollos.person.keys@newspring.cc'
+
+        it 'should be defined', ->
+          assert.isDefined Apollos.user.forgotPassword
+        it 'should be a function', ->
+          assert.equal typeof Apollos.user.forgotPassword, 'function'
+
+        if Meteor.isServer
+
+          it 'should have a reset token', ->
+            user = Apollos.users.findOne
+              'emails.address': 'apollos.person.keys@newspring.cc'
+            token = user.services.password.reset.token
+            assert token.length > 0


Adding a CoffeeScript equivalent to Rake/Make/Jake (Cake, naturally), and implementing all of our build and test tasks in the Cakefile. Run bin/cake to see the tasks.

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

--- cake.coffee
+++ cake.coffee
@@ -0,0 +1,39 @@
+# `cake` is a simplified version of Make (Rake, Jake) for CoffeeScript.
+
+fs:       require 'fs'
+path:     require 'path'
+coffee:   require 'coffee-script'
+
+tasks: {}
+
+# Mixin the Cake functionality.
+process.mixin {
+
+  # Define a task with a name, a description, and the action itself.
+  task: (name, description, action) ->
+    tasks[name]: {name: name, description: description, action: action}
+
+  # Invoke another task in the Cakefile.
+  invoke: (name) ->
+    tasks[name].action()
+}
+
+# Display the list of Cake tasks.
+print_tasks: ->
+  for name, task of tasks
+    spaces: 20 - name.length
+    spaces: if spaces > 0 then (' ' for i in [0..spaces]).join('') else ''
+    puts "cake " + name + spaces + ' # ' + task.description
+
+# The CommandLine handles all of the functionality of the `coffee` utility.
+exports.run: ->
+  path.exists 'Cakefile', (exists) ->
+    throw new Error('Cakefile not found in ' + process.cwd()) unless exists
+    args: process.ARGV[2...process.ARGV.length]
+    fs.cat('Cakefile').addCallback (source) ->
+      eval coffee.compile source
+      return print_tasks() unless args.length
+      for arg in args
+        throw new Error('No such task: "' + arg + '"') unless tasks[arg]
+        tasks[arg].action()
+


Disregard tests, push to production

Disregard tests, push to production

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -437,8 +437,8 @@
     resultWrapper = (err, res) ->
       return callback(err, res) if err

-      res = res.toString('utf8').map (line) ->
-        [_, who, what] = line.match(/^([^\s]+): (.+)$/)
+      res = res.map (line) ->
+        [_, who, what] = line.toString('utf8').match(/^([^\s]+): (.+)$/)
         [filterName(who), filterText(what)]
       callback(err, res)


Text padding extracted to constants

Text padding extracted to constants

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -30,6 +30,9 @@
 # Maximum width of the speech bubble, after text becomes wider
 # it is wrapped to a new line
 AYP_BUBBLE_MAX_WIDTH          = AYP_PANEL_WIDTH - 18
+
+# Padding on each side of the text bubble
+AYP_TEXT_PADDING              = 2

 ## Paths to find media
@@ -298,16 +301,19 @@
   msg = formatForTextBubble(msg, font, size, max)
   [w, h] = textSize(msg, font, size)

-  frame = GD.createTrueColor(w, h)
+  frame = GD.createTrueColor(
+    w + (AYP_TEXT_PADDING * 2),
+    h + (AYP_TEXT_PADDING * 2)
+  )
   frame.saveAlpha(1)
   white = frame.colorAllocate(0xff, 0xff, 0xff)
   black = frame.colorAllocate(0x00, 0x00, 0x00)
   frame.fill(0, 0, white)

   frame.stringFT(black, font, size,
-    0,    # Rotation angle
-    0,    # x
-    size, # y
+    0,                           # Rotation angle
+    AYP_TEXT_PADDING,            # x
+    AYP_TEXT_PADDING + size + 1, # y
     msg
   )
   return frame


added sha1-based implementation for token generation

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


Use ES5 defineProperty instead of __defineGetter__.

--- src/chainer.coffee
+++ src/chainer.coffee
@@ -60,8 +60,10 @@

   for name of contextTree or {}
     do (name) ->
-      fn.__defineGetter__ plus.camelize(name), () ->
-        return Chainer(request, "#{_path}/#{name}", name, contextTree[name])
+      Object.defineProperty fn, plus.camelize(name),
+        configurable: true
+        enumerable: true
+        get: () -> return Chainer(request, "#{_path}/#{name}", name, contextTree[name])

   return fn


Hide _app_own_environment environments

Hide _app_own_environment environments

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/hlecuanda/conda-ui.git/'


some magic to keep the call (really, the audiostream) active between tabs switches

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


Only apply passkeys to single character keys explicitly

Before this change, a string in KeyboardUtils.keyNames could have the
key it represents disabled if
* its letters were in alphabetical order, and
* the user has set all of its letters as passkeys, with none in between.

For example, imagining that "del" (for delete) was in
KeyboardUtils.keyNames, the passkeys "dpyl0e" would cause the delete key
to be a passkey too.

This commit fixes the issue by only applying passkeys when keyChar is a
single character.

--- content_scripts/mode_passkeys.coffee
+++ content_scripts/mode_passkeys.coffee
@@ -12,7 +12,7 @@
   # passKey, then 'gt' and '99t' will neverthless be handled by Vimium.
   handleKeyChar: (event, keyChar) ->
     return @continueBubbling if event.altKey or event.ctrlKey or event.metaKey
-    if keyChar and not @keyQueue and 0 <= @passKeys.indexOf keyChar
+    if keyChar and not @keyQueue and keyChar.length == 1 and 0 <= @passKeys.indexOf keyChar
       @stopBubblingAndTrue
     else
       @continueBubbling


[bot] [add] !mikuia status

[bot] [add] !mikuia status

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


Added generic http utility

Added generic http utility

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

--- app/http/index.coffee
+++ app/http/index.coffee
@@ -0,0 +1,20 @@
+http = require 'http'
+
+exports.get = (url, onSuccess, onError) ->
+	request = http.get("#{@settings.api}#{url}", (res) ->
+		response = ''
+		# We receive data in chunks
+		res.on 'data', (chunk) ->
+			response+=chunk
+
+		# Request ended, write file (if we have any data)
+		res.on 'end', () ->
+			if response isnt ''
+				try
+					response = JSON.parse response
+				catch e
+					console.log e
+				onSuccess?(200, response)
+	, (err) ->
+		onError?(err)
+	)


Fix the timing of changing mission label to yellow to 60s prior to finish

--- views/components/main/parts/mission-panel.cjsx
+++ views/components/main/parts/mission-panel.cjsx
@@ -6,29 +6,26 @@

 CountdownTimer = require './countdown-timer'
 CountdownLabel = React.createClass
-  getLabelStyle: (timeRemaining, notifyBefore) ->
+  getLabelStyle: (timeRemaining) ->
     switch
-      when timeRemaining > notifyBefore + 540 then 'primary'
-      when timeRemaining > notifyBefore  then 'warning'
+      when timeRemaining > 600 then 'primary'
+      when timeRemaining > 60  then 'warning'
       when timeRemaining >= 0  then 'success'
       else 'default'
   getInitialState: ->
     @notify = _.once @props.notify
-    timeRemaining = CountdownTimer.getTimeRemaining @props.completeTime
-    style: @getLabelStyle timeRemaining, window.notify.expedition
+    style: @getLabelStyle(CountdownTimer.getTimeRemaining @props.completeTime)
   componentWillReceiveProps: (nextProps) ->
     if nextProps.completeTime isnt @props.completeTime
       @notify = _.once nextProps.notify
-      timeRemaining = CountdownTimer.getTimeRemaining nextProps.completeTime
       @setState
-        style: @getLabelStyle timeRemaining, window.notify.expedition
+        style: @getLabelStyle(CountdownTimer.getTimeRemaining nextProps.completeTime)
   shouldComponentUpdate: (nextProps, nextState) ->
     nextProps.completeTime isnt @props.completeTime or nextState.style isnt @state.style
   tick: (timeRemaining) ->
-    notifyBefore = window.notify.expedition
-    @notify() if timeRemaining <= notifyBefore
+    @notify() if timeRemaining <= window.notify.expedition

-    style = @getLabelStyle timeRemaining, notifyBefore
+    style = @getLabelStyle timeRemaining
     @setState {style: style} if style isnt @state.style
   render: ->
     <OverlayTrigger placement='left' overlay={


[emit] ugh like fuck 5.1

[emit] ugh like fuck 5.1

seriously

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


remove choice button removes elements from DOM so validation doesn't break

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/flatiron-school-student-projects/open-exam.git/'


Fixed the duplicate camera appears on sidebar camera list bug on camera sharing. (#2174)

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


Environments: filter domains by group

Environments: filter domains by group

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


JDomain: Update domain filter, accept all custom domains

--- workers/social/lib/social/models/domain.coffee
+++ workers/social/lib/social/models/domain.coffee
@@ -152,8 +152,13 @@
     domainList = []
     domainList = domains.filter (domain)->
       {domain} = domain
-      re = if group is "koding" then new RegExp(account.profile.nickname + '\.kd\.io$') \
-           else new RegExp('(.*)\.' + group + '\.kd\.io$')
+      return yes  unless /\.kd\.io$/.test domain
+
+      re = if group is "koding"
+             new RegExp(account.profile.nickname + '\.kd\.io$')
+           else
+             new RegExp('(.*)\.' + group + '\.kd\.io$')
+
       isVmAlias         = (/^shared|vm[\-]?([0-9]+)?/.test domain)
       isKodingSubdomain = (/(.*)\.(koding|guests)\.kd\.io$/.test domain)
       isGroupAlias      = re.test domain


Client: Activity: Created channelNotificationSettings module index file


Remove 'modal dialogs' spec.

Remove 'modal dialogs' spec.

The main purpose of this spec is to test whether the simulation of modal
dialogs works, since the dialogs of atom-shell are real blocking modal
dialogs, there is no need to check whether the dialogs are presented as
modal dialogs correctly any more.

--- spec/app/atom-spec.coffee
+++ spec/app/atom-spec.coffee
@@ -282,77 +282,6 @@
     it "returns the current version number", ->
       expect(typeof atom.getVersion()).toBe 'string'

-  xdescribe "modal native dialogs", ->
-    beforeEach ->
-      spyOn(atom, 'sendMessageToBrowserProcess')
-      atom.sendMessageToBrowserProcess.simulateConfirmation = (buttonText) ->
-        labels = @argsForCall[0][1][2...]
-        callbacks = @argsForCall[0][2]
-        @reset()
-        callbacks[labels.indexOf(buttonText)]()
-        advanceClock 50
-
-      atom.sendMessageToBrowserProcess.simulatePathSelection = (path) ->
-        callback = @argsForCall[0][2]
-        @reset()
-        callback(path)
-        advanceClock 50
-
-    it "only presents one native dialog at a time", ->
-      confirmHandler = jasmine.createSpy("confirmHandler")
-      selectPathHandler = jasmine.createSpy("selectPathHandler")
-
-      atom.confirm "Are you happy?", "really, truly happy?", "Yes", confirmHandler, "No"
-      atom.confirm "Are you happy?", "really, truly happy?", "Yes", confirmHandler, "No"
-      atom.showSaveDialog(selectPathHandler)
-      atom.showSaveDialog(selectPathHandler)
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      atom.sendMessageToBrowserProcess.simulateConfirmation("Yes")
-      expect(confirmHandler).toHaveBeenCalled()
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      atom.sendMessageToBrowserProcess.simulateConfirmation("No")
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      atom.sendMessageToBrowserProcess.simulatePathSelection('/selected/path')
-      expect(selectPathHandler).toHaveBeenCalledWith('/selected/path')
-      selectPathHandler.reset()
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-
-    it "prioritizes dialogs presented as the result of dismissing other dialogs before any previously deferred dialogs", ->
-      atom.confirm "A1", "", "Next", ->
-        atom.confirm "B1", "", "Next", ->
-          atom.confirm "C1", "", "Next", ->
-          atom.confirm "C2", "", "Next", ->
-        atom.confirm "B2", "", "Next", ->
-      atom.confirm "A2", "", "Next", ->
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "A1"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "B1"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "C1"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "C2"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "B2"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
-      expect(atom.sendMessageToBrowserProcess.callCount).toBe 1
-      expect(atom.sendMessageToBrowserProcess.argsForCall[0][1][0]).toBe "A2"
-      atom.sendMessageToBrowserProcess.simulateConfirmation('Next')
-
   describe "API documentation", ->
     it "meets a minimum threshold for /app (with no errors)", ->
       docRunner = jasmine.createSpy("docRunner")


Spread the app specs out.

Spread the app specs out.

--- spec/atom/app-spec.coffee
+++ spec/atom/app-spec.coffee
@@ -12,27 +12,29 @@

   describe "open", ->
     describe "when opening a filePath", ->
-      it "loads a buffer with filePath contents and displays it in a new window", ->
+      it "displays it in a new window", ->
         filePath = require.resolve 'fixtures/sample.txt'
         expect(app.windows().length).toBe 0

         app.open filePath

         expect(app.windows().length).toBe 1
+
+      it "loads a buffer with filePath contents", ->
+        filePath = require.resolve 'fixtures/sample.txt'
+
+        app.open filePath
+
         newWindow = app.windows()[0]
-
         expect(newWindow.rootView.editor.buffer.url).toEqual filePath
         expect(newWindow.rootView.editor.buffer.getText()).toEqual fs.read(filePath)

     describe "when opening a dirPath", ->
       it "loads an empty buffer", ->
         dirPath = require.resolve 'fixtures'
-        expect(app.windows().length).toBe 0

         app.open dirPath

-        expect(app.windows().length).toBe 1
         newWindow = app.windows()[0]
-
         expect(newWindow.rootView.editor.buffer.url).toBeUndefined
         expect(newWindow.rootView.editor.buffer.getText()).toBe ""


See #56. Start implementing of Message View.

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


Remove old CartoDB route

Remove old CartoDB route

--- app.coffee
+++ app.coffee
@@ -17,7 +17,6 @@

   app.get "/wb/:countryCode/:indicatorCode", worldBankQuery
   app.get "/esri/:serviceName/:featureServer", esriQuery
-  app.get "/cdb/:username/:tablename/:query", cartodbQuery
   app.get "/ede/:countryCode/:variableId", edeQuery
   app.get "/indicator/:id/data", indicatorData.query


the sample to be tested upon

the sample to be tested upon

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

--- sample.coffee
+++ sample.coffee
@@ -0,0 +1,41 @@
+calculator = (method, numbers...) ->
+  switch method
+    when 'multiple' then @multiple(numbers)
+    when 'addition' then @addition(numbers)
+    when 'minus' then @minus(numbers)
+    when 'divide' then @divide(numbers)
+    else
+      throw new Error "method doesn't exist"
+
+multiple = (numbers) ->
+  if numbers.length <= 1
+    throw new Error 'multiple takes more than one operands'
+  else
+    numbers.reduce (prev, curr) ->
+      prev * curr
+
+addition = (numbers) ->
+  if numbers.length <= 1
+    throw new Error 'addition takes more than one operands'
+  else
+    numbers.reduce (prev, curr) ->
+      prev + curr
+
+minus = (numbers) ->
+  if numbers.length isnt 2
+    throw new Error 'minus takes only two operands'
+  else
+    numbers[0] - numbers[1]
+
+divide = (numbers) ->
+  if numbers.length isnt 2
+    throw new Error 'divide takes only two operands'
+  else
+    numbers[0] / numbers[1]
+
+module.exports =
+  calculator: calculator
+  multiple: multiple
+  addition: addition
+  minus: minus
+  divide: divide


adicionando poucas configuracoes iniciais

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

--- docpad.cson
+++ docpad.cson
@@ -0,0 +1,18 @@
+{
+  templateData:
+    conf:
+      name: "Conference name"
+      description: "Conference description"
+      date: "November 15"
+      price: "$100"
+      address: "Boulevard Kukulcan, 30, México"
+      venue: "Coco Bongo"
+      city: "Cancún"
+    site:
+      url: "http://confboilerplate.com"
+      favicon: "http://braziljs.org/favicon.ico"
+      googleanalytics: "UA-33656081-1"
+      images:
+        cover: "http://f.cl.ly/items/2X28422q1e3w0C2U1P3H/866591_24254643.jpg"
+        facebook: "http://braziljs.org/img/fb-share.jpg"
+}


Removed debug statement

Removed debug statement

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


initial commit of drush script, very simple drush actions

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

--- src/scripts/drush.coffee
+++ src/scripts/drush.coffee
@@ -0,0 +1,35 @@
+# Description:
+#   Playing with Drush integration.
+#
+# Commands:
+#   hubot drush cc <site alias> - Clears the cache for a given site alias.
+
+util = require("util")
+spawn = require("child_process").spawn
+
+module.exports = (robot) ->
+  robot.respond /drush sa$/i, (msg) ->
+    sitelist = ''
+    sitealias = spawn("drush", ["sa"])
+    sitealias.stdout.on "data", (data) ->
+      sitelist = sitelist + data
+
+    sitealias.on "exit", (code) ->
+      msg.send sitelist
+
+  robot.respond /drush cc (.*)$/i, (msg) ->
+    ccout = ''
+    clearcache = spawn("drush", [msg.match[1], "cc", "all"])
+    msg.send "This may take a minute, please be patient..."
+    clearcache.stdout.on "data", (data) ->
+      ccout = ccout + data
+
+    clearcache.stderr.on "data", (data) ->
+      ccout = ccout + data
+
+    clearcache.on "exit", (code) ->
+      if code is 0
+        msg.send ccout
+      else
+        msg.send "Drush experienced and error."
+


Ensure that an icon has always a background

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


removed license from source file

removed license from source 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/genericdave/speedr.js.git/'


fixed google tag manager config test

fixed google tag manager config test

--- client/views/main.coffee
+++ client/views/main.coffee
@@ -5,7 +5,7 @@
 		s = 'script'
 		l = 'dataLayer'
 		i = RocketChat.settings.get 'API_Analytics'
-		if i
+		if Match.test(i, String) and i.trim() isnt ''
 			do (w,d,s,l,i) ->
 				w[l] = w[l] || []
 				w[l].push {'gtm.start': new Date().getTime(), event:'gtm.js'}


Fixed 'show all' option to be set up by default on users index [#84758800]

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


Use simple JS menu to choose login portal.   (missed one file in commit)

[#66918404] Clarify login procedure

https://www.pivotaltracker.com/story/show/66918404

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

--- app/assets/javascripts/login_menu.coffee
+++ app/assets/javascripts/login_menu.coffee
@@ -0,0 +1,32 @@
+class LoginMenu
+  constructor: (@trigger=$('.login_portal_widget_toggle')) ->
+    @trigger = $('.login_portal_widget_toggle')
+    @menu    = $('.login_portals_widget')
+    @register_handlers()
+
+  position_menu: () ->
+    o = @trigger.offset()
+    parent = @trigger.parent().parent()
+    po = parent.offset()
+    margin = 12
+    @menu.offset({
+      top: o.top + @trigger.height() + margin
+      left: o.left
+    })
+  register_handlers: () ->
+    @trigger.click (e) =>
+      @menu.toggle()
+      @position_menu()
+      e.stopPropagation()
+
+    $('body').click () =>
+      @menu.hide()
+    $(window).resize () =>
+      @position_menu()
+
+
+root = exports ? this
+root.LoginMenu = LoginMenu
+
+$('document').ready ->
+  root.login_menu = new LoginMenu()


fix merging of tag properties + comments

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


Add "Load" strategy.

Add "Load" strategy.

error: pathspec 'lib/Strategy/DBStrategy/Load.coffee' did not match any file(s) known to git

--- lib/Strategy/DBStrategy/Load.coffee
+++ lib/Strategy/DBStrategy/Load.coffee
@@ -0,0 +1,14 @@
+Match = require "mtr-match"
+DBStrategy = require "../DBStrategy"
+
+class Load extends DBStrategy
+  constructor: (input, dependencies) ->
+    Match.check input, Match.ObjectIncluding
+      avatarId: String
+    super
+    @knex = dependencies.knex
+    @bookshelf = dependencies.bookshelf
+    Match.check @knex, Function
+    Match.check @bookshelf, Object
+
+module.exports = Load


StackEditor: code tidy up, initialise layout/flexplits inline


Prevent JS from showing unstarted issues.

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


Add callback for Servers load and save/load from disk

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/Morgy93/Rocket.Chat.Cordova.git/'


Tweak Atom config

Tweak Atom 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/ylansegal/dotfiles.git/'


inject input type on demand

inject input type on demand

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

--- src/coffee/directives/dynamic.coffee
+++ src/coffee/directives/dynamic.coffee
@@ -0,0 +1,30 @@
+##
+## dynamic.coffee
+##
+## Created by Frederic DELBOS - fred.delbos@gmail.com on Dec 11 2013.
+## This file is subject to the terms and conditions defined in
+## file 'LICENSE.txt', which is part of this source code package.
+##
+
+angular.module('CoolFormDirectives').
+  directive('coolformDynamic', ($compile) ->
+
+    l = (scope, elem) ->
+
+      mkTemplate = (name) ->
+        """<#{name} field="field" service="service"></#{name}>"""
+
+      type = scope.service.directives.get(scope.field.type)
+      el = $compile(mkTemplate(type))(scope)
+      elem.append(el)
+
+    return {
+      restrict: 'E'
+      scope:
+        field: '='
+        service: '='
+      template: ""
+      link: l
+      }
+
+  )


steroids:app composes with steroids:platform-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/'