fix remove device

fix remove device

--- server/controllers/devices.coffee
+++ server/controllers/devices.coffee
@@ -158,7 +158,7 @@
 #       * remove device access
 #       * remove device document
 removeDevice = (device, cb) ->
-    id = device.id
+    id = device._id
     # Remove Access
     clientDS.del "access/#{id}/", (err, result, body) ->
         if err?


Don't do `set()` on states for data == null. Prevents another red message in the console (but not much more)

Signed-off-by: Peter Kröner <4b8373d016f277527198385ba72fda0feb5da015@peterkroener.de>

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


adding new script for puppetbd stats

adding new script for puppetbd stats

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

--- src/scripts/puppetdb.coffee
+++ src/scripts/puppetdb.coffee
@@ -0,0 +1,164 @@
+sys = require 'sys' # Used for debugging
+Browser = require('zombie')
+_puppetdbAliases = {}
+
+
+class PuppetDB
+  constructor: (@robot) ->
+    @logger = @robot.logger
+
+  getFailed: (url, cb) ->
+    browser = new Browser
+
+    browser.visit "#{url}/", (e) ->
+      browser.wait 5000, (f) ->
+        cb browser.text('.ui.red.header.no-margin-bottom').trim() + " with status failed"
+
+  getPending: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        cb browser.text('.ui.purple.header.no-margin-bottom').trim() + " with status pending"
+
+  getChanged: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        cb browser.text('.ui.green.header.no-margin-bottom').trim() + " with status changed"
+
+  getUnreported: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        cb browser.text('.ui.black.header.no-margin-bottom').trim() + " unreported in the last 3 hours"
+
+  getPopulation: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        items = browser.querySelectorAll('.ui.header.darkblue.no-margin-bottom')
+        value = items[0]._childNodes[0]._nodeValue.trim() + " Population"
+        cb value
+
+  getResources: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        items = browser.querySelectorAll('.ui.header.darkblue.no-margin-bottom')
+        value = items[1]._childNodes[0]._nodeValue.trim() + " Resources managed"
+        cb value
+
+  getResPerNode: (url, cb) ->
+    browserOpts =
+      site: url
+
+    browser = new Browser browserOpts
+
+    browser.visit '/', (e) ->
+      browser.wait 5000, (f) ->
+        items = browser.querySelectorAll('.ui.header.darkblue.no-margin-bottom')
+        value = items[2]._childNodes[0]._nodeValue.trim() + " Avg. resources/node"
+        cb value
+
+module.exports = (robot) ->
+  logger = robot.logger
+
+  robot.brain.on 'loaded', ->
+    if robot.brain.data.puppetdb_aliases?
+      _puppetdbAliases = robot.brain.data.puppetdb_aliases
+
+  showAliases = (msg) ->
+    if _puppetdbAliases == null || Object.keys(_puppetdbAliases).length == 0
+      msg.send("I cannot find any puppetdb system aliases")
+    else
+      for alias of _puppetdbAliases
+        msg.send("I found '#{alias}' as an alias for the system: #{_puppetdbAliases[alias]['url']}")
+
+  clearAlias = (msg, alias) ->
+    delete _puppetdbAliases[alias]
+    robot.brain.data.puppetdb_aliases = _puppetdbAliases
+    msg.send("The puppetdb system alias #{alias} has been removed")
+
+  setAlias = (msg, alias, url) ->
+    _puppetdbAliases[alias] = { url: url }
+    robot.brain.data.puppetdb_aliases = _puppetdbAliases
+    msg.send("The puppetdb system alias #{alias} for #{url} has been added to the brain")
+
+
+  robot.respond /puppetdb show status in (.*)/i, (msg) ->
+    if msg.message.user.id is robot.name
+      return
+
+    alias =  msg.match[1]
+    url = _puppetdbAliases[alias]['url']
+
+    puppetdb = new PuppetDB(robot)
+
+    status = []
+    functions = ['getFailed', 'getPending', 'getChanged', 'getUnreported']
+    count = 0
+    functions.forEach (name) ->
+      puppetdb[name] url, (callback) ->
+        status.push callback
+        msg.send status.join("\n") if count >= (functions.length-1)
+        count++
+
+  robot.respond /puppetdb show stats in (.*)/i, (msg) ->
+    if msg.message.user.id is robot.name
+      return
+
+    alias =  msg.match[1]
+    url = _puppetdbAliases[alias]['url']
+
+    puppetdb = new PuppetDB(robot)
+
+    status = []
+    functions = ['getPopulation', 'getResources', 'getResPerNode']
+    count = 0
+    functions.forEach (name) ->
+      puppetdb[name] url, (callback) ->
+        status.push callback
+        msg.send status.join("\n") if count >= (functions.length-1)
+        count++
+
+
+  robot.respond /puppetdb show aliases/i, (msg) ->
+    if msg.message.user.id is robot.name
+      return
+
+    showAliases msg, (text) ->
+      msg.send(text)
+
+  robot.respond /puppetdb add alias (.*) (.*)/i, (msg) ->
+    if msg.message.user.id is robot.name
+      return
+
+    setAlias msg, msg.match[1], msg.match[2], (text) ->
+      msg.send(text)
+
+  robot.respond /puppetdb clear alias (.*)/i, (msg) ->
+    if msg.message.user.id is robot.name
+      return
+
+    clearAlias msg, msg.match[1], (text) ->
+      msg.send(text)


Adding `sloth me` command.

Adding `sloth me` command.

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

--- src/scripts/sloth-me.coffee
+++ src/scripts/sloth-me.coffee
@@ -0,0 +1,55 @@
+# Description:
+#   Sends a sloth image URL
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   sloth me - Sends a sloth image URL
+#
+# Author:
+#   NickPresta
+
+sloths = [
+  'http://i.imgur.com/p9HSmyR.jpg'
+  'http://i.imgur.com/QLy8flr.jpg'
+  'http://i.imgur.com/7asAJqw.jpg'
+  'http://i.imgur.com/WHuyNUx.jpg'
+  'http://i.imgur.com/stZo0zl.png'
+  'http://i.imgur.com/bLJwgCN.jpg'
+  'http://i.imgur.com/7MgspTH.jpg'
+  'http://i.imgur.com/BqJpzvF.jpg'
+  'http://i.imgur.com/txjUeA1.jpg'
+  'http://i.imgur.com/cZ6GDFY.jpg'
+  'http://i.imgur.com/6oZxYI9.jpg'
+  'http://i.imgur.com/5OHdllr.jpg'
+  'http://i.imgur.com/M7q1qzi.png'
+  'http://i.imgur.com/FRrN5tX.jpg'
+  'http://i.imgur.com/og36bRg.jpg'
+  'http://i.imgur.com/uSg8rgi.png'
+  'http://i.imgur.com/MXZ9mFr.jpg'
+  'http://i.imgur.com/aztmlwT.jpg'
+  'http://i.imgur.com/lIG1itA.png'
+  'http://i.imgur.com/RRZyJYF.jpg'
+  'http://i.imgur.com/VGxvMur.png'
+  'http://i.imgur.com/egJKThb.jpg'
+  'http://i.imgur.com/imABby8.jpg'
+  'http://i.imgur.com/ySbRRiA.jpg'
+  'http://i.imgur.com/HJ5ixut.jpg'
+  'http://i.imgur.com/JoKTB9s.jpg'
+  'http://i.imgur.com/tm5XmVS.jpg'
+  'http://i.imgur.com/1iiahIU.jpg'
+  'http://i.imgur.com/KiXxNhN.jpg'
+  'http://i.imgur.com/QLXBeOX.jpg'
+  'http://i.imgur.com/epfD9ps.png'
+  'http://i.imgur.com/C975XnF.jpg'
+  'http://i.imgur.com/7rz0Bll.jpg'
+  'http://i.imgur.com/Mtl0pTt.jpg'
+]
+
+module.exports = (robot) ->
+  robot.hear /sloth me/i, (msg) ->
+    msg.send msg.random sloths


[codegen] Less return do's

[codegen] Less return do's

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


added test/stock-content-provider

added test/stock-content-provider

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

--- test/stock-content-provider.coffee
+++ test/stock-content-provider.coffee
@@ -0,0 +1,25 @@
+
+expect = require('chai').expect
+
+fs = require 'fs'
+
+{ StockContentProvider } = require './../index.coffee'
+
+describe 'class StockContentProvider', ->
+
+  describe 'methods', ->
+
+    stockContentProvider1 = new StockContentProvider
+
+    describe '#getContent()', ->
+
+      fn = stockContentProvider1.getContent
+
+      it 'existance', ->
+
+        expect(stockContentProvider1).to.have.property('getContent').that.is.a('function')
+
+      it.skip 'input-output sets', ->
+
+        # expect(fn()).to.deep.equal { encoding: 'utf8', prefix: '@', postfix: '', contentProvider:null }
+


Update psf.cson

Update psf.cson

Add version + revert type to before:build

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/jakhu/retis-tester-1.git/'


Display a cached copy of a page if available before fetching its replacement

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -10,11 +10,18 @@
 xhr            = null

-fetchReplacement = (url) ->
+fetch = (url) ->
   rememberReferer()
   cacheCurrentPage()
   reflectNewUrl url

+  if cachedPage = pageCache[url]
+    fetchHistory cachedPage
+    fetchReplacement url
+  else
+    fetchReplacement url, resetScrollPosition
+
+fetchReplacement = (url, onLoadFunction = =>) ->
   triggerEvent 'page:fetch', url: url

   xhr?.abort()
@@ -29,7 +36,7 @@
     if doc = processResponse()
       changePage extractTitleAndBody(doc)...
       reflectRedirectedUrl()
-      resetScrollPosition()
+      onLoadFunction()
       triggerEvent 'page:load'
     else
       document.location.href = url
@@ -40,7 +47,6 @@
   xhr.send()

 fetchHistory = (cachedPage) ->
-  cacheCurrentPage()
   xhr?.abort()
   changePage cachedPage.title, cachedPage.body
   recallScrollPosition cachedPage
@@ -282,6 +288,7 @@
 installHistoryChangeHandler = (event) ->
   if event.state?.turbolinks
     if cachedPage = pageCache[event.state.url]
+      cacheCurrentPage()
       fetchHistory cachedPage
     else
       visit event.target.location.href
@@ -317,7 +324,7 @@
   installJqueryAjaxSuccessPageUpdateTrigger()

 if browserSupportsTurbolinks
-  visit = fetchReplacement
+  visit = fetch
   initializeTurbolinks()
 else
   visit = (url) -> document.location.href = url


Reflect url immediately upon visit. No need to call rememberCurrentUrl() on xhr.abort

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -13,6 +13,8 @@
 fetchReplacement = (url) ->
   rememberReferer()
   cacheCurrentPage()
+  reflectNewUrl url
+
   triggerEvent 'page:fetch', url: url

   xhr?.abort()
@@ -25,7 +27,6 @@
     triggerEvent 'page:receive'

     if doc = processResponse()
-      reflectNewUrl url
       changePage extractTitleAndBody(doc)...
       reflectRedirectedUrl()
       resetScrollPosition()
@@ -34,7 +35,6 @@
       document.location.href = url

   xhr.onloadend = -> xhr = null
-  xhr.onabort   = -> rememberCurrentUrl()
   xhr.onerror   = -> document.location.href = url

   xhr.send()


rm coffee

rm coffee

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

--- test/tests.coffee
+++ test/tests.coffee
@@ -0,0 +1,129 @@
+query = require("../coffee/index")
+assert = require("assert")
+
+describe "Query", ->
+  describe "#OR /?name=+", ->
+    it "should return { name: { '$exists': true } }",->
+      opt = query name:'+'
+      assert.equal  true, opt.conditions.name['$exists']
+
+  describe "#OR /?name=-", ->
+    it "should return { name: { '$exists': false } }",->
+      opt = query name:'-'
+      assert.equal  false, opt.conditions.name['$exists']
+
+
+
+  describe "#OR /?or='name=3,test=4", ->
+    it "should return { '$or': [ { name: '3' }, { test: [Object] } ] }", ->
+      opt = query "or":'name=3,test=!4'
+      # console.log opt.conditions
+      assert.equal  3, opt.conditions['$or'][0].name
+      assert.equal  4, opt.conditions['$or'][1].test['$ne']
+
+#   # $AND
+#   # /?or='name=3,test=4'
+
+  describe "#AND /?and='name=3,test=!4", ->
+    it "should return { '$and': [ { name: '3' }, { test: [Object] } ] }", ->
+      opt = query "and":'name=3,test=!4'
+      assert.equal  3, opt.conditions['$and'][0].name
+      assert.equal  4, opt.conditions['$and'][1].test['$ne']
+
+
+  ###
+  # Sort
+  ###
+  # /api/item?order=name
+  describe "#SORT order=name", ->
+    it "should return options: order: name: 1", ->
+      opt = query order:"name"
+      assert.equal  1, opt.options.sort.name
+
+#   # /api/item?order=-name
+  describe "#SORT order=-name", ->
+    it "should return options: order: name: 1", ->
+      opt = query order:"-name"
+      # console.log opt
+      assert.equal  -1, opt.options.sort.name
+
+  ###
+  # Limit
+  ###
+  # /api/item?limit=50&skip=50
+  describe "#LIMIT limit=50 &skip=100", ->
+    it "should return options: {limit: 50, skip:100}", ->
+      opt = query
+        limit: 50
+        skip: 100
+      assert.equal  50, opt.options.limit
+      assert.equal  100, opt.options.skip
+
+
+  ###
+  #
+  # Evaluation Query Operators
+  #
+  ###
+  describe "#REGEX name=~test", ->
+    it "should return conditions: name: $regex: 'test'", ->
+      opt = query name:"~test"
+      # console.log opt
+      assert.equal  'test', opt.conditions.name["$regex"]
+  ###
+  #
+  #   Comparison Query Operators
+  #
+  ###
+  describe "#EQ name=test", ->
+    it "should return { conditions: name:'test',  options: { limit: 25, skip: 0 }}", ->
+      opt = query name:"test"
+      assert.equal  'test', opt.conditions.name
+#       assert.equal 25, opt.options.limit
+#       assert.equal 0, opt.options.skip
+
+
+  describe "#NEQ name=!test", ->
+    it "should return { conditions: 'name:$ne:test'", ->
+      opt = query name:"!test"
+      assert.equal  'test', opt.conditions.name["$ne"]
+
+  describe "#GT name=>3", ->
+    it "should return { conditions: { name: { '$gt': '3' } }", ->
+      opt = query name:">3"
+      # console.log opt
+      assert.equal  3, opt.conditions.name["$gt"]
+
+  describe "#GTE name=]3", ->
+    it "should return { conditions: { name: { '$gte': '3' } }", ->
+      opt = query name:"]3"
+      # console.log opt
+      assert.equal  3, opt.conditions.name['$gte']
+
+  describe "#LT name=<3", ->
+    it "should return { conditions: { name: { '$lt': '3' } }", ->
+      opt = query name:"<3"
+      # console.log opt
+      assert.equal  3, opt.conditions.name['$lt']
+
+  describe "#LTE name=<3", ->
+    it "should return { conditions: { name: { '$lte': '3' } }", ->
+      opt = query name:"[3"
+      # console.log opt
+      assert.equal  3, opt.conditions.name['$lte']
+
+  describe "#IN name=@1|2|3", ->
+    it "should return conditions: $in: ['1','2','3'] ", ->
+      opt = query name:"@1|2|3"
+      # console.log opt
+      assert.equal 1, opt.conditions.name['$in'][0]
+      assert.equal 2, opt.conditions.name['$in'][1]
+      assert.equal 3, opt.conditions.name['$in'][2]
+
+  describe "#NIN name=#1|2|3", ->
+    it "should return conditions: $in: ['1','2','3'] ", ->
+      opt = query name:"#1|2|3"
+      # console.log opt
+      assert.equal 1, opt.conditions.name['$nin'][0]
+      assert.equal 2, opt.conditions.name['$nin'][1]
+      assert.equal 3, opt.conditions.name['$nin'][2]


Fix little bug

Fix little bug

--- packages/rocketchat-wordpress/common.coffee
+++ packages/rocketchat-wordpress/common.coffee
@@ -16,5 +16,5 @@
 	Meteor.startup ->
 		Tracker.autorun ->
 			if RocketChat.settings.get 'API_Wordpress_URL'
-				config.serverURL = value
+				config.serverURL = RocketChat.settings.get 'API_Wordpress_URL'
 				WordPress.configure config


add journal list to required fields

add journal list to required fields

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


rotation tests

rotation tests

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


Initiate thermonuclear reaction

Initiate thermonuclear reaction

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

--- app/js/native.coffee
+++ app/js/native.coffee
@@ -0,0 +1,2 @@
+# Hook for top secret native app. Ssshhh, don't tell anyone.
+window.require && require('native')


Preload view should have correct id

Preload view should have correct id

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


FinderContextMenuController: fix the menu item views

--- client/ide/filetree/controllers/findercontextmenucontroller.coffee
+++ client/ide/filetree/controllers/findercontextmenucontroller.coffee
@@ -167,7 +167,7 @@

     {nickname} = KD.whoami().profile

-    if fileData.path is "/home/#{nickname}/Applications"
+    if ///\/home\/#{nickname}\/Applications$///.test fileData.path
       items.Refresh.separator         = yes
       items["Make a new Application"] =
         action : "makeNewApp"
@@ -176,19 +176,11 @@
     if fileData.getExtension() is "kdapp"
       items.Refresh.separator   = yes
       items['Application menu'] =
-        children                  :
-          Compile                 :
-            action                : "compile"
-          Run                     :
-            action                : "runApp"
-            separator             : yes
-          "Download source files" :
-            action                : "downloadApp"
-
-      if KD.checkFlag('app-publisher') or KD.checkFlag('super-admin')
-        items['Application menu'].children["Download source files"].separator = yes
-        items['Application menu'].children["Publish to app catalog"] =
-          action : "publish"
+        children                   :
+          Compile                  :
+            action                 : "compile"
+          "Publish to app catalog" :
+            action                 : "publish"

     return items


Match only exact excape keywords, e.g. in but not sin, arcsin

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


activity: add idempotent addItem support for activitylistcontroller

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


Adding new feedback view tests

Adding new feedback view tests

error: pathspec 'cms/static/coffee/spec/views/feedback_spec.coffee' did not match any file(s) known to git

--- cms/static/coffee/spec/views/feedback_spec.coffee
+++ cms/static/coffee/spec/views/feedback_spec.coffee
@@ -0,0 +1,30 @@
+describe "CMS.Views.SystemFeedback", ->
+  beforeEach ->
+    setFixtures(sandbox({id: "page-notification"}))
+    # CMS.Views.SystemFeedback looks for a template on the page when the code
+    # is loaded, and even if we set that template on the page using a fixture,
+    # CMS.Views.SystemFeedback has already been loaded, and so that template
+    # won't be picked up. This is a dirty hack, to load that template into
+    # the code after the code has been loaded already.
+    CMS.Views.SystemFeedback.prototype.template = _.template """
+
<%= title %>

+
<%= message %>

+    """
+
+    @model = new CMS.Models.ConfirmationMessage({
+      "title": "Portal"
+      "message": "Welcome to the Aperture Science Computer-Aided Enrichment Center"
+    })
+    # it will be interesting to see when this.render is called, so lets spy on it
+    spyOn(CMS.Views.SystemFeedback.prototype, 'render').andCallThrough()
+
+  it "renders on initalize", ->
+    view = new CMS.Views.Notification({model: @model})
+    expect(view.render).toHaveBeenCalled()
+
+  it "renders the template", ->
+    view = new CMS.Views.Notification({model: @model})
+    text = view.$el.text()
+    expect(text).toMatch(/Portal/)
+    expect(text).toMatch(/Aperture Science/)
+


Disabling particles for now until performance can be fixed.

--- app/models/User.coffee
+++ app/models/User.coffee
@@ -125,6 +125,7 @@

   getForeshadowsLevels: ->
     return @foreshadowsLevels if @foreshadowsLevels?
+    return false  # bad performance problems, reenable later
     group = me.get('testGroupNumber') % 16
     @foreshadowsLevels = switch group
       when 0, 1, 2, 3, 4, 5, 6, 7 then true


Added an endpoint for loading all items.

--- server/levels/thangs/thang_type_handler.coffee
+++ server/levels/thangs/thang_type_handler.coffee
@@ -26,4 +26,16 @@
   hasAccess: (req) ->
     req.method is 'GET' or req.user?.isAdmin()

+  get: (req, res) ->
+    if req.query.view is 'items'
+      projection = {}
+      if req.query.project
+        projection[field] = 1 for field in req.query.project.split(',')
+      ThangType.find({ 'kind': 'Item' }, projection).exec (err, documents) =>
+        return @sendDatabaseError(res, err) if err
+        documents = (@formatEntity(req, doc) for doc in documents)
+        @sendSuccess(res, documents)
+    else
+      super(arguments...)
+
 module.exports = new ThangTypeHandler()


maintitle for #381

maintitle for #381

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


Added a task list (TODOs) to Hubot

Added a task list (TODOs) to Hubot

hubot add task
hubot list tasks
hubot delete task <task number>

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

--- src/scripts/tasks.coffee
+++ src/scripts/tasks.coffee
@@ -0,0 +1,49 @@
+# Allows tasks (TODOs) to be added to Hubot
+#
+# task add <task> - Add a task
+# task list tasks - List the tasks
+# task delete <task number> - Delete a task
+#
+
+class Tasks
+  constructor: (@robot) ->
+    @cache = []
+    @robot.brain.on 'loaded', =>
+      if @robot.brain.data.tasks
+        @cache = @robot.brain.data.tasks
+  nextTaskNum: ->
+    maxTaskNum = if @cache.length then Math.max.apply(Math,@cache.map (n) -> n.num) else 0
+    maxTaskNum++
+    maxTaskNum
+  add: (taskString) ->
+    task = {num: @nextTaskNum(), task: taskString}
+    @cache.push task
+    @robot.brain.data.tasks = @cache
+    task
+  all: -> @cache
+  deleteByNumber: (num) ->
+    index = @cache.map((n) -> n.num).indexOf(parseInt(num))
+    task = @cache.splice(index, 1)[0]
+    @robot.brain.data.tasks = @cache
+    task
+
+module.exports = (robot) ->
+  tasks = new Tasks robot
+
+  robot.respond /(task add|add task) (.+?)$/i, (msg) ->
+    task = tasks.add msg.match[2]
+    msg.send "Task added: ##{task.num} - #{task.task}"
+
+  robot.respond /(task list|list tasks)/i, (msg) ->
+    if tasks.all().length > 0
+      response = ""
+      for task, num in tasks.all()
+        response += "##{task.num} - #{task.task}\n"
+      msg.send response
+    else
+      msg.send "There are no tasks"
+
+  robot.respond /(task delete|delete task) #?(\d+)/i, (msg) ->
+    taskNum = msg.match[2]
+    task = tasks.deleteByNumber taskNum
+    msg.send "Task deleted: ##{task.num} - #{task.task}"


fix config loading issue when config does not exist

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


http://b6n.tumblr.com quote script

http://b6n.tumblr.com quote script

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

--- src/scripts/b6n.coffee
+++ src/scripts/b6n.coffee
@@ -0,0 +1,35 @@
+# SHIT BEN BLACK SAYS
+# A footnote to "Distributed Systems: A Compendium of Problems Enumerated by Benjamin Black."
+# http://b6n.tumblr.com/
+#
+# ask b6n - Answer with random wizdom from Benjamin Black
+module.exports = (robot) ->
+    robot.hear /ask b6n/i, (msg) ->
+        quotes = ["reading is fundamental",
+        "apparently it’s a bad idea to run a large database on a handful of puny rackspace cloud instances.\nwho knew?",
+        "totally resharded",
+        "that’s not an error, not finding php is an indication things are as they should be",
+        "swap mostly poop",
+        "i leave you to your overthinking",
+        "i have no idea what you think you are measuring at this point\nyou are running riak in a way that is neither the way it was intended to run nor the way you intend to run it.",
+        "yeah, so, if you could never say \"shard\" again in the context of a dynamo system that’d be awesome",
+        "that’s not scale, that’s a rails app.",
+        "right, i see your problem now. you are doing soemthing terrible.",
+        "yes, many things can be done with enough of the right code\nbut resources are finite\ndirectly accessing a database from the front end app like that is just poor practice. put a service in front of it that exposes an app-appropriate interface (NOT a native db interface)\nas needed, swap out backend\nas needed, scale out that layer"
+        "the code provided with cassandra works. yours doesn’t. ergo, the problem is in your code.",
+        "what i said is either do it properly or not at all.",
+        "you didn’t just believe some bullshit in techcrunch, did you?",
+        "you put an APP written in a REAL LANGUAGE in front of the data store\nit exposes an interface specific to your FRONT END",
+        "meanwhile, back in reality: use the right tool for the job.",
+        "as much as i would enjoy talking in contradictory circles with you, i am out of power",
+        "somebody should remind php that hashes and void pointers do not a type system make.",
+        "sorry, i’m lost\nyou have no idea what the real problem is, you don’t know what the architecture is, you don’t know what storage you will need, but you know you are starting with 4 nodes.",
+        "scale breaks everything.",
+        "thrift is crap.",
+        "so\nagain\nwhat's confusing you",
+        "you’re already wrong, but do go on.",
+        "*facepalm*",
+        "i have no constructive response for you.",
+        "i’d ask why but i don’t care",
+        "if you aren’t willing to read documentation and sample code then there isn’t much i can do to help."]
+        msg.send msg.random quotes


implemented custom report funcitonality; requires user to annotate the desired log entries with a prefix and suffix, which must be passed in via the customLogOpts; the code will then generate a custom html report containing only the matched data entries

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/DocuSignDev/mocha-farm.git/'


Added ability to add memes to hubot while running. Also added grumpy cat.

--- src/scripts/meme_generator.coffee
+++ src/scripts/meme_generator.coffee
@@ -31,70 +31,107 @@
 #   skalnik

 module.exports = (robot) ->
-  robot.respond /Y U NO (.+)/i, (msg) ->
-    caption = msg.match[1] || ""
+  unless robot.brain.data.memes?
+    robot.brain.data.memes = [
+      {
+        regex: /(Y U NO) (.+)/i,
+        generatorID: 2,
+        imageID: 166088
+      },
+      {
+        regex: /(I DON'?T ALWAYS .*) (BUT WHEN I DO,? .*)/i,
+        generatorID: 74,
+        imageID: 2485
+      },
+      {
+        regex: /(.*)(O\s?RLY\??.*)/i,
+        generatorID: 920,
+        imageID: 117049
+      },
+      {
+        regex: /(.*)(SUCCESS|NAILED IT.*)/i,
+        generatorID: 121,
+        imageID: 1031
+      },
+      {
+        regex: /(.*) (ALL the .*)/i,
+        generatorID: 6013,
+        imageID: 1121885
+      },
+      {
+        regex: /(.*) (\w+\sTOO DAMN .*)/i,
+        generatorID: 998,
+        imageID: 203665
+      },
+      {
+        regex: /(GOOD NEWS EVERYONE[,.!]?) (.*)/i,
+        generatorID: 1591,
+        imageID: 112464
+      },
+      {
+        regex: /(NOT SURE IF .*) (OR .*)/i,
+        generatorID: 305,
+        imageID: 84688
+      },
+      {
+        regex: /(YO DAWG .*) (SO .*)/i,
+        generatorID: 79,
+        imageID: 108785
+      },
+      {
+        regex: /(ALL YOUR .*) (ARE BELONG TO US)/i,
+        generatorID: 349058,
+        imageID: 2079825
+      },
+      {
+        regex: /(.*) (FUCK YOU)/i,
+        generatorID: 1189472,
+        imageID: 5044147
+      },
+      {
+        regex: /(.*) (You'?re gonna have a bad time)/i,
+        generatorID: 825296,
+        imageID: 3786537
+      },
+      {
+        regex: /(one does not simply) (.*)/i,
+        generatorID: 274947,
+        imageID: 1865027
+      },
+      {
+        regex: /(grumpy cat) (.*),(.*)/i,
+        generatorID: 1590955,
+        imageID: 6541210
+      }
+    ]

-    memeGenerator msg, 2, 166088, "Y U NO", caption, (url) ->
-      msg.send url
+  for meme in robot.brain.data.memes
+    memeResponder robot, meme

-  robot.respond /(I DON'?T ALWAYS .*) (BUT WHEN I DO,? .*)/i, (msg) ->
-    memeGenerator msg, 74, 2485, msg.match[1], msg.match[2], (url) ->
-      msg.send url
+  robot.respond /add meme \/(.+)\/i,(.+),(.+)/i, (msg) ->
+    meme =
+      regex: new RegExp(msg.match[1], "i")
+      generatorID: parseInt(msg.match[2])
+      imageID: parseInt(msg.match[3])

-  robot.respond /(.*)(O\s?RLY\??.*)/i, (msg) ->
-    memeGenerator msg, 920, 117049, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(.*)(SUCCESS|NAILED IT.*)/i, (msg) ->
-    memeGenerator msg, 121, 1031, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(.*) (ALL the .*)/i, (msg) ->
-    memeGenerator msg, 6013, 1121885, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(.*) (\w+\sTOO DAMN .*)/i, (msg) ->
-    memeGenerator msg, 998, 203665, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(GOOD NEWS EVERYONE[,.!]?) (.*)/i, (msg) ->
-    memeGenerator msg, 1591, 112464, msg.match[1], msg.match[2], (url) ->
-      msg.send url
+    robot.brain.data.memes.push meme
+    memeResponder robot, meme

   robot.respond /k(?:ha|ah)nify (.*)/i, (msg) ->
     memeGenerator msg, 6443, 1123022, "", khanify(msg.match[1]), (url) ->
-      msg.send url
-
-  robot.respond /(NOT SURE IF .*) (OR .*)/i, (msg) ->
-    memeGenerator msg, 305, 84688, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(YO DAWG .*) (SO .*)/i, (msg) ->
-    memeGenerator msg, 79, 108785, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(ALL YOUR .*) (ARE BELONG TO US)/i, (msg) ->
-    memeGenerator msg, 349058, 2079825, msg.match[1], msg.match[2], (url) ->
       msg.send url

   robot.respond /(IF .*), ((ARE|CAN|DO|DOES|HOW|IS|MAY|MIGHT|SHOULD|THEN|WHAT|WHEN|WHERE|WHICH|WHO|WHY|WILL|WON\'T|WOULD)[ \'N].*)/i, (msg) ->
     memeGenerator msg, 17, 984, msg.match[1], msg.match[2] + (if msg.match[2].search(/\?$/)==(-1) then '?' else ''), (url) ->
       msg.send url

-  robot.respond /(.*) FUCK YOU/i, (msg) ->
-    memeGenerator msg, 1189472, 5044147, msg.match[1], 'FUCK YOU', (url) ->
-      msg.send url
-
   robot.respond /((Oh|You) .*) ((Please|Tell) .*)/i, (msg) ->
     memeGenerator msg, 542616, 2729805, msg.match[1], msg.match[3], (url) ->
       msg.send url

-  robot.respond /(.*) (You'?re gonna have a bad time)/i, (msg) ->
-    memeGenerator msg, 825296, 3786537, msg.match[1], msg.match[2], (url) ->
-      msg.send url
-
-  robot.respond /(one does not simply) (.*)/i, (msg) ->
-    memeGenerator msg, 274947, 1865027, msg.match[1], msg.match[2], (url) ->
+memeResponder = (robot, meme) ->
+  robot.respond meme.regex, (msg) ->
+    memeGenerator msg, meme.generatorID, meme.imageID, msg.match[1], msg.match[2], (url) ->
       msg.send url

 memeGenerator = (msg, generatorID, imageID, text0, text1, callback) ->


Update jQlone to use HTTPS

Update jQlone to use HTTPS

--- headless_client/jQlone.coffee
+++ headless_client/jQlone.coffee
@@ -9,14 +9,14 @@

 # Non-standard jQuery stuff. Don't use outside of server.
 $._debug = false
-$._server = 'http://direct.codecombat.com'
+$._server = 'https://direct.codecombat.com'
 $._cookies = request.jar()

 $.when = Deferred.when
 $.ajax = (options) ->
   responded = false
   url = options.url
-  if url.indexOf('http')
+  if url.indexOf('https')
     url = '/' + url unless url[0] is '/'
     url = $._server + url

@@ -31,7 +31,7 @@
     method: options.type
     body: data
     , (error, response, body) ->
-      console.log 'HTTP Request:' + JSON.stringify options if $._debug and not error
+      console.log 'HTTPS Request:' + JSON.stringify options if $._debug and not error
       if responded
         console.log '\t↳Already returned before.' if $._debug
         return


Message improvement

Message improvement

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


Automatically select first file when importing

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


add coffee tests

add coffee tests

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


Tests: KDData: initial tests

Tests: KDData: initial tests

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

--- test/core/data.coffee
+++ test/core/data.coffee
@@ -0,0 +1,40 @@
+should = require 'should'
+sinon = require 'sinon'
+shouldSinon = require 'should-sinon'
+KDData = require '../../lib/core/data'
+
+
+describe 'KDData', ->
+  it 'exists', ->
+    KDData.should.exist
+
+  describe 'constructor', ->
+    beforeEach ->
+      @instance = new KDData
+
+    it 'should create __proxy__ holder', ->
+      @instance.__proxy__.should.exist
+
+  describe 'update', ->
+
+    it 'should emit update on object data change', ->
+
+      instance = new KDData {}
+
+      spy = sinon.spy instance.__proxy__.emit
+      listener = -> yes
+      instance.__proxy__.on 'update', listener
+      instance.foo = 'bar'
+
+      spy.should.be.calledOnce
+
+    it 'should emit update on array data change', ->
+
+      instance = new KDData []
+
+      spy = sinon.spy instance.__proxy__.emit
+      listener = -> yes
+      instance.__proxy__.on 'update', listener
+      instance.push 'bar'
+
+      spy.should.be.calledOnce


New test file

New test file

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

--- test_all_types.coffee
+++ test_all_types.coffee
@@ -0,0 +1,10 @@
+V1Meta = require('./v1meta').V1Meta
+
+v1 = new V1Meta()
+
+v1.for_all_types (err, types) ->
+    for type in types
+        i = new type('id')
+        console.log i
+        console.log i._v1_ops
+


[codegen] Abstract code-generation of function bodies

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


Jarvis learns about life

Jarvis learns about life

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/dphaener/suburban-jarvis.git/'


dont hardcode username

dont hardcode username

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


show current time as default date to aid the user

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


Removed development mode settings for memory stimuli

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


Wired up more translations and new animal and food pairings.


Unbinding and hiding the recall next button in memory screens


Added backbone models for teams

Added backbone models for teams

[#75690346]

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


atom projects root paths now unique

atom projects root paths now unique

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


[atom]: added git-control, git-time-machine to packages 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/InsaneViku/dotfiles.git/'


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


atom: remove std::endl from C++, more latex and go

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


fix(sound notifications): fix weird sound behaviour

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


Whitespace

Whitespace

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


Configures script task

Configures script task

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

--- grunt/workflow.coffee
+++ grunt/workflow.coffee
@@ -0,0 +1,4 @@
+module.exports = (grunt) ->
+  grunt.registerTask 'script', [
+    'mochaTest'
+  ]


Increase click area

Increase click area

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/tamino-martinius/colourco.de.git/'


Add odometer coffee shell

Add odometer coffee shell

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


added basic variables for a schema

added basic variables for a schema

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


Add first application feature spec

Add first application feature spec

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

--- docs/app/src/application_feature.spec.coffee
+++ docs/app/src/application_feature.spec.coffee
@@ -0,0 +1,16 @@
+describe.only 'Docs', ->
+
+  it 'should load the api template if we change the state', ->
+
+    angular.mock.module ($provide) ->
+      $provide.value 'pagesData', {}
+
+    angular.mock.module 'EventricDocs'
+
+    angular.mock.inject ($state, $rootScope, $compile) ->
+      $state.go 'api'
+
+      $scope = $rootScope.$new()
+      $viewElement = $compile('

')($scope)
+
+      expect($viewElement.find('.api').length).to.equal 1


fixed scoping bug in showTasks()

fixed scoping bug in showTasks()


Added missing method for SchemaUtils.

Added missing method for SchemaUtils.

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


Add post and get by id.

Add post and get by id.

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


[Client][Activity] Handle to field in options if exists

--- workers/social/lib/social/models/messages/statusupdate/index.coffee
+++ workers/social/lib/social/models/messages/statusupdate/index.coffee
@@ -112,12 +112,12 @@
         if err then return callback {error: "Not allowed to open this group"}
         else callback null, group

-  # done
   @fetchGroupActivity = secure (client, options, callback)->
     @getCurrentGroup client, (err, group)=>
       if err then return callback err
-
-      selector = {}
+      {to} = options
+      to = if to then new Date(to)  else new Date()
+      selector = {'meta.createdAt' : "$lt" : to }

       options.sort = 'meta.createdAt' : -1
       options.limit or= 20
@@ -125,7 +125,6 @@
         return callback err if err
         @decorateResults data, callback

-  # done
   @fetchProfileFeed = secure (client, options, callback)->
     {connection:{delegate}, context:{group}} = client

@@ -139,7 +138,6 @@
       return callback err if err
       @decorateResults data, callback

-  # done
   @fetchTopicFeed = secure (client, selector={}, options={}, callback)->
     topicId = selector.tagId or "526ee3ef5647f9bb44000040"
     {context:{group}} = client


Added hook into res.writeHead for debugging

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/Postmedia/connect-esi.git/'


config: fix bug in running go worker tests

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


Move point where input box is disabled

Move point where input box is disabled

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


bug: still working on sendgrid email

bug: still working on sendgrid email

 On branch master
	modified:   nodejs_server/lib/mail.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/'


Update configuration

Update configuration

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


Update configuration

Update configuration


add github-account-map.coffee for remember who's who in GitHub.

error: pathspec 'scripts/github-account-map.coffee' did not match any file(s) known to git

--- scripts/github-account-map.coffee
+++ scripts/github-account-map.coffee
@@ -0,0 +1,40 @@
+# Description:
+#   GitHub Account Map allows you to map your user against your GitHub user.
+#   This is specifically in order to work with apps that have GitHub Oauth users.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot GitHub アカウント一覧 - List all the users with github logins tracked by Hubot
+#   hubot わたしはGitHubでは`nagachika`です - map your user to the github login `nagachika`
+#   hubot わたしのGitHubアカウントは? - reveal your mapped github login
+#
+# Author:
+#   nagachika
+
+module.exports = (robot) ->
+
+  robot.respond /GitHub\s*(ユーザー?|アカウント)一覧$/i, (msg) ->
+    theReply = "GitHubアカウント一覧です:\n"
+
+    for own key, user of robot.brain.users()
+      if user.githubLogin
+        theReply += "@#{user.name} → #{user.githubLogin}\n"
+
+    msg.send theReply
+
+  robot.respond /(わたし|私|僕|オレ|おれ|俺)\s*(は|の)\s*GitHub\s*(では|アカウントは?)\s*([a-z0-9-]+)\s*(です)?$/i, (msg) ->
+    githubLogin = msg.match[4]
+    msg.message.user.githubLogin = githubLogin
+    msg.send "@#{msg.message.user.name} の GitHub でのアカウントは #{githubLogin} ですね: https://github.com/#{githubLogin}"
+
+  robot.respond /(わたし|私|僕|オレ|おれ|俺)\s*(は|の)\s*GitHub\s*アカウント(は?\?)?\s*$/i, (msg) ->
+    user = msg.message.user
+    if user.githubLogin
+      msg.reply "@#{msg.message.user.name} の GitHub でのアカウントは #{user.githubLogin} です https://github.com/#{user.githubLogin}"
+    else
+      msg.reply "すみません、@#{msg.message.user.name} の GitHub アカウントはまだ知りません"


Use youtube-dl in download

Use youtube-dl in download

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/Hiroto-K/MP3-Downloader.git/'


Import the search cities module

Import the search cities module

error: pathspec 'app/assets/javascripts/neighborly/modules/search-cities.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/neighborly/modules/search-cities.js.coffee
+++ app/assets/javascripts/neighborly/modules/search-cities.js.coffee
@@ -0,0 +1,68 @@
+Neighborly.SearchCities = (searchInputSelctor, mapCanvasSelector) ->
+  searchInputSelctor = '.search-cities-with-google'  if typeof searchInputSelctor is 'undefined'
+  mapCanvasSelector = '.map-canvas'  if typeof mapCanvasSelector is 'undefined'
+  searchInput = $(searchInputSelctor)[0]
+  mapCanvas = $(mapCanvasSelector)[0]
+  mapOptions =
+    center: new google.maps.LatLng(37.09024, -95.712891)
+    zoom: 3
+    disableDefaultUI: true
+    mapTypeId: google.maps.MapTypeId.ROADMAP
+
+  autocomplete = new google.maps.places.Autocomplete(searchInput,
+    types: ['(cities)']
+    componentRestrictions:
+      country: 'us'
+  )
+  map = new google.maps.Map(mapCanvas, mapOptions)
+  marker = new google.maps.Marker(map: map)
+  placeChanged = ->
+    $(searchInput).removeClass 'error'
+    place = autocomplete.getPlace()
+    unless place.geometry
+
+      # Inform the user that the place was not found and return.
+      $(searchInput).addClass 'error'
+      return
+
+    # If the place has a geometry, then present it on a map.
+    if place.geometry.viewport
+      map.fitBounds place.geometry.viewport
+    else
+      map.setCenter place.geometry.location
+      map.setZoom 17 # Why 17? Because it looks good.
+
+    marker.setIcon (
+      url: $('.pin-img').data('image-url')
+      size: new google.maps.Size(71, 71)
+      origin: new google.maps.Point(0, 0)
+      anchor: new google.maps.Point(17, 34)
+      scaledSize: new google.maps.Size(35, 35)
+    )
+    marker.setPosition place.geometry.location
+    marker.setVisible true
+    false
+
+  initializer = ->
+    autocomplete.bindTo 'bounds', map
+    google.maps.event.addListener autocomplete, 'place_changed', placeChanged
+    $(searchInput).keydown (event) ->
+      if event.keyCode is 13
+        event.preventDefault()
+        false
+
+    if $('.address-coordinates').data('longitude') isnt `undefined` and $('.address-coordinates').data('latitude') isnt `undefined`
+      lat_lng = new google.maps.LatLng($('.address-coordinates').data('latitude'), $('.address-coordinates').data('longitude'))
+      map.setCenter lat_lng
+      map.setZoom 12
+      marker.setIcon (
+        url: $('.pin-img').data('url')
+        size: new google.maps.Size(71, 71)
+        origin: new google.maps.Point(0, 0)
+        anchor: new google.maps.Point(17, 34)
+        scaledSize: new google.maps.Size(35, 35)
+      )
+      marker.setPosition lat_lng
+      marker.setVisible true
+
+  initializer()


Add event docs and change `id` to `key`.

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


onComplete: log headers and json

onComplete: log headers and json

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


fix for webterm error. We don't create any error popup not to be annoying. User can handle the error.

--- client/landing/app/Applications/WebTerm.kdapplication/AppView.coffee
+++ client/landing/app/Applications/WebTerm.kdapplication/AppView.coffee
@@ -127,7 +127,8 @@
         sizeY  : @terminal.sizeY
     , (err, remote) =>
       if err
-        log err
+        # We don't create any error popup not to be annoying. User can handle the error.
+        error err
       else
         @terminal.server = remote
         remote.setSize @terminal.sizeX, @terminal.sizeY # might have changed in the meantime


:memo: Mention atom.deserializers global

--- src/atom.coffee
+++ src/atom.coffee
@@ -23,6 +23,7 @@
 #  * `atom.clipboard`     - A {Clipboard} instance
 #  * `atom.config`        - A {Config} instance
 #  * `atom.contextMenu`   - A {ContextMenuManager} instance
+#  * `atom.deserializers` - A {DeserializerManager} instance
 #  * `atom.keymap`        - A {Keymap} instance
 #  * `atom.menu`          - A {MenuManager} instance
 #  * `atom.packages`      - A {PackageManager} instance


tag-itのhtml対象idを指定

tag-itのhtml対象idを指定

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

--- app/assets/javascripts/staff/tag-it.js.coffee
+++ app/assets/javascripts/staff/tag-it.js.coffee
@@ -0,0 +1,2 @@
+$(document).on 'ready page:load', ->
+  $("#tag-it").tagit()


Fixed #1039

Fixed #1039

--- app/views/editor/level/thangs_tab_view.coffee
+++ app/views/editor/level/thangs_tab_view.coffee
@@ -194,7 +194,7 @@
     return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id
     @surface.camera.dragDisabled = true
     {stageX, stageY} = e.originalEvent
-    wop = @surface.camera.canvasToWorld x: stageX, y: stageY
+    wop = @surface.camera.screenToWorld x: stageX, y: stageY
     wop.z = @selectedExtantThang.depth / 2
     @adjustThangPos @selectedExtantSprite, @selectedExtantThang, wop
     [w, h] = [@surface.camera.canvasWidth, @surface.camera.canvasHeight]
@@ -320,7 +320,7 @@

   onSurfaceMouseMoved: (e) ->
     return unless @addThangSprite
-    wop = @surface.camera.canvasToWorld x: e.x, y: e.y
+    wop = @surface.camera.screenToWorld x: e.x, y: e.y
     wop.z = 0.5
     @adjustThangPos @addThangSprite, @addThangSprite.thang, wop
     null


Replace 'dismiss' action with 'cancel' and 'confirm'

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


Atom packages v1

Atom packages v1

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

--- atom/packages.cson
+++ atom/packages.cson
@@ -0,0 +1,14 @@
+packages: [
+  "an-old-hope-syntax"
+  "dash"
+  "elm-format"
+  "elmjutsu"
+  "hasklig"
+  "html-to-elm"
+  "language-docker"
+  "language-elm"
+  "package-sync"
+  "pure-syntax"
+  "single-click-open"
+  "vim-mode-plus"
+]


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

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

--- test/engine_selector.coffee
+++ test/engine_selector.coffee
@@ -0,0 +1,4 @@
+module "EngineSelector"
+
+test
+module()


fixed lint

fixed lint

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


Extend pretty commit message

Extend pretty commit message

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


Changed route

Changed route

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


add token service

add token service

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

--- app/assets/javascripts/angular/services/registrytoken_service.coffee
+++ app/assets/javascripts/angular/services/registrytoken_service.coffee
@@ -0,0 +1,37 @@
+@registryadmin.service('registrytokenService',[
+  '$http'
+  "$q"
+  "$rootScope"
+  ($http,$q,$rootScope) ->
+    headers = {
+      "Accept": "application/json"
+      "X-Requested-With": 'XMLHttpRequest'
+    }
+
+
+    create_token = (bearer) ->
+
+      deferred = $q.defer()
+      authtoken = $rootScope.globals.currentUser.authdata
+      _h = angular.merge({},headers,{
+        Authorization:authtoken
+      })
+      _h['X-Requested-With']='XMLHttpRequest'
+
+      bear = bearer.split('realm=')
+      bres = bear[1].split(",")
+      _uri = bres[0].replace(/^["]+|["]+$/g,"")
+      params = bres[1]
+
+      $http.get(_uri,{headers:_h}).then(
+        (response) ->
+          deferred.resolve(response)
+        (response) ->
+          deferred.reject(response)
+      )
+      deferred.promise
+
+    {
+      create_token: create_token
+    }
+])


Update src/scripts/brewerydb.coffee

Update src/scripts/brewerydb.coffee

added description and food pairing.

--- src/scripts/brewerydb.coffee
+++ src/scripts/brewerydb.coffee
@@ -41,4 +41,8 @@
             response += "\nABV:  #{beer['abv']}%"
           if beer['ibu']?
             response += "\nIBU:  #{beer['ibu']}"
+          if beer['description']?
+            response += "\nDescription:   #{beer['description']}"
+          if beer['foodPairings']?
+            response += "\nFood Pairings:   #{beer['foodPairings']}"
           msg.send response


Key input field is automatically set

Key input field is automatically set

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


Skip element that is wrapped by a link

Skip element that is wrapped by a link

This fixes the double request being made to the same URL

--- app/assets/javascripts/tree.js.coffee
+++ app/assets/javascripts/tree.js.coffee
@@ -5,7 +5,9 @@
     # Code browser tree slider
     # Make the entire tree-item row clickable, but not if clicking another link (like a commit message)
     $(".tree-content-holder .tree-item").on 'click', (e) ->
-      if (e.target.nodeName != "A")
+      $clickedEl = $(e.target)
+
+      if not $clickedEl.is('a') and not $clickedEl.is('.str-truncated')
         path = $('.tree-item-file-name a', this).attr('href')
         Turbolinks.visit(path)


init dropdown menus and tooltips

init dropdown menus and tooltips

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

--- app/client/bootstrap/bootstrap.coffee
+++ app/client/bootstrap/bootstrap.coffee
@@ -0,0 +1,3 @@
+Template.onRendered () ->
+  $('.dropdown-toggle').dropdown()
+  $('[data-toggle="tooltip"]').tooltip()


Send range through GET when apply changes is pressed

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


Fix edit us points problem (iteration 2)

--- app/coffee/modules/userstories/detail.coffee
+++ app/coffee/modules/userstories/detail.coffee
@@ -102,6 +102,11 @@

             return us

+    loadTasks: ->
+        return @rs.tasks.list(@scope.projectId, null, @scope.usId).then (tasks) =>
+            @scope.tasks = tasks
+            return tasks
+
     loadInitialData: ->
         params = {
             pslug: @params.pslug
@@ -115,8 +120,8 @@

         return promise.then(=> @.loadProject())
                       .then(=> @.loadUsersAndRoles())
-                      .then(=> @.loadUs())
-
+                      .then(=> @q.all([@.loadUs(),
+                                       @.loadTasks()]))

     block: ->
         @rootscope.$broadcast("block", @scope.us)
@@ -195,14 +200,12 @@
             <span class="us-detail-status" style="color:<%= status.color %>"><%= status.name %>

-        <% if (showTasks) { %>

             <div class="current-progress" style="width:<%- usProgress %>%"/>

                 <%- totalClosedTasks %>/<%- totalTasks %> tasks completed

-        <% } %>

@@ -286,13 +289,8 @@
                   val = "?" if not val?
                   v.points = val

-            if $scope.tasks
-                totalTasks = $scope.tasks.length
-                totalClosedTasks = _.filter($scope.tasks, (task) => $scope.taskStatusById[task.status].is_closed).length
-                showTasks = true
-            else
-                showTasks = false
-
+            totalTasks = $scope.tasks.length
+            totalClosedTasks = _.filter($scope.tasks, (task) => $scope.taskStatusById[task.status].is_closed).length
             usProgress = 0
             usProgress = 100 * totalClosedTasks / totalTasks if totalTasks > 0
             html = template({
@@ -304,17 +302,10 @@
                 rolePoints: rolePoints
                 totalTasks: totalTasks
                 totalClosedTasks: totalClosedTasks
-                totalTasks: totalTasks
-                totalClosedTasks: totalClosedTasks
-                showTasks: showTasks
                 usProgress: usProgress
             })
             $el.html(html)
             $el.find(".status-data").append(selectionStatusTemplate({statuses:$scope.statusList}))
-
-        $scope.$watch $attrs.ngModel, (us) ->
-            if us?
-                renderUsstatus(us)

         bindOnce $scope, "tasks", (tasks) ->
             $scope.$watch $attrs.ngModel, (us) ->


Add a fade out delay for the information notification in phaser games

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


Fixing typo and removing tasks collection when last item is being processed.

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/virtdb/virtdb-googlesheet-provider.git/'


Added worker_world.coffee

Added worker_world.coffee

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

--- app/assets/javascripts/workers/worker_world.coffee
+++ app/assets/javascripts/workers/worker_world.coffee
@@ -0,0 +1,140 @@
+
+throw "Attempt to load worker_world into main window instead of web worker." if not self.importScripts or not window?
+
+self.window = self
+self.workerID = "Worker"
+
+self.logLimit = 200
+self.logsLogged = 0
+console =
+  log: ->
+    self.logsLogged += 1
+    if self.logsLogged is self.logLimit
+      self.postMessage
+        type: 'console-log'
+        args: ["Log limit " + self.logLimit + " reached; shutting up."]
+        id: self.workerID
+    else if self.logsLogged < self.logLimit
+      args = [].slice.call arguments
+      for arg in args
+        if arg and arg.constructor and (arg.constructor.className is "Thang" or arg.isComponent)
+          arg = arg.toString()
+
+      try
+        self.postMessage
+          type: 'console-log'
+          args: args
+          id: self.workerID
+
+      catch error
+        self.postMessage
+          type: 'console-log'
+          args: ["Could not post log: " + args, error.toString(), error.stack, error.stackTrace]
+          id: self.workerID
+
+
+console.error = console.info = console.log
+self.console = console
+
+importScripts '/javascripts/world.js'
+
+
+self.transferableSupported = transferableSupported = ->
+  try
+    ab = new ArrayBuffer 1
+    worker.postMessage ab, [ab]
+    return ab.byteLength is 0
+  catch error
+    return false
+  return false
+
+
+  World = self.require 'lib/world/world'
+  GoalManager = self.require 'lib/world/GoalManager'
+
+  self.runWorld = runWorld = (args) ->
+    self.postedErrors = {}
+    self.t0 = new Date()
+    self.firstWorld = args.firstWorld
+    self.postedErrors = false
+    self.logsLogged = 0
+
+    try
+      self.world = new World args.worldName, args.userCodeMap
+      if args.level
+        self.world.loadFromLevel args.level, true
+      self.goalManager = new GoalManager self.world
+      self.goalManager.setGoals args.goals
+      self.goalManager.setCode args.userCodeMap
+      self.goalManager.worldGenerationWillBegin()
+      self.world.setGoalManager self.goalManager
+    catch error
+      self.onWorldError error
+      return
+    Math.random = self.world.rand.randf
+    self.world.loadFrames self.onWorldLoaded, self.onWorldError, self.onWorldLoadProgress
+
+self.onWorldLoaded = onWorldLoaded = () ->
+  self.goalManager.worldGenerationEnded()
+  t1 = new Date()
+  diff = t1 - self.t0
+  transferableSupported = self.transferableSupported()
+  try
+    serialized = self.world.serialize()
+  catch error
+    console.log "World serialization error:", error.toString() + "\n" + error.stack or error.stackTrace
+
+
+  t2 = new Date()
+
+  try
+    if transferableSupported
+      self.postMessage(
+        type: 'new-world'
+        serialized: serialized.serializedWorld
+        goalStates: self.goalManager.getGoalStates()
+      , serialized.transferableObjects)
+    else
+      self.postMessage
+        type: 'new-world'
+        serialized: serialized.serializedWorld
+        goalStates: self.goalManager.getGoalStates()
+  catch error
+    console.log "World delivery error:", error.toString + "\n" + error.stack or error.stackTrace
+  t3 = new Date()
+  console.log "And it was so: (" + (diff / self.world.totalFrames).toFixed(3) + "ms per frame,", self.world.totalFrames, "frames)\nSimulation :"
+  self.world = null
+
+self.onWorldError = onWorldError = (error) ->
+  if error instanceof Aether.problems.UserCodeProblem
+    unless self.postedErrors[error.key]
+      problem = error.serialize()
+      self.postMessage
+        type: 'user-code-problem'
+        problem: problem
+      self.postedErrors[error.key] = problem
+
+  else
+    console.log "Non-UserCodeError:", error.toString() + "\n" + error.stack or error.stackTrace
+  return true
+
+self.onWorldLoadProgress = onWorldLoadProgress = (progress) ->
+  self.postMessage
+    type: 'world-load-progress-changed'
+    progress: progress
+
+self.abort = abort = ->
+  if self.world and self.world.name
+    console.log "About to abort:", self.world.name, typeof self.world.abort
+    self.world?.abort()
+    self.world = null
+
+  self.postMessage
+    type: 'abort'
+
+self.reportIn = reportIn = ->
+  self.postMessage
+    type: 'reportIn'
+
+self.addEventListener 'message', (event) ->
+  self[event.data.func](event.data.args)


More robust tests

More robust tests

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


Client: Activity: Added accountId argument to followChannel/unfollowChannel actions.

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


Client: Activity: Feed: Added onScroll props to PerfectScrollbar


add backbone Campaigns router

add backbone Campaigns router

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

--- app/assets/javascripts/backbone/routers/campaigns_router.js.coffee
+++ app/assets/javascripts/backbone/routers/campaigns_router.js.coffee
@@ -0,0 +1,29 @@
+class Chimpenstein.Routers.CampaignsRouter extends Backbone.Router
+  initialize: (options) ->
+
+
+  routes:
+    "step_one" : "stepOne"
+    "step_two" : "stepTwo"
+    "step_three": "stepThree"
+    ".*"        : "stepOne"
+
+  stepOne: ->
+    @view = new Chimpenstein.Views.Campaigns.StepOneView()
+    $("#campaigns").html(@view.render().el)
+
+  stepTwo: ->
+    campaigns = @campaigns = new Chimpenstein.Collections.CampaignsCollection()
+    Chimpenstein.config = @config = new Chimpenstein.Models.Config()
+    #TODO: show loading
+    Mailchimp.API.call 'campaigns', {filters: {status: "save,paused", type: 'regular'},limit: 100}, (data) ->
+      campaigns.reset data.data
+      #TODO: hide loading
+    @view = new Chimpenstein.Views.Campaigns.StepTwoView(campaigns: @campaigns, config: @config)
+    $('#campaigns').html(@view.render().el)
+
+  stepThree: ->
+    #TODO: enforce @config has pickA and pickB
+    @view = new Chimpenstein.Views.Campaigns.StepThreeView(config: @config)
+    $('#campaigns').html(@view.render().el)
+    @config.createCampaign()


updated get format

updated get format

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


Minor bugfix for freezing editor due to out of bounds frame index

--- app/lib/surface/Surface.coffee
+++ app/lib/surface/Surface.coffee
@@ -502,6 +502,7 @@
       # Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet)
       frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2
       @currentFrame += @world.frameRate / @options.frameRate if frameAdvanced and @playing
+      @currentFrame = Math.min(@currentFrame, @world.totalFrames - 1)
       newWorldFrame = Math.floor @currentFrame
       worldFrameAdvanced = newWorldFrame isnt oldWorldFrame
       if worldFrameAdvanced


Started simulator refactor

Started simulator refactor

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

--- app/lib/simulator/Simulator.coffee
+++ app/lib/simulator/Simulator.coffee
@@ -0,0 +1,270 @@
+SuperModel = require 'models/SuperModel'
+LevelLoader = require 'lib/LevelLoader'
+GoalManager = require 'lib/world/GoalManager'
+
+module.exports = class Simulator
+  constructor: ->
+    @retryDelayInSeconds = 10
+    @taskURL = "/queue/scoring"
+
+
+  fetchAndSimulateTask: =>
+    $.ajax
+      url: @taskURL
+      type: "GET"
+      error: @handleFetchTaskError
+      success: @setupSimulationAndLoadLevel
+
+  cleanupSimulation: ->
+
+
+  handleFetchTaskError: (errorData) =>
+    console.log "There were no games to score. Error: #{JSON.stringify errorData}"
+    console.log "Retrying in #{@retryDelayInSeconds}"
+    _.delay @fetchAndSimulateTask, @retryDelayInSeconds * 1000
+
+
+  setupSimulationAndLoadLevel: (taskData) =>
+    @task = new SimulationTask(taskData)
+    @superModel = new SuperModel()
+    @god = new God()
+    @levelLoader = new LevelLoader @task.getLevelName(), @superModel, @task.getFirstSessionID()
+
+    @levelLoader.once 'loaded-all', @simulateGame
+
+
+
+  simulateGame: =>
+    @assignWorldAndLevelFromLevelLoaderAndDestroyIt()
+    @setupGod()
+    try
+      @commenceSimulationAndSetupCallback()
+    catch e
+      console.log "There was an error in simulation. Trying again in #{retryDelayInSeconds} seconds"
+      console.log "Error #{e}"
+      _.delay @fetchAndSimulateTask, @retryDelayInSeconds * 1000
+
+  assignWorldAndLevelFromLevelLoaderAndDestroyIt: ->
+    @world = @levelLoader.world
+    @level = @levelLoader.level
+    @levelLoader.destroy()
+
+
+  setupGod: ->
+    @god.level = @level.serialize @supermodel
+    @god.worldClassMap = world.classMap
+    @setupGoalManager()
+    @setupGodSpells()
+
+
+  setupGoalManager: ->
+    @god.goalManager = new GoalManager @world
+    @god.goalManager.goals = @fetchGoalsFromWorldNoteChain()
+    @god.goalManager.goalStates = @manuallyGenerateGoalStates()
+
+  commenceSimulationAndSetupCallback: ->
+    @god.createWorld()
+    Backbone.Mediator.subscribeOnce 'god:new-world-created', @processResults, @
+
+
+  processResults: (simulationResults) ->
+    taskResults = @formTaskResultsObject simulationResults
+    sendResultsBackToServer taskResults
+
+  sendResultsBackToServer: (results) =>
+    $.ajax
+      url: @taskURL
+      data: results
+      type: "PUT"
+      success: @handleTaskResultsTransferSuccess
+      error: @handleTaskResultsTransferError
+      complete: @cleanupAndSimulateAnotherTask()
+
+  handleTaskResultsTransferSuccess: (result) ->
+    console.log "Task registration result: #{JSON.stringify result}"
+
+  handleTaskResultsTransferError: (error) ->
+    console.log "Task registration error: #{JSON.stringify error}"
+
+  cleanupAndSimulateAnotherTask: =>
+    @cleanupSimulation()
+    @fetchAndSimulateTask()
+
+
+
+  formTaskResultsObject: (simulationResults) ->
+    taskResults =
+      taskID: @task.getTaskID()
+      receiptHandle: @task.getReceiptHandle()
+      calculationTime: 500
+      sessions: []
+
+    for session in @task.sessions
+      sessionResult =
+        sessionID: session.sessionID
+        sessionChangedTime: session.sessionChangedTime
+        metrics:
+          rank: @calculateSessionRank session.sessionID, simulationResults.goalStates
+
+      taskResults.sessions.push sessionResult
+
+    return taskResults
+
+
+  calculateSessionRank: (sessionID, goalStates) ->
+    humansDestroyed = goalStates["destroy-humans"].status is "success"
+    ogresDestroyed = goalStates["destroy-ogres"].status is "success"
+    console.log "Humans destroyed:#{humansDestroyed}"
+    console.log "Ogres destroyed:#{ogresDestroyed}"
+    console.log "Team Session Map: #{JSON.stringify @teamSessionMap}"
+    if humansDestroyed is ogresDestroyed
+      return 0
+    else if humansDestroyed and @teamSessionMap["ogres"] is sessionID
+      return 0
+    else if humansDestroyed and @teamSessionMap["ogres"] isnt sessionID
+      return 1
+    else if ogresDestroyed and @teamSessionMap["humans"] is sessionID
+      return 0
+    else
+      return 1
+
+
+
+  fetchGoalsFromWorldNoteChain: -> return @god.goalManager.world.scripts[0].noteChain[0].goals.add
+
+
+  manuallyGenerateGoalStates: ->
+    goalStates =
+      "destroy-humans":
+        keyFrame: 0
+        killed:
+          "Human Base": false
+        status: "incomplete"
+      "destroy-ogres":
+        keyFrame:0
+        killed:
+          "Ogre Base": false
+        status: "incomplete"
+
+
+
+  setupGodSpells: ->
+    @generateSpellsObject()
+    @god.spells = @spells
+
+
+  generateSpellsObject: (currentUserCodeMap) ->
+    @userCodeMap = currentUserCodeMap
+    @spells = {}
+    for thang in @level.attributes.thangs
+      continue if @thangIsATemplate thang
+      @generateSpellKeyToSourceMapPropertiesFromThang thang
+
+
+  thangIsATemplate: (thang) ->
+    for component in thang.components
+      continue unless @componentHasProgrammableMethods component
+      for methodName, method of component.config.programmableMethods
+        return true if methodBelongsToTemplateThang method
+
+    return false
+
+
+  componentHasProgrammableMethods: (component) -> component.config? and _.has component.config, 'programmableMethods'
+
+  methodBelongsToTemplateThang: (method) -> typeof method is 'string'
+
+  generateSpellKeyToSourceMapPropertiesFromThang: (thang) =>
+    for component in thang.components
+      continue unless @componentHasProgrammableMethods component
+
+      for methodName, method of component.config.programmableMethods
+        spellKey = @generateSpellKeyFromThangIDAndMethodName thang.id, methodName
+
+        @createSpellAndAssignName spellKey, methodName
+        @createSpellThang thang, method, spellKey
+        @transpileSpell thang, spellKey, methodName
+
+
+
+
+  generateSpellKeyFromThangIDAndMethodName: (thang, methodName) ->
+    spellKeyComponents = [thang.id, methodName]
+    pathComponents[0] = _.string.slugify pathComponents[0]
+    pathComponents.join '/'
+
+  createSpellAndAssignName: (spellKey, spellName) ->
+    @spells[spellKey] ?= {}
+    @spells[spellKey].name = methodName
+
+  createSpellThang: (thang, method, spellKey) ->
+    @spells[spellKey].thangs ?= {}
+    @spells[spellKey].thangs[thang.id] ?= {}
+    @spells[spellKey].thangs[thang.id].aether = @createAether @spells[spellKey].name, method
+
+  transpileSpell: (thang, spellKey, methodName) ->
+    slugifiedThangID = _.string.slugify thang.id
+    source = @currentUserCodeMap[slugifiedThangID]?[methodName] ? ""
+    @spells[spellKey].thangs[thang.id].aether.transpile source
+
+
+
+
+
+
+
+  createAether: (methodName, method) ->
+    aetherOptions =
+      functionName: methodName
+      protectAPI: false
+      includeFlow: false
+    return new Aether aetherOptions
+
+
+
+
+
+
+
+
+
+class SimulationTask
+  constructor: (@rawData) ->
+
+
+  getLevelName: ->
+    levelName =  @rawData.sessions?[0]?.levelID
+    return levelName if levelName?
+    @throwMalformedTaskError "The level name couldn't be deduced from the task."
+
+  generateTeamToSessionMap: ->
+    teamSessionMap = {}
+    for session in @rawData.sessions
+      @throwMalformedTaskError "Two players share the same team" if teamSessionMap[session.team]?
+      teamSessionMap[session.team] = session.sessionID
+
+    teamSessionMap
+
+  throwMalformedTaskError: (errorString) ->
+    throw new Error "The task was malformed, reason: #{errorString}"
+
+  getFirstSessionID: -> @rawData.sessions[0].sessionID
+
+  getTaskID: -> @rawData.taskID
+
+  getReceiptHandle: -> @rawData.receiptHandle
+
+  getSessions: -> @rawData.sessions
+
+  generateSpellKeyToSourceMap: ->
+    spellKeyToSourceMap = {}
+
+    for session in @rawData.sessions
+      teamSpells = session.teamSpells[session.team]
+      _.merge spellKeyToSourceMap, _.pick(session.code, teamSpells)
+
+      commonSpells = session.teamSpells["common"]
+      _.merge spellKeyToSourceMap, _.pick(session.code, commonSpells) if commonSpells?
+
+    spellKeyToSourceMap
+


Added shortDescription

Added shortDescription

--- app/schemas/models/user.coffee
+++ app/schemas/models/user.coffee
@@ -107,7 +107,11 @@
         name: {type: 'string', maxLength: 30, title: 'Link Name', description: 'What are you linking to? Ex: "Personal Website", "GitHub"', format: 'link-name'}
         link: c.url {title: 'Link', description: 'The URL.', default: 'http://example.com'}
     photoURL: {type: 'string', format: 'image-file', title: 'Profile Picture', description: 'Upload a 256x256px or larger image if you want to show a different profile picture to employers than your normal avatar.'}
-    curated: c.object {title: 'Curated', required: ['mainTag','location','education','workHistory','phoneScreenFilter','schoolFilter','locationFilter','roleFilter','seniorityFilter']},
+    curated: c.object {title: 'Curated', required: ['shortDescription','mainTag','location','education','workHistory','phoneScreenFilter','schoolFilter','locationFilter','roleFilter','seniorityFilter']},
+      shortDescription:
+        title: 'Short description'
+        description: 'A sentence or two describing the candidate'
+        type: 'string'
       mainTag:
         title: 'Main tag'
         description: 'A main tag to describe this candidate'


Run npm build from rebuild task

Run npm build from rebuild task

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -38,7 +38,7 @@

     shell:
       rebuild:
-        command: 'node-gyp rebuild'
+        command: 'npm build .'
         options:
           stdout: true
           stderr: true


Try raising RPC timeout to see if we can please CI temporarily

--- test/slave/handoffs.coffee
+++ test/slave/handoffs.coffee
@@ -136,7 +136,7 @@
                 # FIXME: What's a better way to do this?
                 setTimeout ->
                     debug "Setting up s1 RPC"
-                    new RPC s1, (err,r) ->
+                    new RPC s1, timeout:4000, (err,r) ->
                         throw err if err
                         s1rpc = r
                         s1rpc.request "OK", (err,msg) ->


add esc to close menu

add esc to close menu

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


remove console.log

remove console.log

--- client/app/stores/layout_store.coffee
+++ client/app/stores/layout_store.coffee
@@ -72,7 +72,6 @@
             @emit 'change'

         handle ActionTypes.RECEIVE_TASK_UPDATE, (task) =>
-            console.log task
             task = Immutable.Map task
             id = task.get 'id'
             _tasks = _tasks.set id, task


chore($grunt/tasks): #1112 - Add custom tasks

This needs to eventually be refactor into separate tasks (I think), but leaving
here so tests do not fail.

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

--- lib/grunt/custom.coffee
+++ lib/grunt/custom.coffee
@@ -0,0 +1,21 @@
+util = require './utils'
+path = require 'path'
+spawn = require('child_process').spawn
+sourceModules = require('../modules')
+
+module.exports = (grunt) ->
+
+    _ = grunt.util._
+    grunt.registerTask 'lint', 'Lint, in order, the Gruntfile, sources, and tests.', ['concurrent:lint']
+
+    grunt.registerTask 'minify', 'Minify the source javascript and css', [
+        'cssmin:all', 'uglify:core', 'uglify:jquery', 'uglify:coreS3',
+        'uglify:jqueryS3', 'uglify:jqueryAzure', 'uglify:coreAzure', 'uglify:all']
+
+    grunt.registerMultiTask 'tests', '** Use ` grunt-test` instead **', ->
+        util.startKarma.call util, @data, @async()
+
+    grunt.registerTask 'check_pull_req', '', ->
+        util.checkPullRequest()
+
+


[preproc] .... *grumble*

[preproc] .... *grumble*

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


deep watch for the options attribute otherwise property changes does not the trigger $watch handler

--- coffee/angular-daterangepicker.coffee
+++ coffee/angular-daterangepicker.coffee
@@ -183,6 +183,7 @@
       $scope.$watch 'opts', (newOpts) ->
         opts = angular.extend(opts, newOpts)
         _init()
+      , true

     $scope.$on '$destroy', ->
       _picker?.remove()


Update static/vendors/morrisjs/lib/morris.hover.coffee

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

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

--- static/vendors/morrisjs/lib/morris.hover.coffee
+++ static/vendors/morrisjs/lib/morris.hover.coffee
@@ -0,0 +1,44 @@
+class Morris.Hover
+  # Displays contextual information in a floating HTML div.
+
+  @defaults:
+    class: 'morris-hover morris-default-style'
+
+  constructor: (options = {}) ->
+    @options = $.extend {}, Morris.Hover.defaults, options
+    @el = $ "

"
+    @el.hide()
+    @options.parent.append(@el)
+
+  update: (html, x, y) ->
+    if not html
+      @hide()
+    else
+      @html(html)
+      @show()
+      @moveTo(x, y)
+
+  html: (content) ->
+    @el.html(content)
+
+  moveTo: (x, y) ->
+    parentWidth  = @options.parent.innerWidth()
+    parentHeight = @options.parent.innerHeight()
+    hoverWidth   = @el.outerWidth()
+    hoverHeight  = @el.outerHeight()
+    left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth)
+    if y?
+      top = y - hoverHeight - 10
+      if top < 0
+        top = y + 10
+        if top + hoverHeight > parentHeight
+          top = parentHeight / 2 - hoverHeight / 2
+    else
+      top = parentHeight / 2 - hoverHeight / 2
+    @el.css(left: left + "px", top: parseInt(top) + "px")
+
+  show: ->
+    @el.show()
+
+  hide: ->
+    @el.hide()


Update de-DE.coffee

Update de-DE.coffee

small german translation fix

--- app/locale/de-DE.coffee
+++ app/locale/de-DE.coffee
@@ -933,7 +933,7 @@

   contribute:
     page_title: "Mitwirken"
-    intro_blurb: "CodeCombat ist zu 100% Open Source! Hunderte hingebungsvolle Spieler haben uns geholfen das Spiel zu dem zu machen was es heute ist. Tritt uns bei und schreibe das nächste Kapitel in CodeCombat' Aufgabe, der Welt das Programmieren zu lehren!"
+    intro_blurb: "CodeCombat ist zu 100% Open Source! Hunderte hingebungsvolle Spieler haben uns geholfen das Spiel zu dem zu machen, was es heute ist. Tritt uns bei und schreibe das nächste Kapitel in CodeCombats Mission, der Welt das Programmieren zu lehren!"
     alert_account_message_intro: "Hey du!"
     alert_account_message: "Um Klassen-Emails abonnieren zu können, musst du dich zuerst anmelden."
     archmage_introduction: "Einer der größten Vorteile daran ein Spiel aufzubauen, ist es, dass so viele verschiedene Aspekte eine Rolle spielen. Grafiken, Sound, Echtzeit Networking, Social Networking und natürlich viele der gewöhnlichen Aspekte des Programmierens, von low-level Datenbankmanagement und Server Administration bis hin zum Aufbau von Design und Interface. Es gibt viel zu tun und wenn du ein erfahrener Programmierer bist, mit einer Veranlagung dazu, wirklich knallhart bei CodeCombat einzutauchen, dann könnte diese Klasse etwas für dich sein. Wir würden uns wahnsinnig  über deine Hilfe dabei freuen, das beste Programmierspiel der Welt aufzubauen."


i18 update

i18 update

old non abonement text replaced with new version

--- app/locale/de-DE.coffee
+++ app/locale/de-DE.coffee
@@ -1,7 +1,7 @@
 module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription: "German (Germany)", translation:
   home:
     slogan: "Lerne spielend Programmieren"
-    no_ie: "CodeCombat läuft nicht im IE8 oder älteren Browsern. Tut uns Leid!" # Warning that only shows up in IE8 and older
+    no_ie: "CodeCombat läuft nicht im IE 8 oder älteren Browsern. Tut uns Leid!" # Warning that only shows up in IE8 and older
     no_mobile: "CodeCombat ist nicht für Mobilgeräte optimiert und funktioniert möglicherweise nicht." # Warning that shows up on mobile devices
     play: "Spielen" # The big play button that opens up the campaign view.
     old_browser: "Oh! Dein Browser ist zu alt für CodeCombat. Sorry!" # Warning that shows up on really old Firefox/Chrome/Safari
@@ -960,12 +960,12 @@
     email_settings_url: "deiner Emaileinstellungen"
     email_description_suffix: "oder durch von uns gesendete Links kannst du jederzeit deine Einstellungen ändern und Abonnements kündigen."
     cost_title: "Kosten"
-    cost_description: "CodeCombat ist zur Zeit 100% kostenlos! Eines unserer Hauptziele ist, es dabei zu belassen, so dass es so viele Leute wie möglich spielen können, unabhängig davon in welcher Lebenssituation sie sich befinden. Falls dunkle Wolken aufziehen, könnten wir manche Inhalte im Rahmen eines Abonnements anbieten, aber lieber nicht. Mit etwas Glück können wir die Firma erhalten durch:"
+    cost_description: "Alle normalen Level von CodeCombat sind kostenlos spielbar, mit einem Abonement von $9.99 USD/Monat kann man extra Level Verzweigungen und 3500 Bonus Juwelen pro Monat. Du kannst das Abonement mit nur einem Click wiederrufen und wir versprechen eine 100% Geld-zurück Garantie."
     copyrights_title: "Copyrights und Lizenzen"
     contributor_title: "Contributor License Agreement"
     contributor_description_prefix: "Alle Beiträge, sowohl auf unserer Webseite als auch in unserem GitHub Repository, unterliegen unserer"
     cla_url: "CLA"
-    contributor_description_suffix: "zu welcher du dich einverstanden erklären musst bevor du beitragen kannst."
+    contributor_description_suffix: "zu welcher du dich einverstanden erklären musst bevor du zu der Entwicklung beitragen kannst."
     code_title: "Code - MIT"
     code_description_prefix: "Der gesamte Code der CodeCombat gehört oder auf codecombat.com gehostet wird, sowohl im GitHub Repository als auch auch in der codecombat.com Datenbank, ist lizensiert durch die"
     mit_license_url: "MIT Lizenz"


Fixed es-ES.coffee compilation errror

Fixed es-ES.coffee compilation errror

--- app/locale/es-ES.coffee
+++ app/locale/es-ES.coffee
@@ -101,7 +101,7 @@
     learn_more: "Aprende más sobre ser un Diplomático"
     subscribe_as_diplomat: "Suscríbete como Diplomático"

-#  wizard_settings:
+  wizard_settings:
     title: "Ajustes del mago"
     customize_avatar: "Personaliza tu Avatar"

@@ -203,7 +203,7 @@
 #    u_title: "User List"
 #    lg_title: "Latest Games"

-#  editor:
+  editor:
 #    main_title: "CodeCombat Editors"
     main_description: "Construye tus propios niveles, campañas, unidades y contenido educativo. ¡Nosotros te ofrecemos todas las herramientas que necesitas!"
     article_title: "Editor de artículos"
@@ -239,11 +239,11 @@
 #    new_component_title: "Create New Component"
 #    new_component_field_system: "System"

-#  article:
+  article:
     edit_btn_preview: "Vista preliminar"
     edit_article_title: "Editar artículo"

-#  general:
+  general:
     and: "y"
     or: "o"
     name: "Nombre"
@@ -256,7 +256,7 @@
     email: "Correo electrónico"
     message: "Mensaje"

-#  about:
+  about:
     who_is_codecombat: "¿Qué es CodeCombat?"
     why_codecombat: "¿Por qué CodeCombat?"
 #    who_description_prefix: "together started CodeCombat in 2013. We also created "
@@ -268,7 +268,7 @@
     why_paragraph_3_italic: "¡bien una insignia!,"
     why_paragraph_3_center: "sino más bien como:"
     why_paragraph_3_italic_caps: "¡NO MAMA, TENGO QUE TERMINAR EL NIVEL!"
-    why_paragraph_3_suffix: "Por eso Codecombat es multijugador, no un curso con lecciones "gamificadas" . No pararemos hasta que tú no puedas parar... pero esta vez, eso será buena señal."
+    why_paragraph_3_suffix: "Por eso Codecombat es multijugador, no un curso con lecciones \"gamificadas\" . No pararemos hasta que tú no puedas parar... pero esta vez, eso será buena señal."
     why_paragraph_4: "Si vas a engancharte a algún juego, engánchate a este y conviértete en uno de los magos de la era tecnológica."
     why_ending: "Y, oye, es gratis. "
     why_ending_url: "Comienza a hacer magia ¡ya!"
@@ -278,7 +278,7 @@
 #    jeremy_description: "Customer support mage, usability tester, and community organizer; you've probably already spoken with Jeremy."
 #    michael_description: "Programmer, sys-admin, and undergrad technical wunderkind, Michael is the person keeping our servers online."

-#  legal:
+  legal:
     page_title: "Legal"
     opensource_intro: "CodeCombat es gratis y totalmente open source."
     opensource_description_prefix: "Echa un vistazo a "
@@ -339,7 +339,7 @@
 #    nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening."
 #    canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence."

-#  contribute:
+  contribute:
     page_title: "Colaborar"
 #    character_classes_title: "Character Classes"
 #    introduction_desc_intro: "We have high hopes for CodeCombat."
@@ -424,7 +424,7 @@
 #    translating_diplomats: "Our Translating Diplomats:"
 #    helpful_ambassadors: "Our Helpful Ambassadors:"

-#  classes:
+  classes:
     archmage_title: "Archimago"
 #    archmage_title_description: "(Coder)"
 #    artisan_title: "Artisan"