Provide deprecation warnings for clipScreenPosition parameters

Based on a cursory search, there’s only one package using that API. Even though
we could submit a PR, we’re introducing deprecations to ensure we're not missing
any other package.

--- src/text-editor.coffee
+++ src/text-editor.coffee
@@ -1431,6 +1431,16 @@
   screenPositionForBufferPosition: (bufferPosition, options) ->
     throw new Error("This TextEditor has been destroyed") if @isDestroyed()

+    if options?.clip?
+      Grim.deprecate("The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.")
+      options.clipDirection ?= options.clip
+    if options?.wrapAtSoftNewlines?
+      Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapAtSoftNewlines then 'forward' else 'backward'
+    if options?.wrapBeyondNewlines?
+      Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapBeyondNewlines then 'forward' else 'backward'
+
     @displayLayer.translateBufferPosition(bufferPosition, options)

   # Essential: Convert a position in screen-coordinates to buffer-coordinates.
@@ -1442,6 +1452,16 @@
   #
   # Returns a {Point}.
   bufferPositionForScreenPosition: (screenPosition, options) ->
+    if options?.clip?
+      Grim.deprecate("The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.")
+      options.clipDirection ?= options.clip
+    if options?.wrapAtSoftNewlines?
+      Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapAtSoftNewlines then 'forward' else 'backward'
+    if options?.wrapBeyondNewlines?
+      Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapBeyondNewlines then 'forward' else 'backward'
+
     @displayLayer.translateScreenPosition(screenPosition, options)

   # Essential: Convert a range in buffer-coordinates to screen-coordinates.
@@ -1520,7 +1540,18 @@
   #     Defaults to `'closest'`.
   #
   # Returns a {Point}.
-  clipScreenPosition: (screenPosition, options) -> @displayLayer.clipScreenPosition(screenPosition, options)
+  clipScreenPosition: (screenPosition, options) ->
+    if options?.clip?
+      Grim.deprecate("The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.")
+      options.clipDirection ?= options.clip
+    if options?.wrapAtSoftNewlines?
+      Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapAtSoftNewlines then 'forward' else 'backward'
+    if options?.wrapBeyondNewlines?
+      Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapBeyondNewlines then 'forward' else 'backward'
+
+    @displayLayer.clipScreenPosition(screenPosition, options)

   # Extended: Clip the start and end of the given range to valid positions on screen.
   # See {::clipScreenPosition} for more information.
@@ -1927,6 +1958,16 @@
   #   * `autoscroll` Determines whether the editor scrolls to the new cursor's
   #     position. Defaults to true.
   setCursorScreenPosition: (position, options) ->
+    if options?.clip?
+      Grim.deprecate("The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.")
+      options.clipDirection ?= options.clip
+    if options?.wrapAtSoftNewlines?
+      Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapAtSoftNewlines then 'forward' else 'backward'
+    if options?.wrapBeyondNewlines?
+      Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
+      options.clipDirection ?= if options.wrapBeyondNewlines then 'forward' else 'backward'
+
     @moveCursors (cursor) -> cursor.setScreenPosition(position, options)

   # Essential: Add a cursor at the given position in buffer coordinates.


fix musical typing bugs

fix musical typing bugs

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


Checking whether the alias is available for use and send message to the client about the status of the request

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/shihabahmed/demo-chat-server-with-push-notification.git/'


fix(run):use config param instead of account

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


chore(gdriveService):delete unnecessary code


Update simulate_tab.coffee

Update simulate_tab.coffee

Add back in current user to nearby simulators

--- app/views/play/ladder/simulate_tab.coffee
+++ app/views/play/ladder/simulate_tab.coffee
@@ -131,7 +131,7 @@
     above = @playersAbove.models
     l = l.concat(above)
     l.reverse()
-    #l.push @me
+    l.push @me
     l = l.concat(@playersBelow.models) if @playersBelow
     if @myRank
       startRank = @myRank - 4


Redirect all HTTP requests to localhost

Redirect all HTTP requests to localhost

--- spec/helpers.coffee
+++ spec/helpers.coffee
@@ -1,4 +1,11 @@
 require "../lib/replay"
+
+
+# Redirect all HTTP requests to localhost
+DNS = require("dns")
+DNS.lookup = (domain, callback)->
+  callback null, "127.0.0.1", 4
+

 exports.assert = require("assert")


removed useless comments

removed useless comments

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


add test for index route

add test for index route

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

--- test/index_test.coffee
+++ test/index_test.coffee
@@ -0,0 +1,34 @@
+Client = require('request-json').JsonClient
+
+client = new Client "http://localhost:8888/"
+helpers = require './helpers'
+should = require 'should'
+
+describe "Index Page", ->
+
+    before helpers.before
+    after helpers.after
+
+    describe "GET /", ->
+
+        before helpers.cleanDb
+        before helpers.createEvent "2013-04-23T14:40:00.000Z",
+                    "2013-04-23T15:40:00.000Z", "Place", 3,
+                    "Something to do"
+        before helpers.createEvent "2013-04-24T13:30:00.000Z",
+                    "2013-04-24T14:00:00.000Z", "Other place", 0,
+                    "Something else to do"
+
+        after helpers.cleanDb
+
+        it "should return a 200", (done) ->
+            client.get "", (error, response, body) ->
+
+                should.not.exist error
+                should.exist response
+                should.exist body
+
+                response.should.have.property 'statusCode', 200
+                done()
+
+            , false #response is HTML, dont parse it


levels and default game states

levels and default game states

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

--- src/text_screen.coffee
+++ src/text_screen.coffee
@@ -0,0 +1,13 @@
+drawTitleText = (canvas, titleText, subtitleText) ->
+  canvas.fillColor 'white'
+  canvas.font '24px Helvetica'
+
+  canvas.centerText
+    y: App.height / 2 - 20
+    text: titleText
+
+  canvas.font '14px Helvetica'
+
+  canvas.centerText
+    y: App.height / 2
+    text: subtitleText


redirect with correct mailbox id

redirect with correct mailbox id

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


Improve props and state names in clock index

--- components/clock/index.cjsx
+++ components/clock/index.cjsx
@@ -7,14 +7,15 @@
   # -- States & Properties
   propTypes:
     className : React.PropTypes.string
-    startMode : React.PropTypes.oneOf(['hours', 'minutes'])
+    display   : React.PropTypes.oneOf(['hours', 'minutes'])
+    format    : React.PropTypes.oneOf(['24hr', 'ampm'])

   getDefaultProps: ->
     className : ''
-    startMode : 'hours'
+    display   : 'hours'
+    format    : '24hr'

   getInitialState: ->
-    mode      : @props.startMode
     radius    : 0

   # -- Lifecycle
@@ -24,8 +25,7 @@

   componentWillUpdate: ->
     center = @_getCenter()
-    if @state.center?.x != center.x && @state.center?.y != center.y
-      @setState center: center
+    @setState center: center if @state.center?.x != center.x && @state.center?.y != center.y

   componentWillUnmount: ->
     window.removeEventListener('resize', @handleResize)
@@ -58,17 +58,16 @@

         {
-          if @state.mode == 'minutes'
+          if @props.display == 'minutes'
             <Minutes
               center={@state.center}
               onChange={@onMinuteChange}
               radius={@state.radius}
               spacing={@state.radius * 0.16} />
-          else if @state.mode == 'hours'
+          else if @props.display == 'hours'
             <Hours
-              format={'24hr'}
-              initialValue={16}
               center={@state.center}
+              format={@props.format}
               onChange={@onHourChange}
               radius={@state.radius}
               spacing={@state.radius * 0.16} />


fix long line in login.coffee

fix long line in login.coffee

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


add tracking with google analytics

add tracking with google analytics

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

--- app/assets/javascripts/google_analytics.js.coffee
+++ app/assets/javascripts/google_analytics.js.coffee
@@ -0,0 +1,42 @@
+class @GoogleAnalytics
+
+  @load: ->
+    # Google Analytics depends on a global _gaq array. window is the global scope.
+    window._gaq = []
+    window._gaq.push ["_setAccount", GoogleAnalytics.analyticsId()]
+
+    # Create a script element and insert it in the DOM
+    ga = document.createElement("script")
+    ga.type = "text/javascript"
+    ga.async = true
+    ga.src = ((if "https:" is document.location.protocol then "https://ssl" else "http://www")) + ".google-analytics.com/ga.js"
+    firstScript = document.getElementsByTagName("script")[0]
+    firstScript.parentNode.insertBefore ga, firstScript
+
+    # If Turbolinks is supported, set up a callback to track pageviews on page:change.
+    # If it isn't supported, just track the pageview now.
+    if typeof Turbolinks isnt 'undefined' and Turbolinks.supported
+      document.addEventListener "page:change", (->
+        GoogleAnalytics.trackPageview()
+      ), true
+    else
+      GoogleAnalytics.trackPageview()
+
+  @trackPageview: (url) ->
+    unless GoogleAnalytics.isLocalRequest()
+      if url
+        window._gaq.push ["_trackPageview", url]
+      else
+        window._gaq.push ["_trackPageview"]
+      window._gaq.push ["_trackPageLoadTime"]
+
+  @isLocalRequest: ->
+    GoogleAnalytics.documentDomainIncludes "local"
+
+  @documentDomainIncludes: (str) ->
+    document.domain.indexOf(str) isnt -1
+
+  @analyticsId: ->
+    'UA-47724303-1'
+
+GoogleAnalytics.load()


Add tests fot Find

Add tests fot Find

--- test/data_tests.coffee
+++ test/data_tests.coffee
@@ -16,8 +16,8 @@
 describe "Test section", ->

     before (done) ->
-        # check database state for tests : insert id 321
-        db.save '321', {}
+        # Prepare database for tests
+        db.save '321', {"value":"val"} # insert id 321 : Existence

         # start app
         app.listen(8888)
@@ -31,6 +31,7 @@
         it "When I send a request to check existence of Note with id 123", \
                 (done) ->
             client.get "data/exist/123/", (error, response, body) =>
+                response.should.be.json
                 @body = JSON.parse body
                 done()

@@ -41,6 +42,7 @@
         it "When I send a request to check existence of Note with id 321", \
                 (done) ->
             client.get "data/exist/321/", (error, response, body) =>
+                response.should.be.json
                 @body = JSON.parse body
                 done()

@@ -48,3 +50,19 @@
             should.exist @body.exist
             @body.exist.should.be.ok

+    describe "Find", ->
+        it "When I send a request to get Note with id 123", (done) ->
+            client.get "data/123/", (error, response, body) =>
+                # TODO add catch of needed elements
+
+        it "Then error 404 should be returned", ->
+            # TODO add check http return value
+
+        it "When I send a request to get Note with id 321", (done) ->
+            client.get 'data/321/', (error, response, body) =>
+                response.should.be.json
+                @body = JSON.parse body
+                done()
+
+        it "Then {} should be returned", ->
+            @body.should.equal {"value":"val"}


kintai.coffee

kintai.coffee

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

--- scripts/kintai.coffee
+++ scripts/kintai.coffee
@@ -0,0 +1,13 @@
+# Description:
+#   Example scripts for you to examine and try out.
+#
+# Notes:
+#   They are commented out by default, because most of them are pretty silly and
+#   wouldn't be useful and amusing enough for day to day huboting.
+#   Uncomment the ones you want to try and experiment with.
+#
+#   These are from the scripting documentation: https://github.com/github/hubot/blob/master/docs/scripting.md
+
+module.exports = (robot) ->
+  robot.respond /.*/i, (msg) ->
+    msg.reply "the cake is a lie"


Add 'Brainstem.Error' class

Add 'Brainstem.Error' class

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

--- vendor/assets/javascripts/brainstem/brainstem-error.coffee
+++ vendor/assets/javascripts/brainstem/brainstem-error.coffee
@@ -0,0 +1,7 @@
+window.Brainstem ?= {}
+
+class Brainstem.Error extends Error
+
+  constructor: (message) ->
+    @name = 'BrainstemError'
+    @message = (message || '')


I'm pretty sure it's working now.

I'm pretty sure it's working now.

--- server/routes/mail.coffee
+++ server/routes/mail.coffee
@@ -2,17 +2,17 @@
 map = _.invert mail.MAILCHIMP_GROUP_MAP
 User = require '../users/User.coffee'
 errors = require '../commons/errors'
-request = require 'request'
+#request = require 'request'
 config = require '../../server_config'

-badLog = (text) ->
-  console.log text
-  request.post 'http://requestb.in/1brdpaz1', { form: {log: text} }
+#badLog = (text) ->
+#  console.log text
+#  request.post 'http://requestb.in/1brdpaz1', { form: {log: text} }

 module.exports.setupRoutes = (app) ->
   app.all config.mail.mailchimpWebhook, (req, res) ->
     post = req.body
-    badLog("Got post data: #{JSON.stringify(post, null, '\t')}")
+#    badLog("Got post data: #{JSON.stringify(post, null, '\t')}")

     unless post.type in ['unsubscribe', 'profile']
       res.send 'Bad post type'
@@ -22,11 +22,6 @@
       res.send 'No email provided'
       return res.end()

-    unless _.startsWith post.data.email, 'sderickson'
-      badLog("Ignoring because this is a test: #{JSON.stringify(req.body, null, '\t')}")
-      res.send 'This is a test...'
-      return res.end()
-
     query = {'mailChimp.leid':post.data.web_id}
     User.findOne query, (err, user) ->
       return errors.serverError(res) if err
@@ -58,9 +53,9 @@
   user.set 'mailChimp.email', post.data.email
   user.set 'mailChimp.euid', post.data.id

-  badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}")
+#  badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}")

 handleUnsubscribe = (user) ->
   user.set 'emailSubscriptions', []

-  badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}") +#  badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}")


Remove unbinding event hack

Remove unbinding event hack

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


fixed room sending

fixed room sending

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


Implemented the test

Implemented the test

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

--- spec/provider-spec.coffee
+++ spec/provider-spec.coffee
@@ -0,0 +1,44 @@
+describe 'Cocos2d-JS class, property and method autocompletions', ->
+  [editor, provider] = []
+
+  getCompletions = ->
+    cursor = editor.getLastCursor()
+    start = cursor.getBeginningOfCurrentWordBufferPosition()
+    end = cursor.getBufferPosition()
+    prefix = editor.getTextInRange([start, end])
+    request =
+      editor: editor
+      bufferPosition: end
+      scopeDescriptor: cursor.getScopeDescriptor()
+      prefix: prefix
+    provider.getSuggestions(request)
+
+  beforeEach ->
+    waitsForPromise -> atom.packages.activatePackage('autocomplete-cocos2d-js')
+    runs ->
+      provider = atom.packages.getActivePackage('autocomplete-cocos2d-js')
+        .mainModule.getProvider()
+    waitsFor -> Object.keys(provider.completions).length > 0
+    waitsForPromise -> atom.workspace.open('test.js')
+    runs ->
+      editor = atom.workspace.getActiveTextEditor()
+      editor.setText('test')
+      editor.setCursorBufferPosition([0, Infinity])
+
+  it 'includes the classes of Cocos2d-JS', ->
+    expect(getCompletions()).toContain {type:'class', text:'Node'}
+    expect(getCompletions()).toContain {type:'class', text:'Sprite'}
+    expect(getCompletions()).toContain {type:'class', text:'LabelTTF'}
+    expect(getCompletions()).toContain {type:'class', text:'TextFieldTTF'}
+
+  it 'includes the properties of Cocos2d-JS', ->
+    expect(getCompletions()).toContain {type:'property', text:'ALIGN_LEFT'}
+    expect(getCompletions()).toContain {type:'property', text:'FOCUS'}
+    expect(getCompletions()).toContain {type:'property', text:'anchorX'}
+    expect(getCompletions()).toContain {type:'property', text:'onStart'}
+
+  it 'includes the methods of Cocos2d-JS', ->
+    expect(getCompletions()).toContain {type:'method', text:'ctor'}
+    expect(getCompletions()).toContain {type:'method', text:'addChild'}
+    expect(getCompletions()).toContain {type:'method', text:'clear'}
+    expect(getCompletions()).toContain {type:'method', text:'getContourData'}


Prevent scrolling when a space is pressed in editor

Closes atom/settings-view#25

--- src/editor-view.coffee
+++ src/editor-view.coffee
@@ -428,8 +428,14 @@

       lastInput = e.originalEvent.data
       @editor.insertText(lastInput)
-      @hiddenInput.val(lastInput)
-      false
+
+      # Return true if the last input was a space
+      # This prevents parent elements from scrolling
+      if lastInput is ' '
+        true
+      else
+        @hiddenInput.val(lastInput)
+        false

   bringHiddenInputIntoView: ->
     @hiddenInput.css(top: @scrollTop(), left: @scrollLeft())


:lipstick:

:lipstick:

--- src/app/window.coffee
+++ src/app/window.coffee
@@ -1,5 +1,6 @@
 fs = require 'fs-utils'
 $ = require 'jquery'
+_ = require 'underscore'
 {less} = require 'less'
 {spawn} = require 'child_process'
 require 'jquery-extensions'
@@ -36,12 +37,9 @@

 # This method is only called when opening a real application window
 window.startup = ->
-  if fs.isDirectory('/opt/boxen')
-    installAtomCommand('/opt/boxen/bin/atom')
-  else if fs.isDirectory('/opt/github')
-    installAtomCommand('/opt/github/bin/atom')
-  else if fs.isDirectory('/usr/local')
-    installAtomCommand('/usr/local/bin/atom')
+  directory = _.find ['/opt/boxen', '/opt/github', '/usr/local'], (dir) -> fs.isDirectory(dir)
+  if directory
+    installAtomCommand(fs.join(directory, 'bin/atom'))
   else
     console.warn "Failed to install `atom` binary"


Remove unused document object from input attributes of function.

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


new editor

new editor

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


set max filesize for dropzone

set max filesize for dropzone

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


Update example.coffee ウンコの絵文字に変更

Update example.coffee
ウンコの絵文字に変更

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


Add test for component.json syntax

Add test for component.json syntax

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

--- src/spec/component.json.spec.coffee
+++ src/spec/component.json.spec.coffee
@@ -0,0 +1 @@
+require '../component.json'


Add 'lint' and 'lint:coffee' task

Add 'lint' and 'lint:coffee' task

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

--- gulp/tasks/lint.coffee
+++ gulp/tasks/lint.coffee
@@ -0,0 +1,10 @@
+config = require("../config")
+$      = config.plugins
+
+gulp.task("lint", ["lint:coffee"])
+
+gulp.task "lint:coffee", ->
+  gulp.src(config.src.coffee)
+    .pipe($.plumber())
+    .pipe($.coffeelint())
+    .pipe($.coffeelint.reporter("coffeelint-stylish"))


Global marks; better comments and minor refactoring.

--- background_scripts/marks.coffee
+++ background_scripts/marks.coffee
@@ -1,17 +1,21 @@

 Marks =
-  marks: {}
-
   # This returns the key which is used for storing mark locations in chrome.storage.local.
   getLocationKey: (markName) -> "vimiumGlobalMark|#{markName}"

+  # Get the part of a URL we use for matching here (that is, everything up to the first anchor).
+  getBaseUrl: (url) -> url.split("#")[0]
+
+  # Create a global mark.  We record vimiumSecret with the mark so that we can tell later, when the mark is
+  # used, whether this is the original Vimium instantiation or a subsequent instantiation.  This affects
+  # whether or not tabId can be considered valid.
   create: (req, sender) ->
     chrome.storage.local.get "vimiumSecret", (items) =>
       item = {}
       item[@getLocationKey req.markName] =
         vimiumSecret: items.vimiumSecret
         tabId: sender.tab.id
-        url: sender.tab.url
+        url: @getBaseUrl sender.tab.url
         scrollX: req.scrollX
         scrollY: req.scrollY
         markName: req.markName
@@ -31,14 +35,15 @@
         # This is a different Vimium instantiation, so markInfo.tabId is definitely out of date.
         @focusOrLaunch markInfo
       else
-        # Check whether markInfo.tabId still exists.
+        # Check whether markInfo.tabId still exists.  According to here (https://developer.chrome.com/extensions/tabs),
+        # tab Ids are unqiue within a Chrome session.  So, if we find a match, we can use.
         chrome.tabs.get markInfo.tabId, (tab) =>
-          if chrome.runtime.lastError or not tab
+          if not chrome.runtime.lastError and tab?.url and markInfo.url == @getBaseUrl tab.url
+            # The original tab still exists.
+            @gotoPositionInTab markInfo
+          else
             # The original tab no longer exists.
             @focusOrLaunch markInfo
-          else
-            # The original tab still exists.
-            @gotoPositionInTab markInfo

   gotoPositionInTab: ({ tabId, scrollX, scrollY, markName }) ->
     chrome.tabs.update tabId, { selected: true }, ->
@@ -49,23 +54,21 @@
             text: "Jumped to global mark '#{markName}'."
             duration: 1000

-  # The tab we're trying to find no longer exists.  Either find another tab with a matching URL and use it, or
-  # create a new tab.
+  # The tab we're trying to find no longer exists.  We either find another tab with a matching URL and use it,
+  # or we create a new tab.
   focusOrLaunch: (markInfo) ->
     chrome.windows.getAll { populate: true }, (windows) =>
-      baseUrl = @getBaseUrl markInfo.url
       for window in windows
         for tab in window.tabs
-          if baseUrl == @getBaseUrl tab.url
-            # We have a matching tab.  We'll use it.
-            return @gotoPositionInTab extend markInfo, tabId: tab.id
+          if markInfo.url == @getBaseUrl tab.url
+            # We have a matching tab: use it.
+            @gotoPositionInTab extend markInfo, tabId: tab.id
+            return
       # There is no existing matching tab, we'll have to create one.
       chrome.tabs.create { url: @getBaseUrl(markInfo.url) }, (tab) =>
-        # Note. tabLoadedHandlers is defined in "main.coffee".  This handler will be called when the tab has
+        # Note. tabLoadedHandlers is defined in "main.coffee".  The handler below will be called when the tab
         # is loaded, its DOM is ready and it registers with the background page.
         tabLoadedHandlers[tab.id] = => @gotoPositionInTab extend markInfo, tabId: tab.id

-  getBaseUrl: (url) -> url.split("#")[0]
-
 root = exports ? window
 root.Marks = Marks


Delete RDS instance

Delete RDS instance

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


Modified level session schema to log playtime, renormalize score and name in matches

--- app/schemas/models/level_session.coffee
+++ app/schemas/models/level_session.coffee
@@ -113,6 +113,12 @@
     type: 'string'
     default: 'javascript'

+  playtime:
+    type: 'number'
+    title: 'Playtime'
+    default: 0
+    description: 'The total playtime on this session'
+
   teamSpells:
     type: 'object'
     additionalProperties:
@@ -193,6 +199,11 @@
         date: c.date
           title: 'Date computed'
           description: 'The date a match was computed.'
+        playtime:
+          title: 'Playtime so far'
+          description: 'The total seconds of playtime on this session when the match was computed.'
+          type: 'number'
+
         metrics:
           type: 'object'
           title: 'Metrics'
@@ -217,6 +228,14 @@
                 title: 'Opponent User ID'
                 description: 'The user ID of an opponent'
                 type: ['object','string']
+              name:
+                title: 'Opponent name'
+                description: 'The name of the opponent'
+                type: 'string'
+              totalScore:
+                title: 'Opponent total score'
+                description: 'The totalScore of a user when the match was computed'
+                type: 'number'
               metrics:
                 type: 'object'
                 properties:


added missing style attributes to naivgation bar button

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


additional debounce changes from smartNumber

--- app/assets/javascripts/angular/directives/smartNumber.js.coffee
+++ app/assets/javascripts/angular/directives/smartNumber.js.coffee
@@ -77,6 +77,9 @@
     killEvent = (event) ->
       event.preventDefault()
       event.stopPropagation()
+
+    triggerChange = (elem) ->
+      elem.trigger("change")

     # helper methods for finding the new cursor position based on input type
     findNewCharacterCursorPosition = (elem, initialPosition) ->
@@ -223,7 +226,7 @@

             elem.on 'keydown', (event) ->
               keycode = event.which
-              killEvent(event) unless keycode == 37 || keycode == 39
+              killEvent(event) unless keycode == 37 || keycode == 39 || keycode == 9

               return if invalidInput(elem, event)
               # unless isControlKey(keycode)
@@ -237,6 +240,7 @@
                   insertCharacter(elem, event)
                   elem.val resetCommas(elem.val()) # reformat the number in place
                   elem[0].setSelectionRange(newCursorPosition, newCursorPosition) # set the new cursor position
+                  triggerChange(elem)

               if keycode == 8 # backspace is pressed
                 unless elem[0].selectionStart == 0 # do nothing if it's at the end of the end of the input
@@ -244,6 +248,7 @@
                   backspacePressed(elem, event) # handle logic for backspace
                   elem.val resetCommas(elem.val()) # reformat the number in place
                   elem[0].setSelectionRange(newCursorPosition, newCursorPosition) # set the new cursor position
+                  triggerChange(elem)

               if keycode == 46 # delete is pressed
                 unless elem[0].selectionStart == elem.val().length
@@ -251,6 +256,7 @@
                   deletePressed(elem, event) # handle logic for backspace
                   elem.val resetCommas(elem.val()) # reformat the number in place
                   elem[0].setSelectionRange(newCursorPosition, newCursorPosition) # set the new cursor position
+                  triggerChange(elem)

             elem.on 'keypress', (event) ->
               killEvent(event)


fix to qa-reports update query

fix to qa-reports update query

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


Add bare-bones health check script for hubot

--- health.coffee
+++ health.coffee
@@ -0,0 +1,3 @@
+module.exports = (robot) ->
+  robot.router.get '/health', (req, res) ->
+    res.send 'OK'


update reconnect to mongdb

update reconnect to mongdb

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


Add tests for pathview.coffee

Add tests for pathview.coffee

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

--- test/pathview_test.coffee
+++ test/pathview_test.coffee
@@ -0,0 +1,19 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'pathview', ->
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+
+    require('../src/pathview')(@robot)
+
+  it 'registers a pathview listener', ->
+    expect(@robot.respond).to.have.been.calledWith(/pathview me foo to bar/)
+
+  it 'registers a hear listener', ->
+    expect(@robot.respond).to.have.been.calledWith(/pvc me foo to bar/)


Fix express deprecation warning

Fix express deprecation warning

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


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


polish translation

polish translation

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/prognostikos/uploadcare-widget.git/'


:art:

:art:

--- spec/native-compile-cache-spec.coffee
+++ spec/native-compile-cache-spec.coffee
@@ -73,6 +73,5 @@

     fn3 = require('./fixtures/native-cache/file-3')

-    expect(fakeCacheStore.delete.calls.length).toBe(1)
-    expect(fakeCacheStore.delete.calls[0].args[0]).toBe(require.resolve('./fixtures/native-cache/file-3'))
+    expect(fakeCacheStore.delete).toHaveBeenCalledWith(require.resolve('./fixtures/native-cache/file-3'))
     expect(fn3()).toBe(3)


a new component that can replace lookups against artsy/places

error: pathspec 'apps/galleries_institutions/components/partner_cities/index.coffee' did not match any file(s) known to git

--- apps/galleries_institutions/components/partner_cities/index.coffee
+++ apps/galleries_institutions/components/partner_cities/index.coffee
@@ -0,0 +1,5 @@
+{ PARTNER_CITIES, PARTNER_FEATURED_CITIES } = require('sharify').data
+
+module.exports =
+  Cities: PARTNER_CITIES
+  FeaturedCities: PARTNER_FEATURED_CITIES


Rewrite settings

Rewrite settings

--- helper/settings.coffee
+++ helper/settings.coffee
@@ -4,14 +4,15 @@
 fs = require "fs"

 module.exports = (file) ->
-  settings = JSON.parse fs.readFileSync file, {encoding: "UTF-8"}
+  settings = {}
   splinters = parse file
-  fileSpecific = "#{splinters.dir}/#{splinters.name}.specific#{splinters.ext}"
-  if fs.existsSync(fileSpecific)
-    settingsSpecific = JSON.parse fs.readFileSync fileSpecific, {encoding: "UTF-8"}
-    settings = _.deepExtend settings, settingsSpecific
-  fileLocal = "#{splinters.dir}/#{splinters.name}.local#{splinters.ext}"
-  if fs.existsSync(fileLocal)
-    settingsLocal = JSON.parse fs.readFileSync fileLocal, {encoding: "UTF-8"}
-    settings = _.deepExtend settings, settingsLocal
+  files = [
+    file
+    "#{splinters.dir}/#{splinters.name}.specific#{splinters.ext}"
+    "#{splinters.dir}/#{splinters.name}.local#{splinters.ext}"
+    "~/.fixin/settings/#{splinters.name}.private#{splinters.ext}"
+  ]
+  for file in files
+    if fs.existsSync(file)
+      settings = _.deepExtend settings, JSON.parse fs.readFileSync file, {encoding: "UTF-8"}
   settings


Use built-in `metaphysics#debug`

Use built-in `metaphysics#debug`

--- apps/artwork_2/routes.coffee
+++ apps/artwork_2/routes.coffee
@@ -43,9 +43,7 @@
 @index = (req, res, next) ->
   send = query: query, variables: req.params

-  if req.query.query?
-    get = extend {}, send, variables: JSON.stringify send.variables
-    return res.redirect "#{METAPHYSICS_ENDPOINT}?#{qs.stringify get}"
+  return if metaphysics.debug req, res, send

   metaphysics send
     .then (data) ->


(- fix) Make Thing#at() handle undefined members

Squashes: 76b96

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


Fixed labels and marks not properly updating in the level editor.

--- app/views/editor/level/thangs/ThangsTabView.coffee
+++ app/views/editor/level/thangs/ThangsTabView.coffee
@@ -325,6 +325,8 @@
       @selectedExtantThangClickTime = new Date()
       # Show the label above selected thang, notice that we may get here from thang-edit-view, so it will be selected but no label
       @selectedExtantLank.setNameLabel @selectedExtantLank.thangType.get('name') + ': ' + @selectedExtantThang.id
+      @selectedExtantLank.updateLabels()
+      @selectedExtantLank.updateMarks()
     else if @addThangLank
       # We clicked on the background when we had an add Thang selected, so add it
       @addThang @addThangType, @addThangLank.thang.pos


toHaveLength test helper.

toHaveLength test helper.

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


Add Mail.app keybinds

Add Mail.app keybinds

Added jumping, search focus, select, star and archive keybinds to Apple
Mail keymap

error: pathspec 'keymaps/templates/Apple' did not match any file(s) known to git
error: pathspec 'Mail.cson' did not match any file(s) known to git


skip timer

skip timer

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/LucasAdam/hubot-trivia-game-french.git/'


Implement timeout of 5 seconds to abort server registration

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


close and reset date selection smartly

close and reset date selection smartly

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


moving validation in a dedicated service

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

--- src/coffee/services/validation.coffee
+++ src/coffee/services/validation.coffee
@@ -0,0 +1,56 @@
+##
+## validation.coffee
+##
+## Created by Frederic DELBOS - fred.delbos@gmail.com on Dec  4 2013.
+## This file is subject to the terms and conditions defined in
+## file 'LICENSE.txt', which is part of this source code package.
+##
+
+angular.module('CoolFormServices').
+  factory('validationService', (validators) ->
+
+    return(events) ->
+
+      errors ={}
+      fields = {}
+
+      removeError = (fieldName) ->
+        delete errors[fieldName]
+        events.handle(fieldName, "ok")
+
+      initValidation = (field, services) ->
+        fields[field.name] = field
+        if field.validation?
+          for rule in field.validation
+            if validators[rule.validator]? and validators[rule.validator].init?
+              validators[rule.validator].init(field.name, rule, services)
+
+      validateField = (fieldName, values) ->
+        field = fields[fieldName]
+        if field.validation?
+          for rule in field.validation
+            if validators[rule.validator] and validators[rule.validator].validator?
+              if validators[rule.validator].validator(fieldName, values, rule) is false
+                errors[fieldName] = rule.options.message
+                events.handle(fieldName, "errors",rule.options.message)
+                return false
+        removeError(fieldName)
+        return true
+
+      validateFields = (fieldList, values) ->
+        result = true
+        for field in fieldList
+          if validateField(field, values) is false then result = false
+        result
+
+      validateAll = (values) ->
+        validateFields(Object.keys(fields), values)
+
+      return {
+        removeError: removeError
+        initValidation: initValidation
+        validateField: validateField
+        validateFields: validateFields
+        validateAll: validateAll
+      }
+  )


Clear focused window property on window closed

Closes #3806

--- src/browser/application-menu.coffee
+++ src/browser/application-menu.coffee
@@ -48,6 +48,7 @@

     window.on 'focus', focusHandler
     window.once 'closed', =>
+      @lastFocusedWindow = null if window is @lastFocusedWindow
       @windowTemplates.delete(window)
       window.removeListener 'focus', focusHandler


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


stripped useless code, added task description

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/aponxi/grunt-wxi-shell.git/'


Add missing preview file

Add missing preview file

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

--- lib/restructured-preview-view.coffee
+++ lib/restructured-preview-view.coffee
@@ -0,0 +1,16 @@
+{TextEditorView} = require 'atom'
+{ScrollView} = require 'atom-space-pen-views'
+
+module.exports =
+class RestructuredPreviewView extends ScrollView
+    constructor: ({@editorId, @filePath}) ->
+      super
+
+    @content: ->
+      @div()
+
+    setText: (text) ->
+      @html(text)
+
+    getTitle: ->
+      return "Restructured Preview"


Client: Activity: Test: Created CommentListContainer tests

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

--- client/activity/lib/components/commentlist/test/container.coffee
+++ client/activity/lib/components/commentlist/test/container.coffee
@@ -0,0 +1,68 @@
+kd           = require 'kd'
+React        = require 'kd-react'
+expect       = require 'expect'
+Container    = require '../container'
+TestUtils    = require 'react-addons-test-utils'
+ActivityFlux = require 'activity/flux'
+immutable    = require 'immutable'
+toImmutable  = require 'app/util/toImmutable'
+mock         = require '../../../../../mocks/mockingjay'
+
+describe 'CommentListContainer', ->
+
+  { renderIntoDocument } = TestUtils
+
+  beforeEach ->
+
+    @props =
+      repliesCount   : 10
+      onMentionClick : kd.noop
+      channelId      : 'dummy-channel-id'
+      messageId      : 'dummy-message-id'
+      comments       : toImmutable mock.getMockMessages { size: 10 }
+
+
+  afterEach -> expect.restoreSpies()
+
+
+  describe '::render', ->
+
+    it 'should render Container with correct props', ->
+
+      container = renderIntoDocument(<Container {...@props} />)
+
+      expect(container.props.repliesCount).toBeA 'number'
+      expect(container.props.onMentionClick).toBeA 'function'
+      expect(container.props.channelId).toEqual 'dummy-channel-id'
+      expect(container.props.messageId).toEqual 'dummy-message-id'
+      expect(container.props.comments instanceof immutable.Map).toBeTruthy()
+
+
+    it 'should render view with correct props', ->
+
+      container = renderIntoDocument(<Container {...@props} />)
+      viewProps = container.refs.view.props
+
+      expect(viewProps.repliesCount).toEqual 10
+      expect(viewProps.channelId).toEqual 'dummy-channel-id'
+      expect(viewProps.messageId).toEqual 'dummy-message-id'
+      expect(viewProps.onMentionClick).toBeA 'function'
+      expect(viewProps.comments instanceof immutable.Map).toBeTruthy()
+
+
+  describe '::showMoreComment', ->
+
+    it 'should call loadComments action with correct parameters', ->
+
+      { message }     = ActivityFlux.actions
+      loadCommentsSpy = expect.spyOn message, 'loadComments'
+      limit           = 10
+      from            = 'dummy-createdAt-value'
+      firstComment    = @props.comments.first().set 'createdAt', from
+      @props.comments = @props.comments.set firstComment.get('id'), firstComment
+      container       = renderIntoDocument(<Container {...@props} />)
+
+      container.showMoreComment()
+
+      expect(loadCommentsSpy).toHaveBeenCalledWith 'dummy-message-id', { from, limit }
+


Use new config schema

Use new config schema

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


add livescript specific tests

add livescript specific tests

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

--- test/livescript.coffee
+++ test/livescript.coffee
@@ -0,0 +1,14 @@
+suite 'LiveScript specific', ->
+
+  test 'LiveScript reserved identifiers', ->
+    match = 10
+    match = 11
+    eq 11, match
+
+  test 'LiveScript reserved as properties', ->
+    obj =
+      match: 54
+      xor: 12
+
+    eq 54, obj.match
+    eq 12, obj.xor


Detect masterLogsDomain when the hostAddress is set on a different hostState from the one which has a mesosMaster...

--- SingularityUI/app/models/State.coffee
+++ SingularityUI/app/models/State.coffee
@@ -5,14 +5,19 @@
     url: -> "#{ env.SINGULARITY_BASE }/#{ constants.apiBase }/state"

     parse: (state) =>
+        mesosMaster = undefined
+
         _.each state.hostStates, (hostState) ->
             hostState.uptimeHuman = moment.duration(hostState.uptime).humanize()
             hostState.driverStatusHuman = constants.driverStates[hostState.driverStatus]
             hostState.millisSinceLastOfferHuman = moment(+new Date() - hostState.millisSinceLastOffer).from()

-            # Ask wsorenson...
-            if hostState.hostAddress is hostState.mesosMaster?.split(':')[0]
-                state.masterLogsDomain = "#{ hostState.hostname }:#{ hostState.mesosMaster.split(':')[1] }"
+            if hostState.mesosMaster?
+                mesosMaster = hostState.mesosMaster
+
+        _.each state.hostStates, (hostState) ->
+            if hostState.hostAddress is mesosMaster?.split(':')[0]
+                state.masterLogsDomain = "#{ hostState.hostname }:#{ mesosMaster.split(':')[1] }"

         state


compass docs in the final format

compass docs in the final format

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


Add fingers multi-select tests.

Add fingers multi-select tests.

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

--- src/Fingers/specs/multi-select.coffee
+++ src/Fingers/specs/multi-select.coffee
@@ -0,0 +1,189 @@
+describe "Multi select component UI creation",
+{
+	"Given a multi select component with no default selections":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"Then static view displays 'Click to edit'":
+		".static-view": should.haveText 'Click to edit'
+},
+{
+	"Given a multi select component with a first option selected":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"Then static view displays text of first option":
+		".static-view": should.haveText 'A'
+},
+{
+	"Given a multi select component with a first and second options selected":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2" selected="selected">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"Then static view displays text of first and second options":
+		".static-view": should.haveText 'A, B'
+}
+
+describe "Multi select component entering edit mode",
+{
+	"Given a multi select component with two selections":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2" selected="selected">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"When static view clicked":
+		$(".static-view").click()
+
+	"Then select control appears":
+		".static-view": shouldnot.beVisible()
+		"select:visible": should.haveVal ["1", "2"]
+},
+{
+	"Given a multi select component with a first option selected":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"When static view clicked":
+		$(".static-view").click()
+
+	"Then select control has one selection":
+		"select:visible": should.haveVal ["1"]
+},
+{
+	"Given a multi select component with no default selections":
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+
+	"When static view clicked":
+		$(".static-view").click()
+
+	"Then select control has no selections":
+		"select:visible": should.haveVal null
+}
+
+describe "Multi select in edit mode",
+{
+	"Given a multi select component in edit mode with change": [
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+		$(".static-view").click()
+		$("select:visible").val ["3"]
+	]
+
+	"When it is blurred":
+		$("select:visible").blur()
+
+	"Then static view displayed":
+		".static-view:visible": should.match 1
+		".static-view": should.haveText "C"
+},
+{
+	"Given a multi select component in edit mode": [
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+		$(".static-view").click()
+	]
+
+	"When Escape key pressed":
+		$("select:visible").type ESCAPE
+
+	"Then static view displayed":
+		".static-view": should.beVisible()
+		"select": shouldnot.beVisible()
+},
+{
+	"Given a multi select component in edit mode with changes": [
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+		$(".static-view").click()
+		$("select:visible").val(["2"])
+	]
+
+	"When Escape key pressed":
+		$("select:visible").type ESCAPE
+
+	"Then static view displayed with original value":
+		".static-view": should.haveText "A"
+},
+{
+	"Given a multi select component in edit mode": [
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+		$(".static-view").click()
+	]
+
+	"When Enter key pressed":
+		$("select:visible").type ENTER
+
+	"Then static view displayed":
+		".static-view": should.beVisible()
+		"select": shouldnot.beVisible()
+},
+{
+	"Given a multi select component in edit mode with changes": [
+		createFingersUI """
+		<select class="editable view-multi-select" size="3" multiple="multiple">
+			<option value="1" selected="selected">A</option>
+			<option value="2">B</option>
+			<option value="3">C</option>
+		</select>
+		"""
+		$(".static-view").click()
+		$("select:visible").val(["2", "3"])
+	]
+
+	"When Enter key pressed":
+		$("select:visible").type ENTER
+
+	"Then static view displays the new selected text":
+		".static-view": should.haveText "B, C"
+}


Nice example

Nice example

--- extras/Studio.framer/app.coffee
+++ extras/Studio.framer/app.coffee
@@ -1,12 +1,26 @@
-#Import file "NavComponent"
-{home, Unlock, table, back, update, dialog} =
-	Framer.Importer.load("imported/NavComponent@1x")
+nav = new NavComponent

-dialog.borderRadius = 10
+grid = new GridComponent
+	width: Screen.width
+	height: Screen.height * 2
+	rows: 8
+	columns: 3

-nav = new NavComponent height:Screen.height
-nav.push(home)
+nav.push(grid)

-Unlock.onTap -> nav.push(table)
-back.onTap -> nav.back()
-update.onTap -> nav.alert(dialog)+grid.renderCell = (layer) ->
+
+	layer.image = Utils.randomImage(layer)
+
+	layer.onClick ->
+
+		large = new Layer
+			size: Utils.frameInset(nav, 80)
+			image: @image
+
+		large.onTap ->
+			nav.back()
+
+		nav.modal(large)
+
+


Moar coffee.

Moar coffee.

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


config authProvider and apiEndpoint

config authProvider and apiEndpoint

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

--- app/configs/auth.coffee
+++ app/configs/auth.coffee
@@ -0,0 +1,5 @@
+### @ngInject ###
+
+global.cobudgetApp.config ($authProvider, config) ->
+  $authProvider.configure
+    apiUrl: config.apiEndpoint


Fix calendar days events on single day click. (#1690)

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


Add a simple JS tests file for the linear interpolator.

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

--- bokehjs/test/models/transforms/linear_interpolator_transform.coffee
+++ bokehjs/test/models/transforms/linear_interpolator_transform.coffee
@@ -0,0 +1,51 @@
+{expect} = require "chai"
+utils = require "../../utils"
+
+{Collections} = utils.require "base"
+
+describe "linear_interpolator_transform module", ->
+  source = {start: 0, end: 10}
+  target = {start: 20, end: 80}
+
+  generate_interpolator_ColumnDataSource = ->
+    Collections("LinearInterpolator").create
+      x: 'var1'
+      y: 'var2'
+      data: Collections("ColumnDataSource").create({data: {var1: [0, 5, 15], var2: [10, 20, 30]}})
+
+  generate_interpolator_inline = ->
+    Collections("LinearInterpolator").create
+      x: [0, 5, 15]
+      y: [10, 20, 30]
+
+  describe "creation with ColumnDataSource ranges", ->
+    mapper = generate_interpolator_ColumnDataSource()
+
+    it "should return control points", ->
+      expect(mapper.compute(0)).to.be.equal 10
+      expect(mapper.compute(5)).to.be.equal 20
+
+    it "should linearly interpolate between control points", ->
+      expect(mapper.compute(2)).to.be.equal 14
+
+    it "should linearly interpolate a vector of points", ->
+      expect(mapper.v_compute([0, 2, 5])).to.be.deep.equal new Float64Array [10, 14, 20]
+
+    it "should map to a Float64Array", ->
+      expect(mapper.v_map_to_target([-1,0,5,10,11])).to.be.instanceof Float64Array
+
+  describe "creation with inline ranges", ->
+    mapper = generate_interpolator_inline()
+
+    it "should return control points", ->
+      expect(mapper.compute(0)).to.be.equal 10
+      expect(mapper.compute(5)).to.be.equal 20
+
+    it "should linearly interpolate between control points", ->
+      expect(mapper.compute(2)).to.be.equal 14
+
+    it "should linearly interpolate a vector of points", ->
+      expect(mapper.v_compute([0, 2, 5])).to.be.deep.equal new Float64Array [10, 14, 20]
+
+    it "should map to a Float64Array", ->
+      expect(mapper.v_map_to_target([-1,0,5,10,11])).to.be.instanceof Float64Array


Never select the root sidebar item

Never select the root sidebar item

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


always use long-form prompt with test stars (fixes #84)

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


Capacity CoffeeScript template

Capacity CoffeeScript 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/calpath/xsd2bb.git/'


add tests from groups

add tests from groups

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

--- tests/mocha/apollos/groups/_.coffee
+++ tests/mocha/apollos/groups/_.coffee
@@ -0,0 +1,76 @@
+MochaWeb?.testOnly ->
+
+  assert = chai.assert
+
+  describe 'Apollos', ->
+    describe 'groups', ->
+
+      if Meteor.isServer
+
+        before ->
+          member1 =
+            personId: 1
+            role: 'Role 1'
+          member2 =
+            personId: 2
+            role: 'Role 2'
+          props =
+            groupId: 1
+            campusId: 2
+            name: 'Meow Group'
+            type: 'Meow Type'
+            guid: '12345678-1234-1234-1234-123456789012'
+            photoURL: 'http://meow.com/meow'
+            locationIds: [1,2]
+            members: [member1, member2]
+            status: 1
+
+          Apollos.groups.insert props
+
+        it 'should exist', ->
+          assert typeof Apollos.groups is 'object'
+
+        it 'should have groupId', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.groupId is 'number'
+          assert.equal group.groupId, 1
+
+        it 'should have campusId', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.campusId is 'number'
+          assert.equal group.campusId, 2
+
+        it 'should have name', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.name is 'string'
+          assert.equal group.name, 'Meow Group'
+
+        it 'should have type', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.type is 'string'
+          assert.equal group.type, 'Meow Type'
+
+        it 'should have guid', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.guid is 'string'
+          assert.equal group.guid, '12345678-1234-1234-1234-123456789012'
+
+        it 'should have photoURL', ->
+          group = Apollos.groups.findOne()
+          assert typeof group.photoURL is 'string'
+          assert.equal group.photoURL, 'http://meow.com/meow'
+
+        it 'should have locationIds', ->
+          group = Apollos.groups.findOne()
+          assert.isArray group.locationIds
+          assert.equal group.locationIds[0], 1
+          assert.equal group.locationIds[1], 2
+
+        it 'should have members', ->
+          group = Apollos.groups.findOne()
+          assert.isArray group.members
+          assert.equal group.members[0].personId, 1
+          assert.equal group.members[1].personId, 2
+          assert.equal group.members[0].role, 'Role 1'
+          assert.equal group.members[1].role, 'Role 2'
+


Add simple test.

Add simple test.

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

--- src/spec/integration.spec.coffee
+++ src/spec/integration.spec.coffee
@@ -0,0 +1,16 @@
+Config = require '../config'
+Connector = require('../main').Connector
+Q = require('q')
+
+# Increase timeout
+jasmine.getEnv().defaultTimeoutInterval = 10000
+
+describe '#run', ->
+  beforeEach (done) ->
+    @connector = new Connector Config
+    done()
+
+  it 'Nothing to do', (done) ->
+    @connector.run (success) ->
+      expect(success).toBe true
+      done()


Correct bug causing empty response to hang.

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


Add comment and indent settings

Add comment and indent settings

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

--- settings/language-csound.cson
+++ settings/language-csound.cson
@@ -0,0 +1,8 @@
+".source.csound, .source.csound-score":
+  editor:
+    commentStart: "; "
+
+".source.csound":
+  editor:
+    increaseIndentPattern: "\\b(?:do|else(?:if)?|i(?:f|nstr)|opcode)\\b"
+    decreaseIndentPattern: "\\b(?:end(?:i[fn]|op|until)|fi|od)\\b"


client: dashboard: keep capitalization consistent

--- client/home/lib/welcome/boxes.coffee
+++ client/home/lib/welcome/boxes.coffee
@@ -43,7 +43,7 @@
   inviteTeam :
     """

-
Invite your team

+
Invite Your Team

Get your teammates working together.

     """


fixes #15

fixes #15

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

--- snippets/language-xquery.cson
+++ snippets/language-xquery.cson
@@ -0,0 +1,74 @@
+'.source.xq':
+  'for':
+    'prefix': 'for'
+    'body': 'for $${1:item} in ${2:expr}${3}'
+  'return':
+    'prefix': 'return'
+    'body': 'return ${1:expr}${2}'
+  'import':
+    'prefix': 'import'
+    'body': 'import module namespace ${1:ns} = "${2:http://www.example.com/}";\n${3}'
+  'some':
+    'prefix': 'some'
+    'body': 'some $${1:varname} in ${2:expr} satisfies ${3:expr}${4}'
+  'every':
+    'prefix': 'every'
+    'body': 'every $${1:varname} in ${2:expr} satisfies ${3:expr}${4}'
+  'if':
+    'prefix': 'if'
+    'body': 'if(${1:true}) then\n  ${2:expr}\nelse\n  ${3:true}${4}'
+  'switch':
+    'prefix': 'switch'
+    'body': 'switch(${1:"foo"})\ncase ${2:"foo"}\nreturn ${3:true}\ndefault return ${4:false}${5}'
+  'try':
+    'prefix': 'try'
+    'body': 'try {\n  ${1:expr}\n} catch ${2:*} {\n  ${3:expr}\n}${4}'
+  'tumbling':
+    'prefix': 'tumbling'
+    'body': '
+    	for tumbling window $${1:varname} in ${2:expr}\nstart at $${3:start} when ${4:expr}\nend at $${5:end} when ${6:expr}\nreturn ${7:expr}${8}'
+  'sliding':
+    'prefix': 'sliding'
+    'body': 'for sliding window $${1:varname} in ${2:expr}\nstart at $${3:start} when ${4:expr}\nend at $${5:end} when ${6:expr}\nreturn ${7:expr}${8}'
+  'let':
+    'prefix': 'let'
+    'body': 'let $${1:varname} := ${2:expr}${3}'
+  'group':
+    'prefix': 'group'
+    'body': 'group by $${1:varname} := ${2:expr}${3}'
+  'order':
+    'prefix': 'order'
+    'body': 'order by $${1:expr} ${2:descending}${3}'
+  'stable':
+    'prefix': 'stable'
+    'body': 'stable order by $${1:expr}${2}'
+  'count':
+    'prefix': 'count'
+    'body': 'count $${1:varname}${2}'
+  'ordered':
+    'prefix': 'ordered'
+    'body': 'ordered { ${1:expr} }${2}'
+  'unordered':
+    'prefix': 'unordered'
+    'body': 'unordered { ${1:expr} }${2}'
+  'treat':
+    'prefix': 'treat'
+    'body': 'treat as ${1:expr}${2}'
+  'castable':
+    'prefix': 'castable'
+    'body': 'castable as ${1:atomicType}${2}'
+  'cast':
+    'prefix': 'cast'
+    'body': 'cast as ${1:atomicType}${2}'
+  'typeswitch':
+    'prefix': 'typeswitch'
+    'body': 'typeswitch(${1:expr})\ncase ${2:type}  return ${3:expr}\ndefault return ${4:expr}${5}'
+  'var':
+    'prefix': 'var'
+    'body': 'declare variable $${1:varname} := ${2:expr};${3}'
+  'fn':
+    'prefix': 'fn'
+    'body': 'declare function ${1:ns}:${2:name}(){\n  ${3:expr}\n};\n\n${4}'
+  'module':
+    'prefix': 'module'
+    'body': 'module namespace ${1:ns} = "${2:http://www.example.com}";\n\n${3}'


Activity: instead of hasListPermissions call canListMembers

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


Also stopWatching when folder deleted

Also stopWatching when folder deleted

--- client/app/MainApp/fs/fsfolder.coffee
+++ client/app/MainApp/fs/fsfolder.coffee
@@ -30,7 +30,6 @@
       method    : 'fs.createDirectory'
       withArgs  : {@path}
     , (err, res)=>
-
       if err then warn err
       @emit "fs.save.finished", err, res
       callback? err, res
@@ -40,6 +39,11 @@
     callback? null

   remove:(callback)->
+    @off 'fs.delete.finished'
+    @on  'fs.delete.finished', =>
+      finder = KD.getSingleton 'finderController'
+      finder.stopWatching @path
+
     super callback, yes

   registerWatcher:(response)->


Add -H option to fix broken symbolic links error

 From man of ls -H provides: show information for the file the link references rather than for the link itself. So, when some broken links exists it adds the link to the tree with "Link -> Non-Exist" label.

--- client/app/MainApp/fs/fsfolder.coffee
+++ client/app/MainApp/fs/fsfolder.coffee
@@ -21,7 +21,7 @@
     # a = Date.now()
     @kiteController.run
       withArgs  :
-        command : "ls #{FSHelper.escapeFilePath @path} -Llpva --group-directories-first --time-style=full-iso"
+        command : "ls #{FSHelper.escapeFilePath @path} -LHlpva --group-directories-first --time-style=full-iso"
     , (err, response)=>
       # log "------------------------------------------------------------------"
       # log "l flag response in: #{Date.now()-a} msec."


Satisfy ocd people when they reach bottom page of topic

Fixes #174

--- resources/assets/coffee/forum.coffee
+++ resources/assets/coffee/forum.coffee
@@ -76,12 +76,19 @@
     currentPost = null
     anchorHeight = window.innerHeight * 0.5

-    for post in @posts
-      postTop = post.getBoundingClientRect().top
-      if postTop <= anchorHeight
-        currentPost = post
-      else
-        break
+    pageBottom = document.getElementsByClassName('js-page-footer-padding')[0]
+      .getBoundingClientRect()
+      .bottom
+
+    if pageBottom == window.innerHeight
+      currentPost = @posts[@posts.length - 1]
+    else
+      for post in @posts
+        postTop = post.getBoundingClientRect().top
+        if postTop <= anchorHeight
+          currentPost = post
+        else
+          break

     # no post visible?
     currentPost ?= @posts[0]


Fix up the mpu animation.

Fix up the mpu animation.

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


start of an annotation model

start of an annotation model

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

--- app/assets/javascripts/models/annotaion.js.coffee
+++ app/assets/javascripts/models/annotaion.js.coffee
@@ -0,0 +1,20 @@
+Theoj.Annotation = Ember.Object.extend
+    id: null
+    comments:[]
+    text:""
+    state:"pending"
+    author: null
+
+    resolve:->
+      ajax.request
+        url: "/annotations/#{@id}/resolve"
+        type: "POST"
+        data:
+          user_name: username
+
+    add_comment:(comment)->
+      ajax.request
+        url: "/annotations/#{@id}/comment"
+        type: "POST"
+        data:
+          user_name: comment


realtimemanager: emit 'RealtimeDocReady'

--- client/ide/lib/realtimemanager.coffee
+++ client/ide/lib/realtimemanager.coffee
@@ -20,6 +20,7 @@
   setRealtimeDoc: (realtimeDoc) ->

     @realtimeDoc = realtimeDoc
+    @emit 'RealtimeDocReady', realtimeDoc

   getRealtimeDoc: ->


inheritOptionFlags: tests added

inheritOptionFlags: tests added

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

--- config/inheritOptionFlags.test.coffee
+++ config/inheritOptionFlags.test.coffee
@@ -0,0 +1,83 @@
+traverse = require 'traverse'
+inherit = require './inheritOptionFlags'
+
+{ expect }  = require '../workers/social/testhelper'
+
+test_options =
+  level1a       :
+    level2a     : 'test-level2a-value'
+    level2b     :
+      level3a   : 'test-level3a-value'
+    level2c     :
+      level3b   : 'test-level3b-value'
+      level3c   : 'test-level3c-value'
+  level1b       : 'test-level1b-value'
+  level1d       : 'test-level1d-value'
+
+test_credentials =
+  level1a       :
+    level2a     : 'credentials-level2a-value'
+    level2b     :
+      level3a   : 'credentials-level3a-value'
+    level2c     :
+      level3b   : 'credentials-level3b-value'
+      level3c   : 'credentials-level3c-value'
+      level3d   : 'credentials-level3d-value'
+  level1b       : 'credentials-level1b-value'
+  level1c       :
+    level2d     :
+      level3e   : 'credentials-level3e-value'
+
+
+getValues = (obj) -> traverse(obj).reduce(((values, x) ->
+  if @isLeaf
+    values.push x
+  values
+), [])
+
+runTests = ->
+  credential_vals_before = getValues(test_credentials)
+  options_values = getValues(test_options)
+
+  inherit test_credentials, test_options
+
+  credentials_values = getValues(test_credentials)
+  # Tests for inheritance until third level
+  it 'should set credentials-level1b-value to test-level1b-value', ->
+    result   = JSON.stringify test_credentials.level1b
+    expected = JSON.stringify test_options.level1b
+    expect(result).to.be.equal expected
+
+  it 'should set credentials-level2a-value to test-level2a-value', ->
+    result   = JSON.stringify test_credentials.level1a.level2a
+    expected = JSON.stringify test_options.level1a.level2a
+    expect(result).to.be.equal expected
+
+  it 'should set credentials-level3a-value to test-level3a-value', ->
+    result   = JSON.stringify test_credentials.level1a.level2b.level3a
+    expected = JSON.stringify test_options.level1a.level2b.level3a
+    expect(result).to.be.equal expected
+  # ---
+
+  it 'should not set credentials-level3d-value to anything', ->
+    result   = JSON.stringify test_credentials.level1c.level2d.level3d
+    expected = JSON.stringify test_credentials.level1c.level2d.level3d
+    expect(result).to.be.equal expected
+
+  # No matching property in credentials
+  it 'should not set any credential values to test-level1d-value', ->
+    result   = 'test-level1d-value' in credentials_values
+    expected = false
+    expect(result).to.be.equal expected
+
+  # Comparing changed and unchanged values
+  it 'credential values that are not in options should remain unchanged', ->
+    not_changed = false
+    for val in credential_vals_before
+      if val not in options_values and val in credentials_values
+        not_changed = true
+    result   = not_changed
+    expected = true
+    expect(result).to.be.equal expected
+
+runTests()


Interpret refresh href as page link

Interpret refresh href as page link

--- core/htdocs_source/src/pods/openxpki/route.coffee
+++ core/htdocs_source/src/pods/openxpki/route.coffee
@@ -102,8 +102,8 @@

                 if doc.refresh
                     source.set "refresh", Em.run.later(@, ->
-                        @sendAjax
-                            url: doc.refresh.href
+                        @sendAjax data:
+                            page: doc.refresh.href
                     , doc.refresh.timeout)

                 if doc.goto


handle missing secObj in validate_doc_update() (fixes #164)


Bold current date if no datetime parameter passed.


Add missing paging support classes

Add missing paging support classes

error: pathspec 'src/01_tinycpu/features/mm/support/pages.coffee' did not match any file(s) known to git

--- src/01_tinycpu/features/mm/support/pages.coffee
+++ src/01_tinycpu/features/mm/support/pages.coffee
@@ -0,0 +1,85 @@
+# Support classes for the paging feature.
+
+{vlog} = require 'verbosity'
+{decSymbol} = require 'symbols'
+{clone} = require 'tc_util'
+
+PAGE_DEFAULT_SIZE = decSymbol 'PAGE_DEFAULT_SIZE', 32 * 1024
+
+# This is the worker implementation, ie the class that performs the actual
+# reading and writing for a page.
+# New implementations can be created by extending this class and passing it
+# to the Paging class instance.
+class PageImplementation
+	constructor: () ->
+		@init()
+
+	# Public API. You are discouraged from altering these.
+	read: (location) -> @do_read location
+	write: (location, value) -> @do_write location, value
+
+	# Overridable API. Extending classes should implement their own versions
+	# of the following functions.
+
+	# Called upon construction
+	init: () ->
+		vlog 50, 'PageImplementation.init: base implementation'
+		@memory = {}
+
+	# Perform a read operation
+	do_read: (location) ->
+		vlog 50, 'PageImplementation.do_read: base implementation'
+		@memory[location] || 0
+
+	# Perform a write operation
+	do_write: (location, value) ->
+		vlog 50, 'PageImplementation.do_write: base implementation'
+		@memory[location] = value || 0
+
+PageImplementations = {}
+
+exports.RegisterPageImplementation = (name, cls) -> PageImplementations[name] = cls
+exports.GetPageImplementations = () -> clone(PageImplementations)
+
+exports.RegisterPageImplementation 'Default', PageImplementation
+
+class PagingOptions
+	constructor: (Options) ->
+		Options = Options || {}
+		@PageSize = Options.PageSize || PAGE_DEFAULT_SIZE
+		# Name of entry in PagingImplementations
+		@PageImplementation = 'Default'
+
+	getPageImplementation: (name) ->
+		x = PageImplementations[name || @PageImplementation]
+		new x
+exports.PagingOptions = PagingOptions
+
+class Page
+	constructor: (pageSize, implementation) ->
+		@pageSize = pageSize || options.PageSize
+		@implementation = options.getPageImplementation implementation
+
+	read: (location) -> @implementation.read location
+	write: (location, value) -> @implementation.write location, value
+exports.Page = Page
+
+class PagingNode
+	constructor: (start, range, implementation) ->
+		@start = start
+		@range = range
+		@implementation = implementation
+		@prev = null
+		@next = null
+		@page = new Page range, @implementation
+
+	read: (location) -> @page.read location
+	write: (location, value) -> @page.write location, value
+exports.PagingNode = PagingNode
+
+options = new PagingOptions
+exports.options = options
+
+module.exports = exports
+
+decSymbol 'Paging.support.pages', exports


docuemented layers open/close

docuemented layers open/close

--- app/coffeescripts/LayersMenuView.coffee
+++ app/coffeescripts/LayersMenuView.coffee
@@ -26,6 +26,7 @@
     $("##{@options.parentId}").append(@el)
     @

+  #these open and close the Layers Menu itself
   displayOff: (e) =>
     @$el.removeClass "open"


Adds integration tests for the logs API

Adds integration tests for the logs API

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

--- test/integration/logsAPITests.coffee
+++ test/integration/logsAPITests.coffee
@@ -0,0 +1,135 @@
+should = require 'should'
+request = require 'supertest'
+server = require '../../lib/server'
+testUtils = require "../testUtils"
+auth = require("../testUtils").auth
+logger = require 'winston'
+
+describe 'API Integration Tests', ->
+
+  describe 'Logs REST API', ->
+
+    authDetails = {}
+    beforeTS = {}
+    middleTS = {}
+
+    beforeEach ->
+      authDetails = auth.getAuthDetails()
+
+    before (done) ->
+      # only errors are logged during tests
+      # setTimeouts are to make sure we don't get overlapping timestamps on the
+      # logs messages, this can affect their order and makes the tests fail.
+      beforeTS = new Date()
+      logger.error 'TEST1'
+      setTimeout ->
+        logger.error 'TEST2'
+        setTimeout ->
+          logger.error 'TEST3'
+          setTimeout ->
+            middleTS = new Date()
+            setTimeout ->
+              logger.error 'TEST4'
+              setTimeout ->
+                logger.error 'TEST5'
+                auth.setupTestUsers (err) ->
+                  server.start apiPort: 8080, ->
+                    done()
+              , 5
+            , 5
+          , 5
+        , 5
+      , 5
+
+    after (done) ->
+      auth.cleanupTestUsers (err) ->
+        server.stop ->
+          done()
+
+    describe '*getLogs', ->
+
+      it 'should return latest logs in order', (done) ->
+        request("https://localhost:8080")
+          .get("/logs?from=#{beforeTS.toISOString()}")
+          .set("auth-username", testUtils.rootUser.email)
+          .set("auth-ts", authDetails.authTS)
+          .set("auth-salt", authDetails.authSalt)
+          .set("auth-token", authDetails.authToken)
+          .expect(200)
+          .end (err, res) ->
+            if err
+              done err
+            else
+              res.body.length.should.be.equal 5
+              res.body[0].message.should.be.equal 'TEST1'
+              res.body[1].message.should.be.equal 'TEST2'
+              res.body[2].message.should.be.equal 'TEST3'
+              res.body[3].message.should.be.equal 'TEST4'
+              res.body[4].message.should.be.equal 'TEST5'
+              done()
+
+      it 'should limit number of logs returned', (done) ->
+        request("https://localhost:8080")
+          .get("/logs?limit=2&from=#{beforeTS.toISOString()}")
+          .set("auth-username", testUtils.rootUser.email)
+          .set("auth-ts", authDetails.authTS)
+          .set("auth-salt", authDetails.authSalt)
+          .set("auth-token", authDetails.authToken)
+          .expect(200)
+          .end (err, res) ->
+            if err
+              done err
+            else
+              res.body.length.should.be.equal 2
+              res.body[0].message.should.be.equal 'TEST1'
+              res.body[1].message.should.be.equal 'TEST2'
+              done()
+
+      it 'should use start after the specified entry', (done) ->
+        request("https://localhost:8080")
+          .get("/logs?start=3&from=#{beforeTS.toISOString()}")
+          .set("auth-username", testUtils.rootUser.email)
+          .set("auth-ts", authDetails.authTS)
+          .set("auth-salt", authDetails.authSalt)
+          .set("auth-token", authDetails.authToken)
+          .expect(200)
+          .end (err, res) ->
+            if err
+              done err
+            else
+              res.body.length.should.be.equal 2
+              res.body[0].message.should.be.equal 'TEST4'
+              res.body[1].message.should.be.equal 'TEST5'
+              done()
+
+      it 'should filter by date', (done) ->
+        request("https://localhost:8080")
+          .get("/logs?from=#{beforeTS.toISOString()}&until=#{middleTS.toISOString()}")
+          .set("auth-username", testUtils.rootUser.email)
+          .set("auth-ts", authDetails.authTS)
+          .set("auth-salt", authDetails.authSalt)
+          .set("auth-token", authDetails.authToken)
+          .expect(200)
+          .end (err, res) ->
+            if err
+              done err
+            else
+              res.body.length.should.be.equal 3
+              res.body[0].message.should.be.equal 'TEST1'
+              res.body[1].message.should.be.equal 'TEST2'
+              res.body[2].message.should.be.equal 'TEST3'
+              done()
+
+      it 'should deny access for a non-admin', (done) ->
+        request("https://localhost:8080")
+          .get("/logs")
+          .set("auth-username", testUtils.nonRootUser.email)
+          .set("auth-ts", authDetails.authTS)
+          .set("auth-salt", authDetails.authSalt)
+          .set("auth-token", authDetails.authToken)
+          .expect(403)
+          .end (err, res) ->
+            if err
+              done err
+            else
+              done()


feat(app): handle missing config

feat(app): handle missing config

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


Autocomplete bug fix #2233

Autocomplete bug fix #2233

--- app/views/play/level/tome/SpellView.coffee
+++ app/views/play/level/tome/SpellView.coffee
@@ -443,7 +443,7 @@
     # window.snippetEntries = snippetEntries
     lang = SpellView.editModes[e.language].substr 'ace/mode/'.length
     @zatanna.addSnippets snippetEntries, lang
-    @newlang = lang
+    @editorLang = lang

   onMultiplayerChanged: ->
     if @session.get('multiplayer')
@@ -1092,7 +1092,7 @@
     @destroyAceEditor(@ace)
     @debugView?.destroy()
     @toolbarView?.destroy()
-    @zatanna.addSnippets [], @newlang if @newlang?
+    @zatanna.addSnippets [], @editorLang if @editorLang?
     $(window).off 'resize', @onWindowResize
     super()


Removing parameter check for optional variable

--- server/methods/loadHistory.coffee
+++ server/methods/loadHistory.coffee
@@ -3,8 +3,8 @@

 		check rid, String
 		# check end, Match.Optional(Number)
-		check limit, Number
-		check ls, Match.Optional(Date)
+		# check limit, Number
+		# check ls, Match.Optional(Date)

 		if not Meteor.userId()
 			throw new Meteor.Error 'error-invalid-user', 'Invalid user', { method: 'loadHistory' }


fix for real this time

fix for real this time

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


Force kill on Windows

Force kill on Windows

--- build/Gruntfile.coffee
+++ build/Gruntfile.coffee
@@ -47,7 +47,7 @@
     contentsDir = shellAppDir
     appDir = path.join(shellAppDir, 'resources', 'app')
     installDir ?= path.join(process.env.ProgramFiles, appName)
-    killCommand = 'taskkill /IM atom.exe'
+    killCommand = 'taskkill /FIM atom.exe'
   else if process.platform is 'darwin'
     contentsDir = path.join(shellAppDir, 'Contents')
     appDir = path.join(contentsDir, 'Resources', 'app')


initial main.coffee - commit.

initial main.coffee - commit.

main.coffee to invoke required modules and their dependencies JavaScript, written in CoffeeScript.
http://coffeescript.org/

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

--- src/assets/script/coffee/main.coffee
+++ src/assets/script/coffee/main.coffee
@@ -0,0 +1 @@
+# MAIN CoffeeScript


Update line number rendering specs for new layer scheme

--- spec/editor-component-spec.coffee
+++ spec/editor-component-spec.coffee
@@ -143,40 +143,41 @@
       node.style.height = 4.5 * lineHeightInPixels + 'px'
       component.measureHeightAndWidth()

-      lines = node.querySelectorAll('.line-number')
-      expect(lines.length).toBe 6
-      expect(lines[0].textContent).toBe "#{nbsp}1"
-      expect(lines[5].textContent).toBe "#{nbsp}6"
+      lineNumberNodes = node.querySelectorAll('.line-number')
+      expect(lineNumberNodes.length).toBe 6
+      expect(lineNumberNodes[0].textContent).toBe "#{nbsp}1"
+      expect(lineNumberNodes[5].textContent).toBe "#{nbsp}6"

       verticalScrollbarNode.scrollTop = 2.5 * lineHeightInPixels
       verticalScrollbarNode.dispatchEvent(new UIEvent('scroll'))

-      expect(node.querySelector('.line-numbers').style['-webkit-transform']).toBe "translate3d(0, #{-2.5 * lineHeightInPixels}px, 0)"
-
       lineNumberNodes = node.querySelectorAll('.line-number')
       expect(lineNumberNodes.length).toBe 6
-      expect(lineNumberNodes[0].offsetTop).toBe 2 * lineHeightInPixels
-      expect(lineNumberNodes[5].offsetTop).toBe 7 * lineHeightInPixels
+
       expect(lineNumberNodes[0].textContent).toBe "#{nbsp}3"
+      expect(lineNumberNodes[0].style['-webkit-transform']).toBe "translate3d(0px, #{-.5 * lineHeightInPixels}px, 0px)"
       expect(lineNumberNodes[5].textContent).toBe "#{nbsp}8"
-
-    it "updates absolute positions of subsequent line numbers when lines are inserted or removed", ->
+      expect(lineNumberNodes[5].style['-webkit-transform']).toBe "translate3d(0px, #{4.5 * lineHeightInPixels}px, 0px)"
+
+    it "updates the translation of subsequent line numbers when lines are inserted or removed", ->
       editor.getBuffer().insert([0, 0], '\n\n')

       lineNumberNodes = node.querySelectorAll('.line-number')
-      expect(lineNumberNodes[0].offsetTop).toBe 0
-      expect(lineNumberNodes[1].offsetTop).toBe 1 * lineHeightInPixels
-      expect(lineNumberNodes[2].offsetTop).toBe 2 * lineHeightInPixels
-      expect(lineNumberNodes[3].offsetTop).toBe 3 * lineHeightInPixels
-      expect(lineNumberNodes[4].offsetTop).toBe 4 * lineHeightInPixels
+      expect(lineNumberNodes[0].style['-webkit-transform']).toBe "translate3d(0px, 0px, 0px)"
+      expect(lineNumberNodes[1].style['-webkit-transform']).toBe "translate3d(0px, #{1 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[2].style['-webkit-transform']).toBe "translate3d(0px, #{2 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[3].style['-webkit-transform']).toBe "translate3d(0px, #{3 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[4].style['-webkit-transform']).toBe "translate3d(0px, #{4 * lineHeightInPixels}px, 0px)"

       editor.getBuffer().insert([0, 0], '\n\n')
       lineNumberNodes = node.querySelectorAll('.line-number')
-      expect(lineNumberNodes[0].offsetTop).toBe 0
-      expect(lineNumberNodes[1].offsetTop).toBe 1 * lineHeightInPixels
-      expect(lineNumberNodes[2].offsetTop).toBe 2 * lineHeightInPixels
-      expect(lineNumberNodes[3].offsetTop).toBe 3 * lineHeightInPixels
-      expect(lineNumberNodes[4].offsetTop).toBe 4 * lineHeightInPixels
+      expect(lineNumberNodes[0].style['-webkit-transform']).toBe "translate3d(0px, 0px, 0px)"
+      expect(lineNumberNodes[1].style['-webkit-transform']).toBe "translate3d(0px, #{1 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[2].style['-webkit-transform']).toBe "translate3d(0px, #{2 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[3].style['-webkit-transform']).toBe "translate3d(0px, #{3 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[4].style['-webkit-transform']).toBe "translate3d(0px, #{4 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[5].style['-webkit-transform']).toBe "translate3d(0px, #{5 * lineHeightInPixels}px, 0px)"
+      expect(lineNumberNodes[6].style['-webkit-transform']).toBe "translate3d(0px, #{6 * lineHeightInPixels}px, 0px)"

     it "renders • characters for soft-wrapped lines", ->
       editor.setSoftWrap(true)


Test multiple tab lengths

Test multiple tab lengths

--- spec/tokenized-buffer-spec.coffee
+++ spec/tokenized-buffer-spec.coffee
@@ -358,6 +358,13 @@
         expect(tokenizedBuffer.lineForScreenRow(1).text).toBe "12  3"
         expect(tokenizedBuffer.lineForScreenRow(2).text).toBe "123 4"

+        tokenizedBuffer.setTabLength(2)
+        fullyTokenize(tokenizedBuffer)
+
+        expect(tokenizedBuffer.lineForScreenRow(0).text).toBe "1 2"
+        expect(tokenizedBuffer.lineForScreenRow(1).text).toBe "12  3"
+        expect(tokenizedBuffer.lineForScreenRow(2).text).toBe "123 4"
+
   describe "when the buffer contains surrogate pairs", ->
     beforeEach ->
       waitsForPromise ->