provide method to access current view

provide method to access current view

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


Split utils module into a separate file

Split utils module into a separate file

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

--- src/readmill/utils.coffee
+++ src/readmill/utils.coffee
@@ -0,0 +1,43 @@
+# Useful utility functions.
+Annotator.Readmill.utils =
+  # Public: Serializes an object literal into a query string suitable
+  # for use in a url. Escapes key and value parameters into url safe
+  # entities.
+  #
+  # obj - An object to serailize.
+  # sep - The seperator to join parameters (default: "&")
+  # eq  - The seperator between key and value (default: "=")
+  #
+  # Examples
+  #
+  #   utils.serializeQueryString(dog: "woof", cat: "meow")
+  #   #=> "dog=woof&cat=meow"
+  #
+  #   utils.serializeQueryString(dog: "woof", cat: "meow", "\n", ": ")
+  #   #=> "dog: woof\ncat: meow"
+  #
+  # Returns newly created string.
+  serializeQueryString: (obj, sep="&", eq="=") ->
+    esc = window.encodeURIComponent
+    ("#{esc(key)}#{eq}#{esc(value)}" for own key, value of obj).join(sep)
+
+  # Public: parses a query string extracted from a url. Also decodes
+  # any escaped key/values.
+  #
+  # obj - An string to parse.
+  # sep - The seperator to join parameters (default: "&")
+  # eq  - The seperator between key and value (default: "=")
+  #
+  # Examples
+  #
+  #   utils.parseQueryString("dog=woof&cat=meow")
+  #   #=> {dog: "woof", cat: "meow"}
+  #
+  # Returns an object of key value pairs.
+  parseQueryString: (str, sep="&", eq="=") ->
+    obj = {}
+    decode = window.decodeURIComponent
+    for param in str.split(sep)
+      [key, value] = param.split(eq)
+      obj[decode(key)] = decode value
+    obj


save editor config to database

save editor config to database

--- app/views/play/level/modal/editor_config_modal.coffee
+++ app/views/play/level/modal/editor_config_modal.coffee
@@ -5,6 +5,12 @@
 module.exports = class EditorConfigModal extends View
   id: 'level-editor-config-modal'
   template: template
+  aceConfig: {}
+
+  defaultConfig:
+    keyBindings: 'default'
+    invisibles: false
+    indentGuides: false

   events:
     'click textarea': 'onClickLink'
@@ -16,14 +22,33 @@
     super(options)

   getRenderData: ->
+    @aceConfig = _.cloneDeep me.get('aceConfig') || {}
+    @aceConfig = _.defaults @aceConfig, @defaultConfig
     c = super()
-    c.keyBindings = 'vim'
-    c.invisibles = false
-    c.indentGuides = true
+    c.keyBindings = @aceConfig.keyBindings
+    c.invisibles = @aceConfig.invisibles
+    c.indentGuides = @aceConfig.indentGuides
     c
+
+  updateInvisiblesSelection: ->
+    @aceConfig.invisibles = @$el.find('#invisibles').prop('checked')
+
+  updateKeyBindingsSelection: ->
+    @aceConfig.keyBindings = @$el.find('#keyBindings').val()
+
+  updateIndentGuides: ->
+    @aceConfig.indentGuides = @$el.find('#indentGuides').prop('checked')

   afterRender: ->
     super()

+  onHidden: ->
+    @aceConfig.invisibles = @$el.find('#invisibles').prop('checked')
+    @aceConfig.keyBindings = @$el.find('#keyBindings').val()
+    @aceConfig.indentGuides = @$el.find('#indentGuides').prop('checked')
+    me.set 'aceConfig', @aceConfig
+    me.save()
+    console.log 'config', @aceConfig
+
   destroy: ->
     super()


prepared to periodically store event chunks, made trackViewportInEventLog() safe

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


Render project link if id is present

Render project link if id is present

Resolves: [#106472282]

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


fix mini link

fix mini link

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


Try raising timeout on slave handoff test

CI is timing out here, despite the fact that it works fine every time
locally. Try raising the timeout as a first step.

--- test/slave/handoffs.coffee
+++ test/slave/handoffs.coffee
@@ -23,7 +23,7 @@

 debug = require("debug")("sm:tests:slave_handoffs")

-describe "Slave Handoffs and Worker Respawns", ->
+describe "Slave Handoffs/Respawns", ->
     master_info = null
     source      = null

@@ -127,7 +127,7 @@

         describe "Initial Slave", ->
             before (done) ->
-                this.timeout 5000
+                this.timeout 10000

                 s1 = cp.fork "./index.js", slave_config
                 process.on "exit", -> s1.kill()
@@ -135,7 +135,9 @@
                 # wait a few ticks for startup...
                 # FIXME: What's a better way to do this?
                 setTimeout ->
+                    debug "Setting up s1 RPC"
                     new RPC s1, (err,r) ->
+                        throw err if err
                         s1rpc = r
                         s1rpc.request "OK", (err,msg) ->
                             throw err if err


functional programming is master race

functional programming is master race

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/jencka/2001-A-SPACE-SACRIFICE.git/'


removed debug logging

removed debug logging

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


Tests for SplitStr

Tests for SplitStr

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

--- test/SplitStr.coffee
+++ test/SplitStr.coffee
@@ -0,0 +1,50 @@
+component = require "../src/components/SplitStr"
+socket = require "../src/lib/InternalSocket"
+
+setupComponent = ->
+    c = component.getComponent()
+    ins = socket.createSocket()
+    delim = socket.createSocket()
+    out = socket.createSocket()
+    c.inPorts.in.attach ins
+    c.inPorts.delimiter.attach delim
+    c.outPorts.out.attach out
+    return [c, ins, delim, out]
+
+exports["test split with default delimiter"] = (test) ->
+    [c, ins, delim, out] = setupComponent()
+    out.once "data", (data) ->
+        test.equal data, "abc"
+        out.once "data", (data) ->
+            test.equal data, "123"
+            test.done()
+    ins.send "abc\n123"
+    ins.disconnect()
+
+exports["test split with string delimiter"] = (test) ->
+    [c, ins, delim, out] = setupComponent()
+    out.once "data", (data) ->
+        test.equal data, "abc"
+        out.once "data", (data) ->
+            test.equal data, "123"
+            test.done()
+
+    delim.send ','
+    delim.disconnect()
+
+    ins.send "abc,123"
+    ins.disconnect()
+
+exports["test split with RegExp delimiter"] = (test) ->
+    [c, ins, delim, out] = setupComponent()
+    out.once "data", (data) ->
+        test.equal data, "abc"
+        out.once "data", (data) ->
+            test.equal data, "123"
+            test.done()
+
+    delim.send "/[\n]*[-]{3}[\n]/"
+    delim.disconnect()
+
+    ins.send "abc\n---\n123"
+    ins.disconnect()


atom prefs

atom prefs

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


Rejected code not in scope of PR #28

Rejected code not in scope of PR #28

--- src/replay/catalog.coffee
+++ src/replay/catalog.coffee
@@ -76,9 +76,6 @@
     mkdir pathname, (error)->
       return callback error if error
       filename = "#{pathname}/#{uid}"
-      filename += "#{request.method.toUpperCase()}"
-      filename += "#{request.url.path.replace(/\//g, "_")}_"
-      filename += "#{response.status}_#{uid}"

       try
         file = File.createWriteStream(tmpfile, encoding: "utf-8")


Update ViewModel to accept string or null template.

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


Added spawn points list to map.

Added spawn points list to map.

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/4eek/unknown.git/'


else not needed

else not needed

--- resources/assets/coffee/react/beatmapset-page/score.coffee
+++ resources/assets/coffee/react/beatmapset-page/score.coffee
@@ -61,5 +61,3 @@
       if props.score.statistics.count_miss > 0
         osu.trans 'beatmapsets.show.scoreboard.miss_count',
           count: props.score.statistics.count_miss
-      else
-        ''


Issues/#29 (#33)

Issues/#29 (#33)

* format notification of pull request

* without amend

* without amend

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


Make the models into event-emitters

Make the models into event-emitters

This could probably be included in cozydb

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

--- server/models/model-events.coffee
+++ server/models/model-events.coffee
@@ -0,0 +1,34 @@
+
+{EventEmitter} = require 'events'
+_ = require 'lodash'
+
+# using DS events imply one more query for each update
+# instead we monkeypatch cozydb
+module.exports.wrapModel = (Model) ->
+
+    Model.ee = new EventEmitter()
+
+    Model.on = -> Model.ee.on.apply Model.ee, arguments
+
+    _oldCreate = Model.create
+    Model.create = (data, callback) ->
+        _oldCreate.call Model, data, (err, created) ->
+            Model.ee.emit 'create', created unless err
+            callback err, created
+
+    _oldUpdateAttributes = Model::updateAttributes
+    Model::updateAttributes = (data, callback) ->
+        old = _.cloneDeep @toObject()
+        _oldUpdateAttributes.call this, data, (err, updated) =>
+            Model.ee.emit 'update', this, old unless err
+            callback err, updated
+
+    _oldDestroy = Model::destroy
+    Model::destroy = (callback) ->
+        old = @toObject()
+        id = old.id
+        _oldDestroy.call this, (err) ->
+            Model.ee.emit 'delete', id, old unless err
+            callback err
+
+    return Model


Reduce font to 12pt

Reduce font to 12pt

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


detect

detect

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


[add] Gruntfile.coffeeを追加

[add] Gruntfile.coffeeを追加

gruntコマンドでw-cars.coffeeをwatchして、変更がある度にlintしてbuildするようなタスクを書いた

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

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,41 @@
+module.exports = (grunt) ->
+  'use strict'
+
+  # Load all grunt packages
+  require('matchdep').filterDev('grunt-*').forEach grunt.loadNpmTasks
+
+  grunt.initConfig
+    coffee:
+      options:
+        bare: yes
+      all:
+        files:
+          'dest/w-cars.js': 'src/w-cars.coffee'
+
+    coffeelint:
+      options:
+        configFile: 'coffeelint.json'
+      all:
+        files:
+          src: [
+            'src/**/*.coffee'
+          ]
+
+    watch:
+      options:
+        interrupt: no
+      all:
+        files: [
+          'Gruntfile.coffee'
+          'src/**/*.coffee'
+        ]
+        tasks: [
+          'coffeelint:all'
+          'coffee:all'
+        ]
+
+    grunt.registerTask 'default', [
+      'coffeelint:all'
+      'coffee:all'
+      'watch:all'
+    ]


Kill line

Kill line

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


Gruntfile

Gruntfile

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,175 @@
+module.exports = (grunt) ->
+  require('load-grunt-tasks')(grunt)
+
+  require('time-grunt')(grunt)
+
+  grunt.initConfig
+    pkg: grunt.file.readJSON('package.json')
+    concurrent:
+      clean: [ 'clean:dist', 'clean:server' ]
+      preServer: [ 'copy:bootstrap', 'compass:server', 'coffee:server' ]
+      # preCompile: compile the files to optimize
+      preCompile: [ 'copy:building', 'copy:dist',
+                    'coffee:building', 'compass:dist' ]
+      afterBuild: [ 'clean:building', 'clean:cache' ]
+    clean:
+      dist: [ 'dist' ]
+      server: [ '.server' ]
+      building: [ '.building', '.tmp' ]
+      cache: [ '.sass-cache' ]
+    coffee:
+      server:
+        files: [
+          expand: true
+          cwd: 'src'
+          src: [ '**/*.+(coffee|litcoffee)' ]
+          dest: '.server/'
+          ext: '.js'
+          extDot: 'last'
+        ]
+      building:
+        files: [
+          expand: true
+          cwd: 'src'
+          src: [ '**/*.+(coffee|litcoffee)' ]
+          dest: '.building'
+          ext: '.js'
+          extDot: 'last'
+        ]
+    compass:
+      dist:
+        options:
+          sassDir: 'src/css'
+          cssDir: 'dist/css'
+          environment: 'production'
+          outputStyle: 'compressed'
+          # TODO: bundle has problem on Windows by now.
+          #       waiting for the fix.
+          #       refer to: [https://github.com/gruntjs/grunt-contrib-compass/issues/176]()
+          #bundleExec: true
+      server:
+        options:
+          sassDir: 'src/css'
+          cssDir: '.server/css'
+          outputStyle: 'expanded'
+          # TODO: bundle has problem on Windows by now.
+          #       waiting for the fix.
+          #       refer to: [https://github.com/gruntjs/grunt-contrib-compass/issues/176]()
+          #bundleExec: true
+    connect:
+      options:
+        port: 8000
+        base: ['.server', 'src']
+        open: 'http://localhost:8000'
+        middleware: (connect, options) ->
+          options.base = [options.base] unless Array.isArray(options.base)
+          middlewares = [require('grunt-connect-proxy/lib/utils').proxyRequest]
+          options.base.forEach (base) ->
+            middlewares.push(connect.static(base))
+          directory = options.directory or options.base[options.base.length - 1]
+          middlewares.push(connect.directory(directory))
+          middlewares.push (req, res, next) ->
+            console.log req.url
+            next()
+          middlewares
+      server:
+        proxies: [
+          context:      '/api'
+          host:         'localhost'
+          port:         9999
+        ]
+        options:
+          livereload: true
+    copy:
+      bootstrap:
+        files: [
+          expand: true
+          cwd: 'src/lib/bootstrap-sass-official/assets/fonts'
+          src: [ 'bootstrap/**/*' ]
+          dest: 'src/fonts/'
+        ]
+      dist:
+        files: [
+          expand: true
+          cwd: 'src'
+          src: [ '**/*', '!lib/**/*', '!**/*.{coffee,litcoffee,sass,scss,js}' ]
+          filter: 'isFile'
+          dest: 'dist/'
+        ]
+      building:
+        files: [
+          expand: true
+          cwd: 'src'
+          src: [ '**/*.js' ]
+          filter: 'isFile'
+          dest: '.building'
+        ]
+      usemin:
+        files: [
+          expand: true
+          cwd: '.building'
+          src: [ '**/*.html' ]
+          filter: 'isFile'
+          dest: 'dist'
+        ]
+    htmlmin:
+      options:
+        removeComments: true
+        removeCommentsFromCDATA: true
+        removeCDATASectionsFromCDATA: true
+        collapseWhitespace: true
+        conservativeCollapse: true
+        collapseBooleanAttributes: true
+        removeOptionalTags: true
+      dist:
+        files: [
+          expand: true
+          cwd: 'dist'
+          src: [ '**/*.html' ]
+          dest: 'dist'
+        ]
+    watch:
+      options:
+        spawn: false
+        forever: true
+        livereload: true
+      compass:
+        files: 'src/**/*.+(sass|scss)'
+        tasks: 'compass:server'
+      coffee:
+        files: 'src/**/*.+(coffee|litcoffee)'
+        tasks: 'coffee:server'
+      html:
+        files: 'src/**/*.html'
+      css:
+        files: 'src/**/*.css'
+    filerev:
+      dist:
+        src: [
+          'dist/css/**/*.css'
+          'dist/fonts/**/*.*'
+          'dist/js/**/*.js'
+        ]
+    useminPrepare:
+      html: [ '+(src|.building)/**/*.html' ]
+    usemin:
+      html: [ 'dist/**/*.html' ]
+      css: [ 'dist/css/**/*.css' ]
+      options:
+        assetsDirs: [ 'dist', 'dist/fonts', 'dist/img' ]
+
+
+  grunt.registerTask 'compile', 'Compile & optimize the codes',
+      [ 'concurrent:preCompile', 'optimize' ]
+
+  grunt.registerTask 'optimize', 'Optimize JS files',
+      [ 'useminPrepare', 'copy:usemin', 'concat:generated', 'uglify:generated', 'filerev', 'usemin', 'htmlmin' ]
+
+  grunt.registerTask 'build', 'Build the code for production',
+      [ 'concurrent:clean', 'copy:bootstrap', 'compile', 'concurrent:afterBuild' ]
+
+  grunt.registerTask 'server', 'Start a preview server',
+      [ 'concurrent:clean', 'concurrent:preServer', 'configureProxies:server', 'connect:server', 'watch' ]
+
+  grunt.registerTask 'default', 'UT (when has) & build',
+      [ 'build' ]


Add atom shortcuts

Add atom shortcuts

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

--- .atom/keymap.cson
+++ .atom/keymap.cson
@@ -0,0 +1,31 @@
+# Your keymap
+#
+# Atom keymaps work similarly to style sheets. Just as style sheets use
+# selectors to apply styles to elements, Atom keymaps use selectors to associate
+# keystrokes with events in specific contexts. Unlike style sheets however,
+# each selector can only be declared once.
+#
+# You can create a new keybinding in this file by typing "key" and then hitting
+# tab.
+#
+# Here's an example taken from Atom's built-in keymap:
+#
+# 'atom-text-editor':
+#   'enter': 'editor:newline'
+#
+# 'atom-workspace':
+#   'ctrl-shift-p': 'core:move-up'
+#   'ctrl-p': 'core:move-down'
+#
+# You can find more information about keymaps in these guides:
+# * https://atom.io/docs/latest/using-atom-basic-customization#customizing-key-bindings
+# * https://atom.io/docs/latest/behind-atom-keymaps-in-depth
+#
+# This file uses CoffeeScript Object Notation (CSON).
+# If you are unfamiliar with CSON, you can read more about it in the
+# Atom Flight Manual:
+# https://atom.io/docs/latest/using-atom-basic-customization#cson
+
+'atom-text-editor:not([mini])':
+  'alt-up': 'editor:add-selection-above'
+  'alt-down': 'editor:add-selection-below'


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


correctly add callback on cordova's deviceready event

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


Fixed bug with conference line assignmet

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


Adding create db command

Adding create db command

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


bug fix

bug fix


Adding example usage.

Adding example usage.

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

--- examples/example.coffee
+++ examples/example.coffee
@@ -0,0 +1,8 @@
+generator = new (require '../').WordGenerator
+
+generator.generateTree () ->
+  word = 'matthew'
+  console.log 'Looking up anagrams for the name "' + word + '"...'
+  init = new Date()
+  console.log generator.getAnagrams word
+  console.log 'Lookup of "' + word + '" took ' + (new Date() - init) + 'ms to complete'


Minor correction to get the avatar to display properly

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


Fixed some issues with data structures on example trials, working through exposure and recall

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


'core.autoHideMenuBar' (Windows & Linux)

--- def/settings.cson
+++ def/settings.cson
@@ -47,6 +47,11 @@
     {
       id: 'core.audioBeep'
       title: "ビープ音を鳴らす"
+    }
+    {
+      id: 'core.autoHideMenuBar'
+      title: "メニューバーを自動的に隠す"
+      desc: "メニューバーを自動的に隠して Alt キーで切り替えます。この設定は Windows と Linux でのみサポートされます。"
     }
     {
       id: 'core.destroyEmptyPanes'
@@ -166,7 +171,7 @@
     }
     {
       id: 'editor.zoomFontWhenCtrlScrolling'
-      title: "Ctrlスクロールでフォントサイズを変える"
+      title: "Ctrl スクロールでフォントサイズを変える"
       desc: "コントロールキーを押しながらスクロールを上下することでエディタのフォントサイズを拡大/縮小します。"
     }
   ]


Added a 250ms sleep to casper tests for every request/pageload

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/starim/penny-auction.git/'


add the rest of the interesting emacs key bindings.

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


big parts of undo.

big parts of undo.


Add a FilePage class

Add a FilePage class

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

--- src/file-page.coffee
+++ src/file-page.coffee
@@ -0,0 +1,6 @@
+Template = require './template'
+
+# Public: Used to render a documentation file like `README.md`.
+class FilePage extends Template
+
+module.exports = FilePage


Revert "move static files"

Revert "move static files"

This reverts commit 3c987bcdf006d3a776ab0f7fef177e451d397537.

--- SingularityUI/config.coffee
+++ SingularityUI/config.coffee
@@ -1,7 +1,7 @@
 exports.config =

     paths:
-        public: '../SingularityService/src/main/resources'
+        public: '../SingularityService/src/main/resources/static'

     files:


jqueryプラグインひな形作成

jqueryプラグインひな形作成

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

--- src/jquery.smartquescroll.coffee
+++ src/jquery.smartquescroll.coffee
@@ -0,0 +1,14 @@
+class Page
+  constructor: (@el, @options) ->
+
+(($) ->
+  $.fn.smartquescroll = (options) ->
+    options = $.extend
+      tmp: 1
+    , options
+
+    @each ->
+      new Page($(@), options)
+
+    return @
+)(jQuery)


Added channels command, closes #6

Added channels command, closes #6

error: pathspec 'plugins/coffeekeep.messaging/commands/channels.coffee' did not match any file(s) known to git

--- plugins/coffeekeep.messaging/commands/channels.coffee
+++ plugins/coffeekeep.messaging/commands/channels.coffee
@@ -0,0 +1,22 @@
+new Command
+  name: 'channels'
+  description: "Lists all channels and subscription status"
+  help: "Usage: channels"
+  consumes: ['messaging']
+  action: (context, request) ->
+    {mob} = context
+    {messaging} = imports
+
+    mob.print "Channels available to you:"
+
+    messaging.channels.map (channel) ->
+      return unless mob.hasPermission channel.get 'acl'
+      if channel.isEnabled context
+        enabled = "%genabled%."
+      else
+        enabled = "%rdisabled%."
+
+      perms = ''
+      if mob.hasPermission '-all +sysop'
+        perms = " %K(ACL: #{channel.get 'acl'})%."
+      mob.print "  %c#{channel.id}%.: #{enabled}#{perms}"


:lipstick: Colocate all Git integrations pecs

This will allow a beforeEach and afterEach to be added to setup and
tear down the .git folder.

--- spec/fuzzy-finder-spec.coffee
+++ spec/fuzzy-finder-spec.coffee
@@ -261,34 +261,6 @@
           expect(editor4.getPath()).toBe expectedPath
           expect(editor4.isFocused).toBeTruthy()

-  describe "git-status-finder behavior", ->
-    [originalText, originalPath, newPath] = []
-
-    beforeEach ->
-      editor = rootView.getActiveView()
-      originalText = editor.getText()
-      originalPath = editor.getPath()
-      fs.writeSync(originalPath, 'making a change for the better')
-      project.getRepo().getPathStatus(originalPath)
-
-      newPath = project.resolve('newsample.js')
-      fs.writeSync(newPath, '')
-      project.getRepo().getPathStatus(newPath)
-
-    afterEach ->
-      fs.writeSync(originalPath, originalText)
-      fs.remove(newPath) if fs.exists(newPath)
-
-    it "displays all new and modified paths", ->
-      expect(rootView.find('.fuzzy-finder')).not.toExist()
-      rootView.trigger 'fuzzy-finder:toggle-git-status-finder'
-      expect(rootView.find('.fuzzy-finder')).toExist()
-
-      expect(finderView.find('.file').length).toBe 2
-
-      expect(finderView.find('.status.status-modified').length).toBe 1
-      expect(finderView.find('.status.status-added').length).toBe 1
-
   describe "common behavior between file and buffer finder", ->
     describe "when the fuzzy finder is cancelled", ->
       describe "when an editor is open", ->
@@ -381,17 +353,212 @@
         rootView.trigger 'fuzzy-finder:toggle-file-finder'
         expect(PathLoader.startTask).toHaveBeenCalled()

-  describe "path ignoring", ->
-    it "ignores paths that match entries in config.fuzzyFinder.ignoredNames", ->
-      config.set("fuzzyFinder.ignoredNames", ["tree-view.js"])
-      rootView.trigger 'fuzzy-finder:toggle-file-finder'
-      finderView.maxItems = Infinity
+  it "ignores paths that match entries in config.fuzzyFinder.ignoredNames", ->
+    config.set("fuzzyFinder.ignoredNames", ["tree-view.js"])
+    rootView.trigger 'fuzzy-finder:toggle-file-finder'
+    finderView.maxItems = Infinity
+
+    waitsFor ->
+      finderView.list.children('li').length > 0
+
+    runs ->
+      expect(finderView.list.find("li:contains(tree-view.js)")).not.toExist()
+
+  describe "fuzzy find by content under cursor", ->
+    editor = null
+
+    beforeEach ->
+      editor = rootView.getActiveView()
+      rootView.attachToDom()
+
+    it "opens the fuzzy finder window when there are multiple matches", ->
+      editor.setText("sample")
+      rootView.trigger 'fuzzy-finder:find-under-cursor'

       waitsFor ->
         finderView.list.children('li').length > 0

       runs ->
-        expect(finderView.list.find("li:contains(tree-view.js)")).not.toExist()
+        expect(finderView).toBeVisible()
+        expect(rootView.find('.fuzzy-finder input:focus')).toExist()
+
+    it "opens a file directly when there is a single match", ->
+      editor.setText("sample.txt")
+      rootView.trigger 'fuzzy-finder:find-under-cursor'
+
+      openedPath = null
+      spyOn(rootView, "open").andCallFake (path) ->
+        openedPath = path
+
+      waitsFor ->
+        openedPath != null
+
+      runs ->
+        expect(finderView).not.toBeVisible()
+        expect(openedPath).toBe project.resolve("sample.txt")
+
+    it "displays an error when the word under the cursor doesn't match any files", ->
+      editor.setText("moogoogaipan")
+      editor.setCursorBufferPosition([0,5])
+
+      rootView.trigger 'fuzzy-finder:find-under-cursor'
+
+      waitsFor ->
+        finderView.is(':visible')
+
+      runs ->
+        expect(finderView.error.text().length).toBeGreaterThan 0
+
+    it "displays error when there is no word under the cursor", ->
+      editor.setText("&&&&&&&&&&&&&&& sample")
+      editor.setCursorBufferPosition([0,5])
+
+      rootView.trigger 'fuzzy-finder:find-under-cursor'
+
+      waitsFor ->
+        finderView.is(':visible')
+
+      runs ->
+        expect(finderView.error.text().length).toBeGreaterThan 0
+
+  describe "opening a path into a split", ->
+    it "opens the path by splitting the active editor left", ->
+      expect(rootView.getPanes().length).toBe 1
+      pane = rootView.getActivePane()
+      spyOn(pane, "splitLeft").andCallThrough()
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      {filePath} = finderView.getSelectedElement()
+      finderView.miniEditor.trigger 'pane:split-left'
+
+      expect(rootView.getPanes().length).toBe 2
+      expect(pane.splitLeft).toHaveBeenCalled()
+      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
+
+    it "opens the path by splitting the active editor right", ->
+      expect(rootView.getPanes().length).toBe 1
+      pane = rootView.getActivePane()
+      spyOn(pane, "splitRight").andCallThrough()
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      {filePath} = finderView.getSelectedElement()
+      finderView.miniEditor.trigger 'pane:split-right'
+
+      expect(rootView.getPanes().length).toBe 2
+      expect(pane.splitRight).toHaveBeenCalled()
+      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
+
+    it "opens the path by splitting the active editor up", ->
+      expect(rootView.getPanes().length).toBe 1
+      pane = rootView.getActivePane()
+      spyOn(pane, "splitUp").andCallThrough()
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      {filePath} = finderView.getSelectedElement()
+      finderView.miniEditor.trigger 'pane:split-up'
+
+      expect(rootView.getPanes().length).toBe 2
+      expect(pane.splitUp).toHaveBeenCalled()
+      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
+
+    it "opens the path by splitting the active editor down", ->
+      expect(rootView.getPanes().length).toBe 1
+      pane = rootView.getActivePane()
+      spyOn(pane, "splitDown").andCallThrough()
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      {filePath} = finderView.getSelectedElement()
+      finderView.miniEditor.trigger 'pane:split-down'
+
+      expect(rootView.getPanes().length).toBe 2
+      expect(pane.splitDown).toHaveBeenCalled()
+      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
+
+  describe "when the filter text contains a colon followed by a number", ->
+    it "opens the selected path to that line number", ->
+      rootView.attachToDom()
+      expect(rootView.find('.fuzzy-finder')).not.toExist()
+      [editor] = rootView.getEditors()
+      expect(editor.getCursorBufferPosition()).toEqual [0, 0]
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      expect(rootView.find('.fuzzy-finder')).toExist()
+      finderView.miniEditor.insertText(':4')
+      finderView.trigger 'core:confirm'
+
+      expect(editor.getCursorBufferPosition()).toEqual [3, 4]
+
+      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+      expect(rootView.find('.fuzzy-finder')).toExist()
+      finderView.miniEditor.insertText(':10')
+      finderView.miniEditor.trigger 'pane:split-left'
+
+      expect(rootView.getActiveView()).not.toBe editor
+      expect(rootView.getActiveView().getCursorBufferPosition()).toEqual [9, 2]
+
+  describe "Git integration", ->
+    describe "git-status-finder behavior", ->
+      [originalText, originalPath, newPath] = []
+
+      beforeEach ->
+        editor = rootView.getActiveView()
+        originalText = editor.getText()
+        originalPath = editor.getPath()
+        fs.writeSync(originalPath, 'making a change for the better')
+        project.getRepo().getPathStatus(originalPath)
+
+        newPath = project.resolve('newsample.js')
+        fs.writeSync(newPath, '')
+        project.getRepo().getPathStatus(newPath)
+
+      afterEach ->
+        fs.writeSync(originalPath, originalText)
+        fs.remove(newPath)
+
+      it "displays all new and modified paths", ->
+        expect(rootView.find('.fuzzy-finder')).not.toExist()
+        rootView.trigger 'fuzzy-finder:toggle-git-status-finder'
+        expect(rootView.find('.fuzzy-finder')).toExist()
+
+        expect(finderView.find('.file').length).toBe 2
+
+        expect(finderView.find('.status.status-modified').length).toBe 1
+        expect(finderView.find('.status.status-added').length).toBe 1
+
+    describe "status decorations", ->
+      [originalText, originalPath, editor, newPath] = []
+
+      beforeEach ->
+        rootView.attachToDom()
+        editor = rootView.getActiveView()
+        originalText = editor.getText()
+        originalPath = editor.getPath()
+        newPath = project.resolve('newsample.js')
+        fs.writeSync(newPath, '')
+
+      afterEach ->
+        fs.writeSync(originalPath, originalText)
+        fs.remove(newPath) if fs.exists(newPath)
+
+      describe "when a modified file is shown in the list", ->
+        it "displays the modified icon", ->
+          editor.setText('modified')
+          editor.activeEditSession.save()
+          project.getRepo().getPathStatus(editor.getPath())
+
+          rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+          expect(finderView.find('.status.status-modified').length).toBe 1
+          expect(finderView.find('.status.status-modified').closest('li').find('.file').text()).toBe 'sample.js'
+
+      describe "when a new file is shown in the list", ->
+        it "displays the new icon", ->
+          rootView.open('newsample.js')
+          editor = rootView.getActiveView()
+          project.getRepo().getPathStatus(editor.getPath())
+
+          rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
+          expect(finderView.find('.status.status-added').length).toBe 1
+          expect(finderView.find('.status.status-added').closest('li').find('.file').text()).toBe 'newsample.js'

     describe "when core.excludeVcsIgnoredPaths is set to true", ->
       beforeEach ->
@@ -442,170 +609,3 @@

           runs ->
             expect(finderView.list.find("li:contains(sample.js)")).toExist()
-
-  describe "fuzzy find by content under cursor", ->
-    editor = null
-
-    beforeEach ->
-      editor = rootView.getActiveView()
-      rootView.attachToDom()
-
-    it "opens the fuzzy finder window when there are multiple matches", ->
-      editor.setText("sample")
-      rootView.trigger 'fuzzy-finder:find-under-cursor'
-
-      waitsFor ->
-        finderView.list.children('li').length > 0
-
-      runs ->
-        expect(finderView).toBeVisible()
-        expect(rootView.find('.fuzzy-finder input:focus')).toExist()
-
-    it "opens a file directly when there is a single match", ->
-      editor.setText("sample.txt")
-      rootView.trigger 'fuzzy-finder:find-under-cursor'
-
-      openedPath = null
-      spyOn(rootView, "open").andCallFake (path) ->
-        openedPath = path
-
-      waitsFor ->
-        openedPath != null
-
-      runs ->
-        expect(finderView).not.toBeVisible()
-        expect(openedPath).toBe project.resolve("sample.txt")
-
-    it "displays an error when the word under the cursor doesn't match any files", ->
-      editor.setText("moogoogaipan")
-      editor.setCursorBufferPosition([0,5])
-
-      rootView.trigger 'fuzzy-finder:find-under-cursor'
-
-      waitsFor ->
-        finderView.is(':visible')
-
-      runs ->
-        expect(finderView.error.text().length).toBeGreaterThan 0
-
-    it "displays error when there is no word under the cursor", ->
-      editor.setText("&&&&&&&&&&&&&&& sample")
-      editor.setCursorBufferPosition([0,5])
-
-      rootView.trigger 'fuzzy-finder:find-under-cursor'
-
-      waitsFor ->
-        finderView.is(':visible')
-
-      runs ->
-        expect(finderView.error.text().length).toBeGreaterThan 0
-
-  describe "opening a path into a split", ->
-    it "opens the path by splitting the active editor left", ->
-      expect(rootView.getPanes().length).toBe 1
-      pane = rootView.getActivePane()
-      spyOn(pane, "splitLeft").andCallThrough()
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      {filePath} = finderView.getSelectedElement()
-      finderView.miniEditor.trigger 'pane:split-left'
-
-      expect(rootView.getPanes().length).toBe 2
-      expect(pane.splitLeft).toHaveBeenCalled()
-      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
-
-    it "opens the path by splitting the active editor right", ->
-      expect(rootView.getPanes().length).toBe 1
-      pane = rootView.getActivePane()
-      spyOn(pane, "splitRight").andCallThrough()
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      {filePath} = finderView.getSelectedElement()
-      finderView.miniEditor.trigger 'pane:split-right'
-
-      expect(rootView.getPanes().length).toBe 2
-      expect(pane.splitRight).toHaveBeenCalled()
-      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
-
-    it "opens the path by splitting the active editor up", ->
-      expect(rootView.getPanes().length).toBe 1
-      pane = rootView.getActivePane()
-      spyOn(pane, "splitUp").andCallThrough()
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      {filePath} = finderView.getSelectedElement()
-      finderView.miniEditor.trigger 'pane:split-up'
-
-      expect(rootView.getPanes().length).toBe 2
-      expect(pane.splitUp).toHaveBeenCalled()
-      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
-
-    it "opens the path by splitting the active editor down", ->
-      expect(rootView.getPanes().length).toBe 1
-      pane = rootView.getActivePane()
-      spyOn(pane, "splitDown").andCallThrough()
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      {filePath} = finderView.getSelectedElement()
-      finderView.miniEditor.trigger 'pane:split-down'
-
-      expect(rootView.getPanes().length).toBe 2
-      expect(pane.splitDown).toHaveBeenCalled()
-      expect(rootView.getActiveView().getPath()).toBe project.resolve(filePath)
-
-  describe "git status decorations", ->
-    [originalText, originalPath, editor, newPath] = []
-
-    beforeEach ->
-      rootView.attachToDom()
-      editor = rootView.getActiveView()
-      originalText = editor.getText()
-      originalPath = editor.getPath()
-      newPath = project.resolve('newsample.js')
-      fs.writeSync(newPath, '')
-
-    afterEach ->
-      fs.writeSync(originalPath, originalText)
-      fs.remove(newPath) if fs.exists(newPath)
-
-    describe "when a modified file is shown in the list", ->
-      it "displays the modified icon", ->
-        editor.setText('modified')
-        editor.activeEditSession.save()
-        project.getRepo().getPathStatus(editor.getPath())
-
-        rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-        expect(finderView.find('.status.status-modified').length).toBe 1
-        expect(finderView.find('.status.status-modified').closest('li').find('.file').text()).toBe 'sample.js'
-
-    describe "when a new file is shown in the list", ->
-      it "displays the new icon", ->
-        rootView.open('newsample.js')
-        editor = rootView.getActiveView()
-        project.getRepo().getPathStatus(editor.getPath())
-
-        rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-        expect(finderView.find('.status.status-added').length).toBe 1
-        expect(finderView.find('.status.status-added').closest('li').find('.file').text()).toBe 'newsample.js'
-
-  describe "when the filter text contains a colon followed by a number", ->
-    it "opens the selected path to that line number", ->
-      rootView.attachToDom()
-      expect(rootView.find('.fuzzy-finder')).not.toExist()
-      [editor] = rootView.getEditors()
-      expect(editor.getCursorBufferPosition()).toEqual [0, 0]
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      expect(rootView.find('.fuzzy-finder')).toExist()
-      finderView.miniEditor.insertText(':4')
-      finderView.trigger 'core:confirm'
-
-      expect(editor.getCursorBufferPosition()).toEqual [3, 4]
-
-      rootView.trigger 'fuzzy-finder:toggle-buffer-finder'
-      expect(rootView.find('.fuzzy-finder')).toExist()
-      finderView.miniEditor.insertText(':10')
-      finderView.miniEditor.trigger 'pane:split-left'
-
-      expect(rootView.getActiveView()).not.toBe editor
-      expect(rootView.getActiveView().getCursorBufferPosition()).toEqual [9, 2]


Added ErrorMap service

Added ErrorMap service

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

--- app/assets/javascripts/sprangular/services/errorMap.coffee
+++ app/assets/javascripts/sprangular/services/errorMap.coffee
@@ -0,0 +1,30 @@
+Sprangular.service 'ErrorMap', (_) ->
+
+  service =
+    mapping:
+      "An error occurred while processing your card. Try again in a little bit.": "An error occurred while processing your card. Try again in a little bit.  Sorry about that."
+      "Your card's security code is incorrect.": "Your card's security code is incorrect."
+      "Your card has expired.": "Your card has expired."
+      "Your card was declined.": "Your card was declined."
+      "Your card was declined. Please use another card.": "Your card was declined. Please use another card."
+      "You must specify an API key.": "Oops! Something has gone wrong. Please contact us."
+      "Invalid resource. Please fix errors and try again.": "Please review the info provided in the form."
+      "exp_month invalid_number": "The card's expiration month is invalid."
+      "exp_month invalid_expiry_month": "The card has expired."
+      "exp_year invalid_number": "The card's expiration year is invalid."
+      "exp_year invalid_expiry_year": "The card has expired."
+      "number invalid_number": "The card number is incorrect."
+      "number incorrect_number": "The card number is incorrect."
+      "cvc": "The card's expiration month is invalid."
+      "has already been taken": "Your email address has already been submitted for this gift."
+
+    match: (string) ->
+      @mapping[string] || string
+
+    map: (message) ->
+      if Array.isArray(message)
+        _.map message, (v, k) -> service.match(v)
+      else
+        @match(message)
+
+  service


Fixed a test to expect PUT instead of PATCH.

--- test/app/lib/FacebookHandler.spec.coffee
+++ test/app/lib/FacebookHandler.spec.coffee
@@ -76,5 +76,6 @@
     expect(params.gender).toBe(mockMe.gender)
     expect(params.email).toBe(mockMe.email)
     expect(params.facebookID).toBe(mockMe.id)
-    expect(request.method).toBe('PATCH')
+    #expect(request.method).toBe('PATCH')  # PATCHes are PUTs until more proxy servers recognize PATCH
+    expect(request.method).toBe('PUT')
     expect(_.string.startsWith(request.url, '/db/user/12345')).toBeTruthy()


Add pane utilities class

Add pane utilities class

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

--- lib/pane-utilities.coffee
+++ lib/pane-utilities.coffee
@@ -0,0 +1,59 @@
+# PaneUtilities
+
+module.exports = class PaneUtilities
+
+    _sCurrentActiveURI = null
+
+    @clearPanes = ->
+        while ( aPanes = _getCurrentPanes() ).length > 1
+            aPanes[ aPanes.length - 1 ].remove()
+
+        return PaneUtilities
+
+    @saveItems = ->
+        _sCurrentActiveURI = atom.workspace.getActivePaneItem()?.getUri()
+
+        oFirstPane = ( aPanes = _getCurrentPanes() )[ 0 ]
+
+        for oPane, iPaneIndex in aPanes
+            for oItem in oPane.getItems()
+                oItem.originalPaneIndex = iPaneIndex
+                if iPaneIndex > 0
+                    iItemsLength = oFirstPane.getItems().length
+                    oPane.moveItemToPane oItem, oFirstPane, iItemsLength
+
+        return PaneUtilities
+
+    @restoreItems = ->
+        oFirstPane = ( aPanes = _getCurrentPanes() )[ 0 ]
+
+        for oItem in oFirstPane.getItems()
+            oTargetPane = aPanes[ oItem.originalPaneIndex ] ? aPanes[ aPanes.length - 1 ]
+            if oItem.originalPaneIndex > 0
+                iItemsLength = oTargetPane.getItems().length
+                oFirstPane.moveItemToPane oItem, oTargetPane, iItemsLength
+
+        if _sCurrentActiveURI
+            ( oActivePane = atom.workspace.paneForUri _sCurrentActiveURI ).activate()
+            oActivePane.activateItemForUri _sCurrentActiveURI
+            _sCurrentActiveURI = null
+
+        return PaneUtilities
+
+    @applyLayout = ( aLayout ) ->
+        oPanes = _getCurrentPanes()
+
+        # Divide columns
+        for i in [ 0 ... ( aLayout.length - 1 ) ]
+            oPanes[ 0 ].splitRight()
+
+        # Divide rows
+        oPanes = _getCurrentPanes()
+        for iRows, iIndex in aLayout
+            for i in [ 0 ... ( iRows - 1 ) ]
+                oPanes[ iIndex ].splitDown()
+
+        return PaneUtilities
+
+    _getCurrentPanes = ->
+        ( oPane for oPane in atom.workspaceView.getPaneViews() )


Better title

Better title

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


Fix return value for getValueAsHTML

Fix return value for getValueAsHTML

--- src/token.coffee
+++ src/token.coffee
@@ -131,23 +131,21 @@

   getValueAsHtml: ({invisibles, hasLeadingWhitespace, hasTrailingWhitespace, hasIndentGuide})->
     invisibles ?= {}
-    html = @value
-
     if @isHardTab
       classes = 'hard-tab'
       classes += ' indent-guide' if hasIndentGuide
       classes += ' invisible-character' if invisibles.tab
-      html = html.replace StartCharacterRegex, (match) =>
+      html = @value.replace StartCharacterRegex, (match) =>
         match = invisibles.tab ? match
         "#{@escapeString(match)}"
     else
       startIndex = 0
-      endIndex = html.length
+      endIndex = @value.length

       leadingHtml = ''
       trailingHtml = ''

-      if hasLeadingWhitespace and match = LeadingWhitespaceRegex.exec(html)
+      if hasLeadingWhitespace and match = LeadingWhitespaceRegex.exec(@value)
         classes = 'leading-whitespace'
         classes += ' indent-guide' if hasIndentGuide
         classes += ' invisible-character' if invisibles.space
@@ -157,7 +155,7 @@

         startIndex = match[0].length

-      if hasTrailingWhitespace and match = TrailingWhitespaceRegex.exec(html)
+      if hasTrailingWhitespace and match = TrailingWhitespaceRegex.exec(@value)
         classes = 'trailing-whitespace'
         classes += ' indent-guide' if hasIndentGuide and not hasLeadingWhitespace
         classes += ' invisible-character' if invisibles.space
@@ -171,14 +169,14 @@

       if @value.length > maxTokenLength
         while startIndex < endIndex
-          fragments.push "" + @escapeString(html, startIndex, startIndex + maxTokenLength) + ""
+          fragments.push "" + @escapeString(@value, startIndex, startIndex + maxTokenLength) + ""
           startIndex += maxTokenLength
       else
-        fragments.push @escapeString(html, startIndex, endIndex)
+        fragments.push @escapeString(@value, startIndex, endIndex)

       fragments.push trailingHtml
-
-    fragments.join('')
+      html = fragments.join('')
+    html

   escapeString: (str, startIndex, endIndex) ->
     strLength = str.length


Added GitHub status script

Added GitHub status script

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

--- src/scripts/github-status.coffee
+++ src/scripts/github-status.coffee
@@ -0,0 +1,57 @@
+# Description:
+#   Show current GitHub status and messages
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot github status - Returns the current system status and timestamp.
+#   hubot github status last - Returns the last human communication, status, and timestamp.
+#   hubot github status messages - Returns the most recent human communications with status and timestamp.
+#
+# Author:
+#   voke
+
+module.exports = (robot) ->
+  robot.respond /github status$/i, (msg) ->
+    status msg
+
+  robot.respond /github status last$/i, (msg) ->
+    lastMessage msg
+
+  robot.respond /github status messages$/i, (msg) ->
+    statusMessages msg
+
+# NOTE: messages contains new lines for some reason.
+formatString = (string) ->
+  decodeURIComponent(string.replace(/(\n)/gm," "))
+
+status = (msg) ->
+  msg.http('https://status.github.com/api/status.json')
+    .get() (err, res, body) ->
+      json = JSON.parse(body)
+      now = new Date()
+      date = new Date(json['last_updated'])
+      secondsAgo = Math.round((now.getTime() - date.getTime()) / 1000)
+      msg.send "Status: #{json['status']} (#{secondsAgo} seconds ago)"
+
+lastMessage = (msg) ->
+  msg.http('https://status.github.com/api/last-message.json')
+    .get() (err, res, body) ->
+      json = JSON.parse(body)
+      date = new Date(json['created_on'])
+      msg.send "Status: #{json['status']}\n" +
+               "Message: #{formatString(json['body'])}\n" +
+               "Date: #{date.toLocaleString()}"
+
+statusMessages = (msg) ->
+  msg.http('https://status.github.com/api/messages.json')
+    .get() (err, res, body) ->
+      json = JSON.parse(body)
+      buildMessage = (message) ->
+        date = new Date(message['created_on'])
+        "[#{message['status']}] #{formatString(message['body'])} (#{date.toLocaleString()})"
+      msg.send (buildMessage message for message in json).join('\n')


Adapted the test for the new MiB error message.

--- test/test.coffee
+++ test/test.coffee
@@ -489,7 +489,7 @@
         dropzone.accept { size: 2 * 1024 * 1024, type: "audio/mp3" }, (err) -> expect(err).to.be.undefined

       it "shouldn't pass if the filesize is too big", ->
-        dropzone.accept { size: 10 * 1024 * 1024, type: "audio/mp3" }, (err) -> err.should.eql "File is too big (10MB). Max filesize: 4MB."
+        dropzone.accept { size: 10 * 1024 * 1024, type: "audio/mp3" }, (err) -> err.should.eql "File is too big (10MiB). Max filesize: 4MiB."

       it "should properly accept files which mime types are listed in acceptedFiles", ->


DataForm: Added "inner form" to demo for more design cases.

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/programmfabrik/coffeescript-ui-demo.git/'


Fix katon status

Fix katon status

--- src/cli/controls/help.coffee
+++ src/cli/controls/help.coffee
@@ -19,9 +19,9 @@
   status: ->
     output = common.execSync 'launchctl list | grep \'katon\''

-    katonLoaded = output.indexOf('katon') isnt -1
+    katonLoaded = output.indexOf('katon\n') isnt -1

     if not katonLoaded
       console.log()
-      console.log "#{chalk.red 'katon'} is not loaded, use `katon start`"
+      console.log "#{chalk.red 'katon'} daemon is not loaded, use `katon start`"


Open new rooms for direct messages correctly via spotlight

--- packages/rocketchat-ui/views/app/spotlight/spotlight.coffee
+++ packages/rocketchat-ui/views/app/spotlight/spotlight.coffee
@@ -46,6 +46,7 @@
 				if server?.users?.length > 0
 					for user in server.users when not _.findWhere(memory, {t: 'd', name: user.username})?
 						memory.push({
+							_id: user._id
 							t: 'd',
 							name: user.username
 						})
@@ -53,6 +54,7 @@
 				if server?.rooms?.length > 0
 					for room in server.rooms
 						memory.push({
+							_id: room._id
 							t: 'c',
 							name: room.name
 						})
@@ -62,15 +64,19 @@

 			getValue: (_id, collection, firstPartValue) ->
 				doc = collection.findOne(_id)
-				# if doc.type is 'u'
-				# 	Meteor.call 'createDirectMessage', doc.username, (error, result) ->
-				# 		if error
-				# 			return handleError(error)

-				# 		if result?.rid?
-				# 			FlowRouter.go('direct', { username: doc.username })
-				# 			event.currentTarget.value = ''
-				# else if doc.type is 'r'
+				if not doc?
+					server = serverResults.get()
+
+					if server?.users?.length > 0
+						doc = _.findWhere(server.users, {_id: _id})
+						if doc?
+							doc.name = doc.username
+							doc.t = 'd'
+
+					if not doc? and server?.rooms?.length > 0
+						doc = _.findWhere(server.rooms, {_id: _id})
+
 				FlowRouter.go FlowRouter.path RocketChat.roomTypes.getRouteLink doc.t, doc

 				spotlight.hide()


added ability to invoke method from event

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


new feature tests for signing up

new feature tests for signing up

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


Custom validators for file upload support

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

--- static/script/validators.coffee
+++ static/script/validators.coffee
@@ -0,0 +1,54 @@
+window.ParsleyConfig ?= {}
+window.settlers ?= {}
+window.settlers.parsley_validators ?= {}
+
+window.settlers.parsley_validators.expand_constraints = (constraints) ->
+  return constraints.split(',')
+
+window.settlers.parsley_validators.init = ($) ->
+  window.ParsleyConfig = $.extend true, {}, window.ParsleyConfig,
+    validators:
+      filedimensionsmax: (val, constraints, field) ->
+        constraints = window.settlers.parsley_validators.expand_constraints constraints
+
+        if $(constraints[0])[0].naturalWidth <= constraints[1] and $(constraints[0])[0].naturalHeight <= constraints[2]
+          return true
+
+        return false
+
+      filedimensionsmin: (val, constraints, field) ->
+        constraints = window.settlers.parsley_validators.expand_constraints constraints
+
+        if $(constraints[0])[0].naturalWidth >= constraints[1] and $(constraints[0])[0].naturalHeight >= constraints[2]
+          return true
+
+        return false
+
+      filesize: (val, limit, field) ->
+        limit = Number limit
+
+        file = field.$element[0].files[0]
+        if not file
+          return true
+
+        if file.size <= limit
+          return true
+
+        return false
+
+      filetype: (val, constraints, field) ->
+        file = field.$element[0].files[0]
+        if not file
+          return true
+
+        if constraints.indexOf(file.type) >= 0
+          return true
+
+        return false
+
+    messages:
+      filedimensionsmax: 'Image is bigger than allowed'
+      filedimensionsmin: 'Image is smaller than required'
+      filesize: 'Image is bigger than allowed'
+
+window.settlers.parsley_validators.init(window.jQuery || window.Zepto)


added theme test script

added theme test script

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

--- dw.js/test/theme-test.coffee
+++ dw.js/test/theme-test.coffee
@@ -0,0 +1,49 @@
+
+_ = require 'underscore'
+vows = require 'vows'
+assert = require 'assert'
+
+dw = require '../dw-2.0.js'
+
+
+vows
+    .describe('Some basic tests for dw.theme')
+    .addBatch
+
+        'create a theme':
+            'topic': null
+            'create a theme': () ->
+                dw.theme.register 'A',
+                    colors:
+                        palette: ['red','green','yellow','purple']
+                    padding: 10
+                    margin:
+                        top: 5
+                        left: 5
+                        bottom: 5
+                        right: 5
+
+            'check colors in A': () ->
+                assert.deepEqual dw.theme('A').colors.palette, ['red','green','yellow','purple']
+
+            'create a second theme that extends A': () ->
+                dw.theme.register 'B', 'A',
+                    colors:
+                        palette: ['white','blue']
+                    margin:
+                        top: 10
+
+            'check that B inherits from A': () ->
+                assert.equal dw.theme('B').padding, 10
+
+            'check that B has set new margin.top': () ->
+                assert.equal dw.theme('B').margin.top, 10
+
+            'check that B has still A\'s other margins': () ->
+                assert.equal dw.theme('B').margin.left, 5
+                assert.equal dw.theme('B').margin.bottom, 5
+
+            'check colors in B': () ->
+                assert.deepEqual dw.theme('A').colors.palette, ['white','blue']
+
+    .export module


Introduced $scope.is_subtract_valid and $scope.subtract_length to avoid repeat calls to $scope.isSubtractValid on every digest loop

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


Remove laravel event and route scanner tasks

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/Stichoza/laravel-boilerplate.git/'


Add phpunit

Add phpunit

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/HkApps.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/wancy86/NOTE.git/'


Launch forced login split test

Launch forced login split test

--- components/split_test/running_tests.coffee
+++ components/split_test/running_tests.coffee
@@ -15,13 +15,11 @@
 # module.exports = {}

 module.exports =
-  # Set up so we can slowly activate new_homepage_buckets
-  # as we are comfortable with the load and performance
   forced_login_inquiry:
     key: 'forced_login_inquiry'
     outcomes:
-      default: 100
-      force_login: 0
+      default: 50
+      force_login: 50
     edge: 'force_login'
     dimension: 'dimension15'


added classes example

added classes example

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


added a widget controller that can be inherited from.

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

--- app/assets/javascripts/habberdash/lib/widget.js.coffee
+++ app/assets/javascripts/habberdash/lib/widget.js.coffee
@@ -0,0 +1,13 @@
+class Habberdash.Widget extends Spine.Controller
+
+  @specification: (spec) ->
+    @spec = spec
+
+
+  @addDependency: (name, source) ->
+    console.debug('addDependency', name, source)
+
+
+  constructor: ->
+    super
+


Add relationship-building functions.

Add relationship-building functions.

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


don't drop items to bots and banned people

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


Client: Activity: Test: Created CommentListView dumb component

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


StacksV2: default template content

StacksV2: default template content

error: pathspec 'client/admin/lib/views/stacksv2/defaulttemplate.coffee' did not match any file(s) known to git

--- client/admin/lib/views/stacksv2/defaulttemplate.coffee
+++ client/admin/lib/views/stacksv2/defaulttemplate.coffee
@@ -0,0 +1,18 @@
+module.exports = """
+  {
+    "provider": {
+      "aws": {
+        "access_key": "${var.access_key}",
+        "secret_key": "${var.secret_key}"
+      }
+    },
+    "resource": {
+      "aws_instance": {
+        "example": {
+          "instance_type": "t2.micro",
+          "ami": ""
+        }
+      }
+    }
+  }
+"""


Correctly define different toJSON() and toJson() methods.

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


atom: tabs

atom: tabs

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


Create get-elements-by-class-name.coffee

error: pathspec 'get-elements-by-class-name/get-elements-by-class-name.coffee' did not match any file(s) known to git

--- get-elements-by-class-name/get-elements-by-class-name.coffee
+++ get-elements-by-class-name/get-elements-by-class-name.coffee
@@ -0,0 +1,39 @@
+getElementsByClassName = (element, className) ->
+  found = []
+  (traverseDom = (node) ->
+    # Store the current node and current nodes class in a temporary variable
+    currentNode = undefined
+    currentClass = undefined
+
+    # Loop through all the child nodes
+    i = 0
+
+    while i < node.childNodes.length
+      currentNode = node.childNodes[i]
+      currentClass = currentNode.className
+
+      # Check if the class name exists within the current nodes class
+      # I believe I learnt of this technique from jQuery source code
+      found.push currentNode  if currentClass and ~(" " + currentClass + " ").indexOf(" " + className + " ")
+
+      # If the current node have more child nodes, continue traversing
+      currentNode.childNodes and traverseDom(currentNode)
+      i++
+  ) element
+  found
+
+getElementsByClassName = (element, className) ->
+  # This function takes an easier approach, using a regular expression and
+  # getting all elements straight up using the asterisk selector
+  found = []
+  regex = new RegExp("(^| )" + className + "($| )")
+  elements = element.getElementsByTagName("*")
+
+  # Loop through all the elements checking the class names against the
+  # regular expression - when it suceeds just push it into the output array
+  i = 0
+
+  while i < elements.length
+    found.push elements[i]  if regex.test(elements[i].className)
+    i++
+  found


Reorganized views.

Reorganized views.

--- static/js/clickyspinny.coffee
+++ static/js/clickyspinny.coffee
@@ -17,9 +17,31 @@
   '

   templates.projects =
-  ''
+  '
Projects

+
Zoom Zoom: Backbone.js + Coffeescript app.

+
another

+
another

+
another

+  '

-  # Views
+  ### Views ###
+
+  # App Loader View
+  MainView = Backbone.View.extend
+    el: $("body")
+    template: templates.base
+
+    initialize: ->
+      @benView = new BenView
+
+    render: ->
+      $(@el).html @template
+      @
+
+    addContent: ->
+      $("div#content", @el).append @benView.render().el
+      @
+
   BenView = Backbone.View.extend
     tagName: 'span'
     className: 'face'
@@ -48,22 +70,6 @@
       #console.log "Yeah, I got that trendy Git-Hub thing up there."
       @

-  # App Loader View
-  MainView = Backbone.View.extend
-    el: $("body")
-    template: templates.base
-
-    initialize: ->
-      @benView = new BenView
-
-    render: ->
-      $(@el).html @template
-      @
-
-    addContent: ->
-      $("div#content", @el).append @benView.render().el
-      @
-
   # Create the app
   mainView = new MainView
   mainView.render().addContent()


Fix the typo

Fix the typo

--- lib/Task/DecisionTask.coffee
+++ lib/Task/DecisionTask.coffee
@@ -70,7 +70,7 @@
     @removeUpdate update for update in executionContext.updates

   DecisionTaskTimedOut: (event, attributes) -> # noop
-    # We shouldn't re-schedule the decision task, because SWF have already re-scheduled it
+    # We shouldn't re-schedule the decision task, because SWF has already re-scheduled it
     @info "DecisionTask:DecisionTaskTimedOut", @details({event: event, attributes: attributes})

   ActivityTaskStarted: (event, attributes) -> # noop


PersistentConnection: Don't emit Disconnect until binaryState is 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/IcecaveLabs/overpass-websocket-client.git/'


enter-password page auto-fills s@ndbox password

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


Adding a test for #2273

Adding a test for #2273

--- test/comprehensions.coffee
+++ test/comprehensions.coffee
@@ -244,6 +244,13 @@

   exxes = ('x' for [0...10])
   ok exxes.join(' ') is 'x x x x x x x x x x'
+
+
+test "Loop variables should be able to reference outer variables", ->
+  outer = 1
+  do ->
+    null for outer in [1, 2, 3]
+  eq outer, 3

 test "Lenient on pure statements not trying to reach out of the closure", ->


Fix Article fetching specs

Fix Article fetching specs

--- test/models/article.coffee
+++ test/models/article.coffee
@@ -4,75 +4,55 @@
 Article = require '../../models/article.coffee'
 sinon = require 'sinon'
 fixtures = require '../helpers/fixtures.coffee'
-Q = require 'q'

 describe "Article", ->
-
   beforeEach ->
     sinon.stub Backbone, 'sync'
     @article = new Article
-    Backbone.sync.returns (@dfd = Q.defer()).promise

   afterEach ->
     Backbone.sync.restore()

   describe '#fetchWithRelated', ->
-
     it 'gets all the related data from the article', (done) ->
       @article.set sections: []
-      @article.fetchWithRelated
-        success: (data) ->
-          data.article.get('title').should.equal 'Moo'
-          done()
-      Backbone.sync.args[0][2].success _.extend fixtures.article, title: 'Moo'
+      @article.fetchWithRelated success: (data) ->
+        data.article.get('title').should.equal 'Moo'
+        done()
+      Backbone.sync.args[0][2].success _.extend {}, fixtures.article, title: 'Moo'
       Backbone.sync.args[1][2].success [fixtures.article]
-      @dfd.resolve({})

     it 'gets the slideshow artworks', (done) ->
-      @article.fetchWithRelated
-        success: (data) ->
+      @article.fetchWithRelated success: (data) ->
+        # It looks like there's a very tight race condition here between
+        # the success callback and the promise resolution.
+        _.defer =>
           data.slideshowArtworks.first().get('title').should.equal 'foobar'
           done()
-      Backbone.sync.args[0][2].success _.extend fixtures.article,
-        title: 'Moo'
-        sections: [{ type: 'slideshow', items: [{ type: 'artwork', id: 'foo'}] }]
+      Backbone.sync.args[0][2].success _.extend {}, fixtures.article,
+        title: 'Moo', sections: [type: 'slideshow', items: [type: 'artwork', id: 'foo']]
       Backbone.sync.args[1][2].success [fixtures.article]
-      Backbone.sync.returns (dfd = Q.defer()).promise
-      @dfd.resolve({})
       _.defer =>
         Backbone.sync.args[2][2].success fabricate 'artwork', title: 'foobar'
-        dfd.resolve()

     it 'fetches vertical content if need be', ->
-      @article.fetchWithRelated
-        success: (data) ->
-          data.slideshowArtworks.first().get('title').should.equal 'foobar'
-          done()
-      Backbone.sync.args[0][2].success _.extend fixtures.article,
-        title: 'Moo'
-        vertical_id: 'foo'
+      @article.fetchWithRelated success: (data) ->
+        data.slideshowArtworks.first().get('title').should.equal 'foobar'
+        done()
+      Backbone.sync.args[0][2].success _.extend {}, fixtures.article, title: 'Moo', vertical_id: 'foo'
       Backbone.sync.args[1][2].success [fixtures.article]
-      Backbone.sync.returns (dfd = Q.defer()).promise
-      @dfd.resolve({})
       _.defer =>
         Backbone.sync.args[2][2].success fixtures.vertical
         Backbone.sync.args[3][2].success [fixtures.articles]
-        dfd.resolve()

     it 'works for those rare sectionless articles', (done) ->
-      @article.fetchWithRelated
-        success: (data) ->
-          data.article.get('title').should.equal 'Moo'
-          done()
-      Backbone.sync.args[0][2].success _.extend fixtures.article,
-        title: 'Moo'
-        sections: []
+      @article.fetchWithRelated success: (data) ->
+        data.article.get('title').should.equal 'Moo'
+        done()
+      Backbone.sync.args[0][2].success _.extend {}, fixtures.article, title: 'Moo', sections: []
       Backbone.sync.args[1][2].success [fixtures.article]
-      @dfd.resolve({})
-

   describe '#strip', ->
-
     it 'returns the attr without tags', ->
       @article.set 'lead_paragraph', '

'
       @article.strip('lead_paragraph').should.equal ''


Add invisible class to invisible block decorations

--- src/block-decorations-component.coffee
+++ src/block-decorations-component.coffee
@@ -69,15 +69,13 @@
     @updateBlockDecorationNode(id)

   updateBlockDecorationNode: (id) ->
-    newBlockDecorationState = @newState.blockDecorations[id]
-    oldBlockDecorationState = @oldState.blockDecorations[id]
     blockDecorationNode = @blockDecorationNodesById[id]

-    if newBlockDecorationState.isVisible
+    if @newState.blockDecorations[id].isVisible
+      blockDecorationNode.previousSibling.classList.remove("atom--invisible-block-decoration")
       blockDecorationNode.classList.remove("atom--invisible-block-decoration")
+      blockDecorationNode.nextSibling.classList.remove("atom--invisible-block-decoration")
     else
+      blockDecorationNode.previousSibling.classList.add("atom--invisible-block-decoration")
       blockDecorationNode.classList.add("atom--invisible-block-decoration")
-
-    if oldBlockDecorationState.screenRow isnt newBlockDecorationState.screenRow
-      blockDecorationNode.dataset.screenRow = newBlockDecorationState.screenRow
-      oldBlockDecorationState.screenRow = newBlockDecorationState.screenRow
+      blockDecorationNode.nextSibling.classList.add("atom--invisible-block-decoration")


focus input when showed

focus input when showed

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


camelCaseCorrection

camelCaseCorrection

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


Create byte-format.coffee

Create byte-format.coffee

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

--- byte-format/byte-format.coffee
+++ byte-format/byte-format.coffee
@@ -0,0 +1,14 @@
+module.exports = (bytes, precision) ->
+  suffixes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
+  factor = Math.pow(10, (if precision > 0 then precision else 2))
+
+  # Using a for loop since it's perfect for this kind of problem
+  i = bytes
+  k = 0
+
+  while i >= 1024 and k < suffixes.length
+    i /= 1024
+    k++
+
+  # Return the number rounded to precision
+  (Math.round(i * factor) / factor) + " " + suffixes[k]


implement switching between tabs

implement switching between tabs

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


Don't expand truncated sidebar items on mobile

--- assets/javascripts/views/sidebar/sidebar.coffee
+++ assets/javascripts/views/sidebar/sidebar.coffee
@@ -10,7 +10,7 @@
     escape: 'onEscape'

   init: ->
-    @addSubview @hover  = new app.views.SidebarHover @el unless $.isTouchScreen()
+    @addSubview @hover  = new app.views.SidebarHover @el unless app.isMobile() or $.isTouchScreen()
     @addSubview @search = new app.views.Search

     @search


Clickable legend toggles show/hide of vehicle type

--- app/coffeescripts/DemandVisualizer.coffee
+++ app/coffeescripts/DemandVisualizer.coffee
@@ -73,12 +73,24 @@
         text(name)

       @graph.append('svg:rect').
+        attr('id', "legend-#{idx}").
         attr('x', 100 + 50*idx).
         attr('y', 10).
         attr('width', 50).
         attr('height', 30).
         attr('opacity', '0.4').
-        attr('fill', vehicleTypeColors[idx])
+        attr('enabled', true).
+        attr('fill', vehicleTypeColors[idx]).
+        on 'click', ->
+          el = $(@)
+          if el.attr('enabled') == 'true'
+            el.attr('opacity', '0.0')
+            el.attr('enabled', false)
+            d3.selectAll(".vehicle-graph-#{idx}").style('visibility','hidden')
+          else
+            el.attr('opacity', '0.4')
+            el.attr('enabled', true)
+            d3.selectAll(".vehicle-graph-#{idx}").style('visibility','visible')

     vals = @demand.demands_by_vehicle_type()

@@ -162,6 +174,7 @@
         @graph.append("svg:path").
           attr("d", wrapSteps(vehicleTypeVals)).
         	attr("fill", 'none').
+          attr('class', "vehicle-graph-#{i}").
         	attr("stroke", 'black')

         @graph.selectAll("stdDevBoxes").
@@ -173,6 +186,7 @@
         	attr("width", xScale(1)).
           attr("fill", vehicleTypeColors[i]).
         	attr("opacity", "0.4").
+          attr('class', "vehicle-graph-#{i}").
         	attr("height", (d) ->
             # Enforce coloring even if stddev. not present to distinguish
             # vehicle types


Add initial Save Progress module

Add initial Save Progress module

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


add created notification

add created notification

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/hi104/ember-note.git/'


Donkey dines

Donkey dines

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


add random id to test

add random id to test

--- src/mobile/apps/artwork/components/image/test/view.coffee
+++ src/mobile/apps/artwork/components/image/test/view.coffee
@@ -51,7 +51,7 @@

       it 'adds link to signup page', ->
         @view.renderSave()
-        @view.$('.artwork-header-module__favorite-button').attr('href').should.containEql "/sign_up?action=save&objectId=skull9&kind=artwork&redirect-to=about:blank"
+        @view.$('.artwork-header-module__favorite-button').attr('href').should.containEql "/sign_up?action=save&objectId=#{@view.artwork.id}&kind=artwork&redirect-to=about:blank"

     describe '#saveArtwork', ->


Use warning style to show beta plugin

Use warning style to show beta plugin

--- views/components/settings/parts/plugin-config.cjsx
+++ views/components/settings/parts/plugin-config.cjsx
@@ -94,6 +94,10 @@
   registry: mirror[config.get "packageManager.mirror", 0].server,
   http_proxy: 'http://127.0.0.1:12450'
 }
+
+ifStableVersion = (version) ->
+  semver.satisfies version,
+    ">= #{semver.major version}.#{semver.minor version}.#{semver.patch version}"

 PluginConfig = React.createClass
   getInitialState: ->
@@ -365,7 +369,7 @@
               {plugin.displayName}
                @{plugin.author}

-                <Label bsStyle='primary'
+
                   <FontAwesome name='cloud-upload' />
                   Version {@state.latest[plugin.packageName]}


Add Gruntfile

Add Gruntfile

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

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,174 @@
+module.exports = (grunt) ->
+  jasmineRequireTemplate = require 'grunt-template-jasmine-requirejs'
+  jasmineIstanbulTemplate = require 'grunt-template-jasmine-istanbul'
+
+  jasmineSpecRunner = 'spec-runner.html'
+  coverageSpecRunner = 'coverage-runner.html'
+
+  sourcePath = 'src/js/**/*.js'
+
+  documentation = 'doc'
+  testRequireConfig = 'test/js/js-test-require-config.js'
+  specs = 'test/js/spec/**/*.js'
+  styles = 'bower_components/hp-autonomy-js-testing-utils/src/css/bootstrap-stub.css'
+  serverPort = 8000
+  host = "http://localhost:#{serverPort}/"
+  helpers = 'bower_components/hp-autonomy-js-testing-utils/src/js/jasmine-custom-matcher.js'
+
+  grunt.initConfig
+    pkg: grunt.file.readJSON 'package.json'
+    clean: [
+      jasmineSpecRunner
+      coverageSpecRunner
+      'bin'
+      '.grunt'
+      documentation
+    ]
+    connect:
+      server:
+        options:
+          port: serverPort
+    jasmine:
+      test:
+        src: sourcePath
+        options:
+          helpers: helpers
+          host: host
+          keepRunner: true
+          outfile: jasmineSpecRunner
+          specs: specs
+          styles: styles
+          template: jasmineRequireTemplate
+          templateOptions:
+            requireConfigFile: testRequireConfig
+      coverage:
+        src: sourcePath
+        options:
+          helpers: helpers
+          host: host
+          keepRunner: true
+          outfile: coverageSpecRunner
+          specs: specs
+          styles: styles
+          template: jasmineIstanbulTemplate
+          templateOptions:
+            coverage: 'bin/coverage/coverage.json'
+            replace: false
+            report:
+              type: 'text'
+            template: jasmineRequireTemplate
+            templateOptions:
+              requireConfigFile: testRequireConfig
+              requireConfig:
+                config:
+                  instrumented: {
+                    src: grunt.file.expand(sourcePath)
+                  }
+                callback: () ->
+                  define('instrumented', ['module'], (module) ->
+                    module.config().src
+                  )
+                  require ['instrumented'], (instrumented) ->
+                    oldLoad = requirejs.load
+                    requirejs.load = (context, moduleName, url) ->
+                      if url.substring(0, 1) == '/'
+                        url = url.substring 1
+                      else if url.substring(0, 2) == './'
+                        url = url.substring 2
+
+                      # redirect
+                      if instrumented.indexOf(url) > -1
+                        url = './.grunt/grunt-contrib-jasmine/' + url;
+
+                      return oldLoad.apply(this, [context, moduleName, url]);
+                    return
+                  return
+
+    jshint:
+      all: [
+        sourcePath
+        specs
+      ],
+      options:
+        asi: true
+        bitwise: true
+        browser: true
+        camelcase: true
+        curly: true
+        devel: true
+        eqeqeq: true
+        es3: true
+        expr: true
+        forin: true
+        freeze: true
+        jquery: true
+        latedef: true
+        newcap: true
+        noarg: true
+        noempty: true
+        nonbsp: true
+        undef: true
+        unused: true
+        globals:
+          define: false
+          _: false
+          expect: false
+          it: false
+          require: false
+          describe: false
+          sinon: false
+          beforeEach: false
+          afterEach: false
+          jasmine: false
+          runs: false
+          waits: false
+          waitsFor: false
+          spyOn: false
+          xit: false
+          xdescribe: false
+    coffeelint:
+      app: [
+        'Gruntfile.coffee'
+      ]
+      options:
+        max_line_length:
+          level: 'ignore'
+    jsdoc:
+      dist:
+        src: ['src/**/*.js', 'README.md']
+        options:
+          destination: documentation
+          template: 'node_modules/ink-docstrap/template'
+          configure: 'jsdoc.conf.json'
+    'gh-pages':
+      'default':
+        src: '**/*'
+        options:
+          base: 'doc'
+          message: 'Update documentation'
+      travis:
+        src: '**/*'
+        options:
+          base: 'doc'
+          message: 'Update documentation'
+          repo: 'https://' + process.env.GH_TOKEN + '@github.com/' + process.env.TRAVIS_REPO_SLUG
+          user:
+            name: 'Travis CI Server'
+            email: 'alex.scown@hp.com'
+
+  grunt.loadNpmTasks 'grunt-contrib-clean'
+  grunt.loadNpmTasks 'grunt-contrib-connect'
+  grunt.loadNpmTasks 'grunt-contrib-jasmine'
+  grunt.loadNpmTasks 'grunt-contrib-jshint'
+  grunt.loadNpmTasks 'grunt-coffeelint'
+  grunt.loadNpmTasks 'grunt-gh-pages'
+  grunt.loadNpmTasks 'grunt-jsdoc'
+
+  grunt.registerTask 'default', ['lint', 'connect:server', 'jasmine:test', 'jasmine:coverage']
+  grunt.registerTask 'test', ['connect:server', 'jasmine:test']
+  grunt.registerTask 'browser-test', ['connect:server:keepalive']
+  grunt.registerTask 'coverage', ['connect:server', 'jasmine:coverage']
+  grunt.registerTask 'lint', ['jshint', 'coffeelint']
+  grunt.registerTask 'doc', ['jsdoc']
+  grunt.registerTask 'push-doc', ['doc', 'gh-pages:default']
+  grunt.registerTask 'push-doc-travis', ['doc', 'gh-pages:travis']


Add new grunt task 'develop'

Add new grunt task 'develop'

`grunt develop` combines both `grunt compile` and `grunt watch`
into one task.

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


Run build instead of install for rebuild task

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

     shell:
       rebuild:
-        command: 'npm install'
+        command: 'npm build'
         options:
           stdout: true
           stderr: true


client/home: add creditcardcontainer component

error: pathspec 'client/home/lib/billing/components/creditcardcontainer.coffee' did not match any file(s) known to git

--- client/home/lib/billing/components/creditcardcontainer.coffee
+++ client/home/lib/billing/components/creditcardcontainer.coffee
@@ -0,0 +1,49 @@
+{ reduxForm, formValueSelector, SubmissionError } = require 'redux-form'
+{ connect } = require 'react-redux'
+{ createSelector } = require 'reselect'
+validator = require 'card-validator'
+
+{ CREATE_TOKEN } = stripe = require 'app/redux/modules/stripe'
+
+CreateCreditCardForm = require 'lab/CreateCreditCardForm'
+
+FORM_NAME = 'create-credit-card'
+formValue = formValueSelector(FORM_NAME)
+
+realNumber = (state) -> formValue(state, 'number')?.replace /\D/g, ''
+
+cardBrand = createSelector(
+  realNumber
+  (number) -> number and validator.number(number).card?.type
+)
+
+mapStateToProps = (state) ->
+  return {
+    values:
+      number: formValue state, 'number'
+      name: formValue state, 'name'
+      exp_year: formValue state, 'exp_year'
+      exp_month: formValue state, 'exp_month'
+      brand: cardBrand state
+      realNumber: realNumber state
+  }
+
+mapErrorsToValues = (errors) ->
+  errors.reduce (res, { error }) ->
+    res[error.param] = error.message
+    return res
+  , {}
+
+
+formOptions =
+  form: FORM_NAME
+  onSubmit: (values, dispatch) ->
+    dispatch(stripe.createToken values)
+      .catch (errors) -> throw new SubmissionError mapErrorsToValues errors
+
+
+CreateCreditCardForm = connect(mapStateToProps)(CreateCreditCardForm)
+CreateCreditCardForm = reduxForm(formOptions)(CreateCreditCardForm)
+
+module.exports = CreateCreditCardForm
+


[spec] Add spec to ModerationApp component

closes CNVS-23616

Test Plan:
  - Automated tests pass

Change-Id: I1d09653eefd17fae807849248feeb7ef28ec04fa
Reviewed-on: https://gerrit.instructure.com/64216
Reviewed-by: Dan Minkevitch <2591e5f46f28d303f9dc027d475a5c60d8dea17a@instructure.com>
Tested-by: Jenkins
Product-Review: Clay Diffrient <9dff2e5c98626d20d2848250c411e8009465bb87@instructure.com>
QA-Review: Clay Diffrient <9dff2e5c98626d20d2848250c411e8009465bb87@instructure.com>

error: pathspec 'spec/coffeescripts/jsx/assignments/ModerationAppSpec.coffee' did not match any file(s) known to git

--- spec/coffeescripts/jsx/assignments/ModerationAppSpec.coffee
+++ spec/coffeescripts/jsx/assignments/ModerationAppSpec.coffee
@@ -0,0 +1,47 @@
+define [
+  'react'
+  'jsx/assignments/ModerationApp'
+  'jsx/assignments/actions/ModerationActions'
+], (React, ModerationApp, Actions) ->
+
+  TestUtils = React.addons.TestUtils
+
+
+  module 'ModerationApp',
+    setup: ->
+      @store =
+        subscribe: sinon.spy()
+        dispatch: sinon.spy()
+        getState: -> {
+          studentList: {
+            students: []
+            sort: 'asc'
+          },
+          flashMessage: {},
+          assignment: {
+            published: false
+          }
+        }
+
+      @moderationApp = TestUtils.renderIntoDocument(ModerationApp(store: @store))
+
+
+    teardown: ->
+      @store = null
+      React.unmountComponentAtNode(@moderationApp.getDOMNode().parentNode)
+
+  test 'it subscribes to the store when mounted', ->
+    # TODO: Once the rest of the components get dumbed down, this could be
+    #       changed to be .calledOnce
+    ok @store.subscribe.called, 'subscribe was called'
+
+  test 'it dispatches a single call to apiGetStudents when mounted', ->
+    ok @store.dispatch.calledOnce, 'dispatch was called once'
+
+  test 'it updates state when a change event happens', ->
+    @store.getState = -> {
+      newState: true
+    }
+    @moderationApp.handleChange()
+
+    ok @moderationApp.state.newState, 'state was updated'


fix bug where rubric grades weren't re-loading based on existing tiers

--- app/assets/javascripts/angular/factories/MetricPrototypeFactory.js.coffee
+++ app/assets/javascripts/angular/factories/MetricPrototypeFactory.js.coffee
@@ -6,7 +6,6 @@
       @badges = {}
       @id = if attrs.id then attrs.id else null
       @fullCreditTier = null
-      @addTiers(attrs["tiers"]) if attrs["tiers"] #add tiers if passed on init
       @name = if attrs.name then attrs.name else ""
       @rubricId = if attrs.rubric_id then attrs.rubric_id else @$scope.rubricId
       if @id
@@ -28,6 +27,7 @@
       if @rubricGrade
         @rubricGradeTierId = @rubricGrade.tier_id
       else
+        alert("no rubric grade!!")
         @rubricGradeTierId = null

       if @rubricGrade
@@ -35,7 +35,7 @@
       else
         @comments = ""

-      # alert(@selectedTier.id)
+      @addTiers(attrs["tiers"]) if attrs["tiers"] #add tiers if passed on init
       # would this always have an id?
     alert: ()->
       alert("snakes!")
@@ -43,6 +43,7 @@
       newTier = new TierPrototype(@, attrs, @$scope)
       @tiers.push newTier
       if @rubricGradeTierId and @rubricGradeTierId == newTier.id
+        alert("selected!")
         @selectedTier = newTier

     addTiers: (tiers)->


JUser: better usage of hat.rack

JUser: better usage of hat.rack

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


Use more verbose 'return this' i.o. '@' for 'chainability returns'.

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/pombredanne/jquery-treetable.git/'


Improved ready() to return existing deferred instead of creating a new one.

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


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


Schedule updates for emoov

Schedule updates for emoov

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


Remove the unsubscribe spy

Remove the unsubscribe spy

Sorry @nathansobo, this is making the window specs fail

--- spec/window-spec.coffee
+++ spec/window-spec.coffee
@@ -107,8 +107,6 @@

   describe ".removeEditorWindow()", ->
     it "unsubscribes from all buffers", ->
-      spyOn atom.windowEventHandler, 'unsubscribe'
-
       waitsForPromise ->
         atom.workspace.open("sample.js")


Give a pass on the tweet occurrence if in dev

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


Used centroid for bounding box calculations for 300 or more entities.


Fix: no note value causes glitchy display

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


Fix year typo

Fix year typo

--- assets/javascripts/templates/pages/news_tmpl.coffee
+++ assets/javascripts/templates/pages/news_tmpl.coffee
@@ -24,28 +24,28 @@
   result

 app.news = [
-  [ 1394236800000, # March 8, 2013
+  [ 1394236800000, # March 8, 2014
     """ Added path bar. """,
   ], [
-    1393027200000, # February 22, 2013
+    1393027200000, # February 22, 2014
     """ New C documentation """,
   ], [
-    1392508800000, # February 16, 2013
+    1392508800000, # February 16, 2014
     """ New Moment.js documentation """,
   ], [
-    1392163200000, # February 12, 2013
+    1392163200000, # February 12, 2014
     """ The root/category pages are now included in the search index (e.g. CSS) """,
   ], [
-    1390694400000, # January 26, 2013
+    1390694400000, # January 26, 2014
     """ Updated Angular.js documentation """,
   ], [
-    1390089600000, # January 19, 2013
+    1390089600000, # January 19, 2014
     """ New D3.js and Knockout.js documentations """,
   ], [
-    1390003200000, # January 18, 2013
+    1390003200000, # January 18, 2014
     """ DevDocs is now available as a Firefox web app (currently requires Aurora). """,
   ], [
-    1389484800000, # January 12, 2013
+    1389484800000, # January 12, 2014
     """ Added alt + g shortcut for searching on Google. """,
     """ Added alt + r shortcut for revealing the current page in the sidebar. """
   ], [


Range radii - Some cleanup

Range radii - Some cleanup

--- app/lib/surface/CocoSprite.coffee
+++ app/lib/surface/CocoSprite.coffee
@@ -415,7 +415,7 @@

   createMarks: ->
     if @thang
-      allProps = ['visualRange', 'attackRange', 'voiceRange']
+      allProps = []
       allProps = allProps.concat (@thang.hudProperties ? [])
       allProps = allProps.concat (@thang.programmableProperties ? [])
       allProps = allProps.concat (@thang.moreProgrammableProperties ? [])