api config

api config

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

--- app/assets/javascripts/lib/api.cjsx
+++ app/assets/javascripts/lib/api.cjsx
@@ -0,0 +1,11 @@
+JSONAPIClient = require 'json-api-client'
+
+PATH_TO_API_ROOT = 'http://localhost:3000/'
+
+DEFAULT_HEADERS =
+  'Content-Type': 'application/json'
+  'Accept': 'application/vnd.api+json; version=1'
+
+client = new JSONAPIClient PATH_TO_API_ROOT, DEFAULT_HEADERS
+
+module.exports =client


fix jquery load failure

fix jquery load failure

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/robb-broome/jinglepie.git/'


Add to pages without explicit id-laden containers


Fix layout when turbolinks:load.

Fix layout when turbolinks:load.

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


stylefix(build): remove trailing withspaces

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


Create Main.coffee

Create Main.coffee

result:
https://paiza.jp/poh/ando/share/7d5b5f16

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

--- POH7/SantaFuku/Main.coffee
+++ POH7/SantaFuku/Main.coffee
@@ -0,0 +1,23 @@
+# Try POH
+# author: Leonardone @ NEETSDKASU
+
+process.stdin.resume()
+process.stdin.setEncoding 'utf8'
+process.stdin.on 'data', (data) ->
+    lines = data.toString().trim().split('\n').map (s) -> s.split(' ').map (x) -> parseInt x
+    [x, y, z, n] = lines.shift()
+    xs = [0, x]
+    ys = [0, y]
+    while n-- > 0
+        [d, a] = lines.shift()
+        if d == 0
+            xs.push a
+        else
+            ys.push a
+    xs.sort (a, b) -> a - b
+    ys.sort (a, b) -> a - b
+    for i in [1...xs.length]
+        x = Math.min x, xs[i] - xs[i - 1]
+    y = Math.min y, ys[i] - ys[i - 1] for i in [1...ys.length]
+    ans = x * y * z
+    console.log ans


Add delete.

Add delete.

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


Detect resolving absolute paths on windows

--- src/fs-utils.coffee
+++ src/fs-utils.coffee
@@ -290,7 +290,12 @@
     pathToResolve = args.pop()
     loadPaths = args

-    if pathToResolve[0] is '/'
+    if process.platform is 'win32'
+      isAbsolute = pathToResolve[1] is ':' # C:\ style
+    else
+      isAbsolute = pathToResolve[0] is '/' # /usr style
+
+    if isAbsolute
       if extensions and resolvedPath = @resolveExtension(pathToResolve, extensions)
         return resolvedPath
       else


[codegen] Gracefully handle empty bodies.

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


Problem management search bar.

Problem management search bar.

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


Fixed link jumping bug.

Fixed link jumping bug.


vex box will now open scrolled to bottom

--- SingularityUI/app/models/Request.coffee
+++ SingularityUI/app/models/Request.coffee
@@ -520,7 +520,7 @@
                         @run( @data.commandLineInput, message, @data.runId ).done doneFn
                         return true

-                afterOpen: =>
+                afterOpen: (vexContent) =>
                     taskRunAfterStart = localStorage.getItem('taskRunAfterStart')
                     $('#filename').val localStorage.getItem('taskRunRedirectFilename') or Utils.fileName(config.runningTaskLogPath)
                     $('#autoTail').prop 'checked', (taskRunAfterStart is 'autoTail')
@@ -532,9 +532,10 @@
                     $('#browse-to-sandbox').on('click', () => $('#filename').prop('disabled', true))
                     $('#autoTail').on('click', () => $('#filename').prop('disabled', false))
                     $('#filename').prop 'disabled', false if taskRunAfterStart is 'autoTail'
-                    focusFn = () => $('.vex-dialog-button, .vex-primary, .vex-first').focus()
-                    focusFn()
-                    setTimeout focusFn, 500 # For Firefox...
+                    vexContent.bind('vexOpen', () =>
+                      vexElement = document.getElementsByClassName('vex')[0]
+                      vexElement.scrollTop = vexElement.scrollHeight
+                    )

                 callback: (data) =>
                     if data.commandLineInput


initial choices are an array, not an object

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


Add initialization for bootstrap date selector

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

--- app/assets/javascripts/datetimepicker.coffee
+++ app/assets/javascripts/datetimepicker.coffee
@@ -0,0 +1,2 @@
+$ ->
+  $(".datepicker").datetimepicker(format: "MM/DD/YYYY")


Update Jison Lex section patterns

Update Jison Lex section patterns

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/nwhetsell/language-jison.git/'


add epic paladin female name

add epic paladin female name

--- app/lib/world/names.coffee
+++ app/lib/world/names.coffee
@@ -78,6 +78,7 @@
     'Celadia'
     'Taric'
     'Vaelia'
+    'Antary'
   ]
   'Ogre Witch': [
     # Female


opening file/dir works again.

opening file/dir works again.

but I don't like it. I feel like opening a file or
directory should create a new window, unless the
file or directory you are opening is contained in
the current projects dir.

--- plugins/project/project.coffee
+++ plugins/project/project.coffee
@@ -18,7 +18,10 @@
     'Command-Ctrl-N': 'toggle'

   initialize: ->
-    @dir = File.workingDirectory()
+    @reload(File.workingDirectory())
+
+    activeWindow.document.ace.on 'open', ({filename}) =>
+      @reload filename if File.isDirectory filename

     $('#project li').live 'click', (event) =>
       $('#project .active').removeClass 'active'
@@ -38,8 +41,10 @@

       false # Don't bubble!

+  reload: (dir) ->
+    @dir = dir
     @html.children('#project .cwd').text _.last @dir.split '/'
-    @html.children('#project li').remove()
+    @html.children('#project .files').empty()
     @html.children('#project .files').append @createList @dir

   createList: (dir) ->


Update play_view.coffee

Update play_view.coffee

New Level Added : Sword Loop

--- app/views/play_view.coffee
+++ app/views/play_view.coffee
@@ -162,6 +162,14 @@
         description: "Write a bubble sort to organize your soldiers. - by Alexandru"
       }
       {
+        name: 'Sword Loop'
+        difficulty: 1
+        id: 'sword-loop'
+        image: '/file/db/level/525dc5589a0765e496000006/drink_me_icon.png'
+        description: 'Kill the ogres and save the peasants and their cattle'
+      }
+
+      {
         name: 'Enemy Artillery'
         difficulty: 1
         id: 'enemy-artillery'


commit

commit

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


Leverages CoffeeScript better.

Leverages CoffeeScript better.

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


fix: do not show sys buckets

fix: do not show sys buckets

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


Added milksugar/view module amd-ified

Added milksugar/view module amd-ified

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

--- src/view.coffee
+++ src/view.coffee
@@ -0,0 +1,27 @@
+define 'milksugar/view', ['check', 'jquery', 'handlebars'], (check, $, Handlebars) ->
+
+  class MilkSugar.View
+
+    constructor: (@view) ->
+
+    data: null
+    subviews: []
+    partials: []
+    helpers: {}
+    target: null
+
+    render: (options) ->
+      dataObject = null
+
+      check(@data)
+        .array((data) -> dataObject = $.when @data)
+        .object((data) -> dataObject = $.Deferred((defer) -> defer.resolve([data])).promise())
+        .string((data) -> dataObject = $.ajax data)
+
+      check(@partials)
+
+      check(@subviews)
+
+      $.ajax(@view).done(->
+
+      )


fixed plugin initialization order dependency

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


commit

commit


Add menu item to toggle

Add menu item to toggle

This is helpful when things are going really wrong keybinding-wise

error: pathspec 'menus/keybinding-resolver.cson' did not match any file(s) known to git

--- menus/keybinding-resolver.cson
+++ menus/keybinding-resolver.cson
@@ -0,0 +1,11 @@
+'menu': [
+  {
+    'label': 'Packages'
+    'submenu': [
+      'label': 'Keybinding Resolver'
+      'submenu': [
+        { 'label': 'Toggle', 'command': 'key-binding-resolver:toggle' }
+      ]
+    ]
+  }
+]


Popovers now hide and show correctly

Popovers now hide and show correctly

--- app/assets/javascripts/users.js.coffee
+++ app/assets/javascripts/users.js.coffee
@@ -24,28 +24,29 @@
   )
   $('.comment-user-name').click((e)->
     if isVisible
-      console.log("isVisible")
-      if not $(this).hasClass('popover-visible')
-        console.log("there is a popup visible and but not this one")
-        $('.comment-user-name').popover('hide')
-        $('.comment-user-name').removeClass('popover-visible')
-        console.log("remove all popups1")
-        $(this).popover('toggle')
-        console.log("show this popup and add class visible")
-        $(this).addClass('popover-visible')
-        isVisible = true
-        clickedAway = false
-      else
-        console.log("clicked popup was visible")
-        $('.comment-user-name').popover('hide')
-        $('.comment-user-name').removeClass('popover-visible')
-        console.log("remove all popups2")
-        isVisible = false
-        clickedAway = false
+      $(this).addClass("selected")
+      $('.comment-user-name').each ->
+        if $(this).hasClass("selected")
+          if $(this).hasClass("popover-visible")
+            toggle_popover(false, $(this))
+            #$(this).popover('hide')
+            #$(this).removeClass('popover-visible')
+            isVisible = false
+          else
+            toggle_popover(true, $(this))
+            #$(this).popover('show')
+            #$(this).addClass('popover-visible')
+            isVisible = true
+        else
+          toggle_popover(false, $(this))
+          #$(this).popover('hide')
+          #$(this).removeClass('popover-visible')
+      $(this).removeClass("selected")
+      clickedAway = false
     else
-      console.log("non-visible, showing popover")
-      $(this).popover('show')
-      $(this).addClass('popover-visible')
+      #$(this).popover('show')
+      #$(this).addClass('popover-visible')
+      toggle_popover(true, $(this))
       clickedAway = false
       isVisible = true
     e.preventDefault()
@@ -53,13 +54,21 @@

   $(document).click((e)->
     if(isVisible & clickedAway)
-      console.log("visible and clickedAway - hiding popover")
+      toggle_popover(false, $('.comment-user-name'))
       #$('.comment-user-name').popover('hide')
       #$('.comment-user-name').removeClass('popover-visible')
       isVisible = false
       clickedAway = false
     else
-      console.log("clickedAway = true")
-      console.log("-------------------")
       clickedAway = true
   )
+
+  toggle_popover = (show, elem) ->
+    #elem.each ->
+    if show
+      elem.popover('show')
+      elem.addClass('popover-visible')
+    else
+      elem.popover('hide')
+      elem.removeClass('popover-visible')
+


KodingAppsController: AppSkeleton class which will be the source class for blank app template.

--- client/Main/kodingappscontroller.coffee
+++ client/Main/kodingappscontroller.coffee
@@ -231,34 +231,6 @@
   # MAKE NEW APP
   # #

-  defaultManifest = (type, name)->
-
-    {profile} = KD.whoami()
-    raw =
-      background    : no
-      behavior      : "application"
-      version       : "0.1"
-      title         : "#{name or type.capitalize()}"
-      name          : "#{name or type.capitalize()}"
-      identifier    : "com.koding.apps.#{utils.slugify name or type}"
-      path          : "~/Applications/#{name or type.capitalize()}.kdapp"
-      homepage      : "#{profile.nickname}.#{KD.config.userSitesDomain}/#{utils.slugify name or type}"
-      repository    : "git://github.com/#{profile.nickname}/#{utils.slugify name or type}.kdapp.git"
-      description   : "#{name or type} : a Koding application created with the #{type} template."
-      category      : "web-app" # can be web-app, add-on, server-stack, framework, misc
-      source        :
-        blocks      :
-          app       :
-            files   : [ "./index.coffee" ]
-        stylesheets : [ "./resources/style.css" ]
-      options       :
-        type        : "tab"
-      icns          :
-        "128"       : "./resources/icon.128.png"
-      fileTypes     : []
-
-    json = JSON.stringify raw, null, 2
-
   newAppModal = null

   getAppPath:(manifest, escaped=no)->
@@ -269,7 +241,7 @@
     return FSHelper.escapeFilePath path  if escaped
     return path.replace /(\/+)$/, ""

-  makeNewApp:(callback)->
+  makeNewApp:(machine, callback)->

     newAppModal = new KDModalViewWithForms
       title                       : "Create a new Application"
@@ -336,17 +308,6 @@
                   messages        :
                     regExp        : "For Application name only lowercase letters are allowed!"

-  _createChangeLog:(name)->
-    today = new Date().format('yyyy-mm-dd')
-    {profile} = KD.whoami()
-    fullName  = KD.utils.getFullnameFromAccount()
-
-    """
-     #{today} #{fullName} <@#{profile.nickname}>
-
-        * #{name} (index.coffee): Application created.
-    """
-
   prepareApplication:(name, callback)->

     unless name
@@ -571,3 +532,128 @@
         }

       callback null, manifest
+
+
+class AppSkeleton
+
+  @manifest = (type, name)->
+
+    {profile} = KD.whoami()
+    raw =
+      background    : no
+      behavior      : "application"
+      version       : "0.1"
+      title         : "#{name or type.capitalize()}"
+      name          : "#{name or type.capitalize()}"
+      identifier    : "com.koding.apps.#{utils.slugify name or type}"
+      path          : "~/Applications/#{name or type.capitalize()}.kdapp"
+      homepage      : "#{profile.nickname}.#{KD.config.userSitesDomain}/#{utils.slugify name or type}"
+      repository    : "git://github.com/#{profile.nickname}/#{utils.slugify name or type}.kdapp.git"
+      description   : "#{name or type} : a Koding application created with the #{type} template."
+      category      : "web-app" # can be web-app, add-on, server-stack, framework, misc
+      source        :
+        blocks      :
+          app       :
+            files   : [ "./index.coffee" ]
+        stylesheets : [ "./resources/style.css" ]
+      options       :
+        type        : "tab"
+      icns          :
+        "128"       : "./resources/icon.128.png"
+      fileTypes     : []
+
+    json = JSON.stringify raw, null, 2
+
+
+  @changeLog = (name)->
+
+    today = new Date().format('yyyy-mm-dd')
+    {profile} = KD.whoami()
+    fullName  = KD.utils.getFullnameFromAccount()
+
+    """
+     #{today} #{fullName} <@#{profile.nickname}>
+
+        * #{name} (index.coffee): Application created.
+    """
+
+
+  @indexCoffee =
+
+    """
+      class %%APPNAME%%MainView extends KDView
+
+        constructor:(options = {}, data)->
+          options.cssClass = '%%appname%% main-view'
+          super options, data
+
+        viewAppended:->
+          @addSubView new KDView
+            partial  : "Welcome to %%APPNAME%% app!"
+            cssClass : "welcome-view"
+
+      class %%APPNAME%%Controller extends AppController
+
+        constructor:(options = {}, data)->
+          options.view    = new %%APPNAME%%MainView
+          options.appInfo =
+            name : "%%APPNAME%%"
+            type : "application"
+
+          super options, data
+
+      do ->
+
+        # In live mode you can add your App view to window's appView
+        if appView?
+
+          view = new %%APPNAME%%MainView
+          appView.addSubView view
+
+        else
+
+          KD.registerAppClass %%APPNAME%%Controller,
+            name     : "%%APPNAME%%"
+            routes   :
+              "/:name?/%%APPNAME%%" : null
+              "/:name?/%%AUTHOR%%/Apps/%%APPNAME%%" : null
+            dockPath : "/%%AUTHOR%%/Apps/%%APPNAME%%"
+            behavior : "application"
+    """
+
+  @styleCss =
+
+    """
+      .%%appname%%.main-view {
+        background: white;
+      }
+
+      .%%appname%% .welcome-view {
+
+        background: #eee;
+
+        height: auto;
+        width: auto;
+        max-width: 300px;
+
+        margin: 50px auto;
+
+        border: 1px solid #ccc;
+        border-radius: 4px;
+
+        padding:10px;
+
+        text-align:center;
+
+      }
+    """
+
+  @readmeMd =
+
+    """
+      %%APPNAME%%
+      -----------
+
+      Yet another awesome Koding application! by %%AUTHOR_FULLNAME%%
+
+    """


Client: Activity: Test: Deleted unused LikersStore and allUsers getters from SelectedChannelThread getter method

--- client/activity/lib/flux/getters.coffee
+++ client/activity/lib/flux/getters.coffee
@@ -228,10 +228,8 @@
 selectedChannelThread = [
   channelThreads
   selectedChannel
-  MessageLikersStore
   selectedChannelPopularMessages
-  allUsers
-  (threads, channel, likers, popularMessages, users) ->
+  (threads, channel, popularMessages) ->
     return null  unless channel
     thread = threads.get channel.get('id')
     thread = thread.set 'channel', channel


Machine: fetchInfo: keep copy of klient.info response

--- client/app/lib/providers/machine.coffee
+++ client/app/lib/providers/machine.coffee
@@ -83,11 +83,18 @@

       @updateLocalData()

+    @fetchInfo => @emit 'ready'
+

   updateLocalData: ->
+
     { @label, @ipAddress, @_id, @provisioners, @provider, @credential
       @status, @uid, @domain, @queryString, @slug } = @jMachine
     @alwaysOn = @jMachine.meta.alwaysOn ? no
+
+    @readyState = 0
+    @fetchInfo()
+

   setLabel: (label, callback) ->
@@ -142,6 +149,29 @@
         disconnect : kd.noop
         ready      : kd.noop
       }
+
+
+  fetchInfo: (callback = kd.noop) ->
+
+    owner = @getOwner()
+
+    setAndReturnDefault = =>
+      callback null, @info =
+        home     : "/home/#{owner}"
+        groups   : [owner, 'sudo']
+        username : owner
+
+    if @isRunning()
+      kite = @getBaseKite()
+      kite.init().then =>
+        kite.klientInfo().then (info) =>
+          callback null, @info = info
+        .timeout globals.COMPUTECONTROLLER_TIMEOUT
+        .catch (err) =>
+          kd.warn '[Machine][fetchInfo] Failed to get klient.info', err
+          setAndReturnDefault()
+    else
+      setAndReturnDefault()

   getOwner: ->


show membership role changed modal for user whose role changed

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


landing: team-creation: minor bug fix

landing: team-creation: minor bug fix


<controller> Measure - Basic operations.

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

--- server/controllers/measure.coffee
+++ server/controllers/measure.coffee
@@ -0,0 +1,40 @@
+###
+# =================
+# CONTROLLER - Measure
+# =================
+# Operations on Measures. Note that Measures are only created through Sensor instances.
+###
+
+Measure = require '../models/measure'
+
+module.exports.fetch = (req, res, next, id) ->
+	Measure.find id, (err, measure) ->
+		if err or not measure
+			res.send error: "Measure not found", 404
+		else
+			req.measure = measure
+			next()
+
+module.exports.all = (req, res, next) ->
+	Measure.all (err, results) ->
+		return next err if err
+
+		res.send 200, results
+
+module.exports.read = (req, res) ->
+	res.send req.measure
+
+module.exports.update = (req, res) ->
+	data = req.body
+	req.measure.update data, (err, measure) ->
+		if err?
+			res.send error: "Server error while saving measure", 500
+		else
+			res.send measure, 200
+
+module.exports.delete = (req, res) ->
+	req.measure.destroy (err) ->
+		if err?
+			res.send error: "Server error while deleting measure", 500
+		else
+			res.send success: true, 200


SearchController: directly use mongo until algolia issue is fixed

--- client/app/lib/searchcontroller.coffee
+++ client/app/lib/searchcontroller.coffee
@@ -165,7 +165,8 @@
     { showCurrentUser } = opts
     delete opts.showCurrentUser

-    return @searchAccountsMongo seed, { showCurrentUser }  if @ready and not @algolia
+    if @ready # and not @algolia # FIXME ~ US
+      return @searchAccountsMongo seed, { showCurrentUser }

     @search 'accounts', seed, opts
       .then (data) ->


fix link to hitchwiki

fix link to hitchwiki

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


adds first version of (1+1)-strategy

adds first version of (1+1)-strategy

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

--- coffee/mu_over_rho_comma_lambda.coffee
+++ coffee/mu_over_rho_comma_lambda.coffee
@@ -0,0 +1,66 @@
+# 'mu|rho,lambda' algorithm
+
+class mu_over_rho_comma_lambda
+  constructor: (parameter) ->
+    parameter.algorithm = {}
+    parameter.algorithm.mutation_logic = @mutation
+    parameter.algorithm.selection_logic = @selection
+    parameter.algorithm.recombination_logic = @recombination
+    @algorithm = new stochastic_optimization(parameter)
+
+    @parameter = @algorithm.parameter
+    @parameter.sigma = @calculate_initial_step_size(@parameter.search_space)
+    @parameter.sigma_factor = @parameter.sigma_factor or 0.85
+    @parameter.ratio_of_positive_mutation_threshold = @parameter.ratio_of_positive_mutation_threshold or 1/5
+
+  calculate_initial_step_size: (search_space) =>
+    sigma = 0
+    for search_space_dimension in search_space
+      width = search_space_dimension.max - search_space_dimension.min
+      if width > sigma
+        sigma = width
+    sigma*0.2 # x% of maximum width of all dimensions
+
+  mutation: =>
+    particle_mutation = (parameter, current) ->
+      child = new Array()
+      xi = 0
+      while xi < parameter.number_of_dimensions
+        # MUTATE BY GAUSS, sigma mu
+        child_xi = current[xi] + Math.random() * parameter.sigma
+        child.push child_xi
+        xi++
+      child
+    particles = @algorithm.particles
+    for particle in particles.particles
+      child_parameter_value = particle_mutation @parameter, particle.parameter_value
+      child_parameter_value = particles.check_parameter_value_in_search_space child_parameter_value
+      child_objective_value = @parameter.objective child_parameter_value
+      particle.child = new Particle child_parameter_value, child_objective_value
+
+  recombination: =>
+    a = 3
+
+  selection: =>
+    # 'environmental selection'
+    particles = @algorithm.particles
+    child_wins = 0
+    for particle in particles.particles
+      if particle.child.dominates(particle)
+        child_wins++
+        @parameter.on_particle_death(particle, @algorithm.iteration_progress)
+        particle.parameter_value = particle.child.parameter_value
+        particle.objective_value = particle.child.objective_value
+        @parameter.on_particle_creation(particle)
+        particles.check_best_particle(particle)
+    # step size control
+    ratio_of_positive_mutations = child_wins / particles.particles.length
+    if ratio_of_positive_mutations < @parameter.ratio_of_positive_mutation_threshold
+      @parameter.sigma /= @parameter.sigma_factor
+    else
+      @parameter.sigma *= @parameter.sigma_factor
+    if DISPLAY_ITERATION_INFO
+      $('#iteration_display').append "<br/>#{ratio_of_positive_mutations} positive mutations"
+
+  run: =>
+    @algorithm.run()


test path testing

test path testing

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/michael-lumley/DA-Database.git/'


interstitial

interstitial

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


Include the model contexts from the parent view so that they're available inside iteration bindings.

--- src/rivets.coffee
+++ src/rivets.coffee
@@ -223,6 +223,7 @@

   for item in collection
     data = {}
+    data[n] = m for n, m of binding.view.models
     data[name] = item
     itemEl = el.cloneNode true
     previous = binding.iterated[binding.iterated.length - 1] or binding.marker


Add some code documentation for the Rivets.View class.

--- src/rivets.coffee
+++ src/rivets.coffee
@@ -30,10 +30,14 @@
       @el.addEventListener 'change', (el) =>
         Rivets.config.adapter.publish @context, @keypath, getInputValue el

+# Parses and stores the binding data for an entire view binding.
 class Rivets.View
+  # Takes the parent DOM element as well as all the context objects that are to
+  # be binded to the view.
   constructor: (@el, @contexts) ->
     @build()

+  # Parses and builds new Rivets.Binding instances for the data bindings.
   build: =>
     @bindings = []

@@ -46,6 +50,7 @@
           keypath = path.join '.'
           @bindings.push new Rivets.Binding node, type, context, keypath

+  # Binds all of the current bindings for this view.
   bind: =>
     binding.bind() for binding in @bindings


Fix the shortcut key

Fix the shortcut key

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


Delete app.coffee

Delete app.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/moorvin/Sea-Fight.git/'


remove .only from local datetime tests

remove .only from local datetime tests

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


[bot] [fix] broken channel featuring

[bot] [fix] broken channel featuring

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


[bot] [fix] trying to avoid null and undefined data on streams


Move convention tags to config-syntax

Move convention tags to config-syntax

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

--- src/checkers/config-syntax.coffee
+++ src/checkers/config-syntax.coffee
@@ -0,0 +1,4 @@
+module.exports =
+	VERSION_TAG: /\$version\$/
+	NAME_TAG: /\$name\$/
+	URL_QUERY_TAG: /\?.+$/


Groups: only in domain creation phase domain prefix is tested


add index.coffee entry point

add index.coffee entry point

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

--- index.coffee
+++ index.coffee
@@ -0,0 +1,10 @@
+fs = require 'fs'
+path = require 'path'
+
+module.exports = (robot) ->
+  scriptsPath = path.resolve(__dirname, 'src')
+  fs.exists path, (exists) ->
+    if exists
+      for script in fs.readdirSync(path)
+        robot.loadFile(path, file)
+        robot.parseHelp(path.join(path, file))


We need this for Bundlers that not respect the package.json

--- index.coffee
+++ index.coffee
@@ -0,0 +1 @@
+module.exports = require './src'


chart now shows percentages

chart now shows percentages

fatal: remote error: upload-pack: not our ref c5c173fe0822c6e3903ef9eb536ec1c1cb943d8e
fatal: the remote end hung up unexpectedly


OM-352 Add comment to explain hash append

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/CrowdTwist/widgets-js-sdk.git/'


filereading attempt 15

filereading attempt 15

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


Never mark current conversation unread

Never mark current conversation unread

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


Add Editor.logRenderedLines to help debugging

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -813,3 +813,7 @@

   logLines: (start, end) ->
     @renderer.logLines(start, end)
+
+  logRenderedLines: ->
+    @visibleLines.find('.line').each (n) ->
+      console.log n, $(this).text()


Update components.coffee

Update components.coffee

activate twitter ui

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


Add console.warn for bug in archives.json

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


moving request animation frame to gamelib

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


Remove unused subscriptions ivar

Remove unused subscriptions ivar

Closes #4343

--- src/text-editor-element.coffee
+++ src/text-editor-element.coffee
@@ -17,7 +17,6 @@
   focusOnAttach: false

   createdCallback: ->
-    @subscriptions =
     @initializeContent()
     @createSpacePenShim()
     @addEventListener 'focus', @focused.bind(this)


Adding workQueueBroker test spec

Adding workQueueBroker test spec

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

--- src/workQueueBrokerSpec.coffee
+++ src/workQueueBrokerSpec.coffee
@@ -0,0 +1,56 @@
+'use strict'
+redisQueueTimeout = 1
+myWorkQueue = null
+myBroker = null
+expectedItems = [
+    'item one',
+    'item two',
+    'item three',
+]
+itemCnt = 0
+
+WorkQueueBroker = require './workQueueBroker'
+
+describe 'WorkQueueBroker', () ->
+  it 'must connect to redis-server', (done) ->
+    myBroker = new WorkQueueBroker()
+    myBroker.connect () ->
+      console.log 'work queue broker ready'
+      myBroker.on 'error', (error) ->
+        console.log '>>>' + error
+        process.exit()
+      myBroker.on 'timeout', ->
+        console.log '>>>timeout'
+      myBroker.on 'end', ->
+        console.log '>>>End Redis connection'
+      done()
+
+  ## it 'creates a queue with no problem', () ->
+
+  it 'receives published data from given queue', (done) ->
+    console.log 'creating queue "work-queue"'
+    myWorkQueue = myBroker.createQueue 'work-queue'
+    expect(typeof myWorkQueue.subscribe).toEqual('function')
+    message = 'Hello, World!'
+
+    myWorkQueue.subscribe (payload) ->
+      console.log 'receved published payload = "' + payload + '"'
+      expect(payload).toEqual(message)
+      console.log 'we are done now'
+      done()
+
+    console.log 'publishing "' + message + '"'
+    myWorkQueue.publish message
+    myBroker.monitor(1)
+
+  it 'quits Redis cleanly', () ->
+    console.log 'Quitting redis again'
+    expect(myBroker.end()).toEqual true
+    ## expect(myBroker.disconnect()).toEqual true
+
+###
+      myWorkQueue.clear () ->
+        console.log 'Cleared "work-queue"'
+        done()
+###
+


Added test for OnlyHTMLDoctype

Added test for OnlyHTMLDoctype

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

--- test/rules/OnlyHTMLDoctype.coffee
+++ test/rules/OnlyHTMLDoctype.coffee
@@ -0,0 +1,28 @@
+expect = require('chai').expect
+rule = require "./../../src/rules/#{require('path').basename(__filename, '.coffee')}"
+
+describe 'OnlyHTMLDoctype', ->
+    it 'should disallow all other doctypes', ->
+        it 'should catch xml doctypes', ->
+            expect rule::validate """
+            doctype xml
+            """
+            .to.be.false
+
+        it 'should catch non-html5 doctype', ->
+            expect rule::validate """
+            doctype transitional
+            """
+            .to.be.false
+
+    it 'should pass html5 doctype', ->
+        expect rule::validate """
+        doctype html
+        """
+        .to.be.true
+
+    it 'should ignore other elements', ->
+        expect rule::validate """
+        .class#id
+        """
+        .to.be.true


add url to test config

add url to test 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/stevelacy/portal.git/'


performance improvements

performance improvements

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


Added ackbar script. Provides random pictures of Admiral Ackbar whenever someone says the word trap

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

--- src/scripts/ackbar.coffee
+++ src/scripts/ackbar.coffee
@@ -0,0 +1,22 @@
+# It's a trap
+#
+# trap - Display an Admiral Ackbar piece of wonder
+#
+
+ackbars = [
+  "http://dayofthejedi.com/wp-content/uploads/2011/03/171.jpg",
+  "http://dayofthejedi.com/wp-content/uploads/2011/03/152.jpg",
+  "http://farm4.static.flickr.com/3572/3637082894_e23313f6fb_o.jpg",
+  "http://www.youtube.com/watch?v=dddAi8FF3F4",
+  "http://6.asset.soup.io/asset/0610/8774_242b_500.jpeg",
+  "http://files.g4tv.com/ImageDb3/279875_S/steampunk-ackbar.jpg",
+  "http://farm6.staticflickr.com/5126/5725607070_b80e61b4b3_z.jpg",
+  "http://www.x929.ca/shows/newsboy/wp-content/uploads/admiral-ackbar-mouse-trap.jpg",
+  "http://farm6.static.flickr.com/5291/5542027315_ba79daabfb.jpg",
+  "http://farm5.staticflickr.com/4074/4751546688_5c76b0e308_z.jpg",
+  "http://farm6.staticflickr.com/5250/5216539895_09f963f448_z.jpg"
+]
+
+module.exports = (robot) ->
+  robot.hear /.*(trap).*/i, (msg) ->
+    msg.send msg.random ackbars


Handle no values

Handle no values

--- components/autocomplete/index.cjsx
+++ components/autocomplete/index.cjsx
@@ -104,10 +104,10 @@
     else
       Object.keys(@state.values)?[0]

-  setValue: (data) ->
+  setValue: (data = []) ->
+    values = {}
     data = [data] if typeof data is 'string'
-    values = {}
-    values[key] = label for key, label of @state.dataSource when key in data
+    values[key] = label for key, label of @state?.dataSource when key in data
     @state.values = values
     @setState values: values
     @refs.input.setValue values[Object.keys(values)?[0]] unless @props.multiple


Add test game

Add test game

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

--- src/test/test_game.coffee
+++ src/test/test_game.coffee
@@ -0,0 +1,11 @@
+{god} = require('../god')
+{game} = require('../game')
+
+exports.test_game = (test, rx) ->
+  world = god(rx, config)
+
+  test 'game load', (t) ->
+    t.ok game, 'game'
+    t.ok example = game 'example', 'example'
+    t.end()
+


user info clientside length validations

user info clientside length validations

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


instructions: improve position calculation of pointer animations


:lipstick:

:lipstick:

--- src/workspace-view.coffee
+++ src/workspace-view.coffee
@@ -233,10 +233,6 @@
   getActivePaneView: ->
     @panes.getActivePane()

-  # Deprecated: Returns the currently focused {PaneView}.
-  getActivePane: ->
-    @getActivePaneView()
-
   # Public: Returns the currently focused item from within the focused {PaneView}
   getActivePaneItem: ->
     @model.activePaneItem
@@ -291,10 +287,14 @@
   beforeRemove: ->
     @model.destroy()

-  # Deprecated:
+  # Deprecated
   eachPane: (callback) ->
     @eachPaneView(callback)

-  # Deprecated:
+  # Deprecated
   getPanes: ->
     @getPaneViews()
+
+  # Deprecated
+  getActivePane: ->
+    @getActivePaneView()


:art: add spaces after commas

:art: add spaces after commas

--- spec/text-editor-spec.coffee
+++ spec/text-editor-spec.coffee
@@ -4522,20 +4522,20 @@
       editor.insertText(" getPreviousWord\n")
       editor.insertText("e, => \n")
       editor.insertText(" 88 \n")
-      editor.setCursorBufferPosition([0,5])
-      editor.addCursorAtBufferPosition([1,7])
-      editor.addCursorAtBufferPosition([2,5])
-      editor.addCursorAtBufferPosition([3,3])
+      editor.setCursorBufferPosition([0, 5])
+      editor.addCursorAtBufferPosition([1, 7])
+      editor.addCursorAtBufferPosition([2, 5])
+      editor.addCursorAtBufferPosition([3, 3])
       [selection1, selection2, selection3, selection4] = editor.getSelections()

       editor.selectToPreviousSubwordBoundary()
-      expect(selection1.getBufferRange()).toEqual([[0,1], [0,5]])
+      expect(selection1.getBufferRange()).toEqual([[0, 1], [0, 5]])
       expect(selection1.isReversed()).toBeTruthy()
-      expect(selection2.getBufferRange()).toEqual([[1,4], [1,7]])
+      expect(selection2.getBufferRange()).toEqual([[1, 4], [1, 7]])
       expect(selection2.isReversed()).toBeTruthy()
-      expect(selection3.getBufferRange()).toEqual([[2,3], [2,5]])
+      expect(selection3.getBufferRange()).toEqual([[2, 3], [2, 5]])
       expect(selection3.isReversed()).toBeTruthy()
-      expect(selection4.getBufferRange()).toEqual([[3,1], [3,3]])
+      expect(selection4.getBufferRange()).toEqual([[3, 1], [3, 3]])
       expect(selection4.isReversed()).toBeTruthy()

   describe ".selectToNextSubwordBoundary", ->
@@ -4545,20 +4545,20 @@
       editor.insertText("getPreviousWord\n")
       editor.insertText("e, => \n")
       editor.insertText(" 88 \n")
-      editor.setCursorBufferPosition([0,1])
-      editor.addCursorAtBufferPosition([1,7])
-      editor.addCursorAtBufferPosition([2,2])
-      editor.addCursorAtBufferPosition([3,1])
+      editor.setCursorBufferPosition([0, 1])
+      editor.addCursorAtBufferPosition([1, 7])
+      editor.addCursorAtBufferPosition([2, 2])
+      editor.addCursorAtBufferPosition([3, 1])
       [selection1, selection2, selection3, selection4] = editor.getSelections()

       editor.selectToNextSubwordBoundary()
-      expect(selection1.getBufferRange()).toEqual([[0,1], [0,4]])
+      expect(selection1.getBufferRange()).toEqual([[0, 1], [0, 4]])
       expect(selection1.isReversed()).toBeFalsy()
-      expect(selection2.getBufferRange()).toEqual([[1,7], [1,11]])
+      expect(selection2.getBufferRange()).toEqual([[1, 7], [1, 11]])
       expect(selection2.isReversed()).toBeFalsy()
-      expect(selection3.getBufferRange()).toEqual([[2,2], [2,5]])
+      expect(selection3.getBufferRange()).toEqual([[2, 2], [2, 5]])
       expect(selection3.isReversed()).toBeFalsy()
-      expect(selection4.getBufferRange()).toEqual([[3,1], [3,3]])
+      expect(selection4.getBufferRange()).toEqual([[3, 1], [3, 3]])
       expect(selection4.isReversed()).toBeFalsy()

   describe ".deleteToBeginningOfSubword", ->
@@ -4568,10 +4568,10 @@
       editor.insertText(" getPreviousWord\n")
       editor.insertText("e, => \n")
       editor.insertText(" 88 \n")
-      editor.setCursorBufferPosition([0,5])
-      editor.addCursorAtBufferPosition([1,7])
-      editor.addCursorAtBufferPosition([2,5])
-      editor.addCursorAtBufferPosition([3,3])
+      editor.setCursorBufferPosition([0, 5])
+      editor.addCursorAtBufferPosition([1, 7])
+      editor.addCursorAtBufferPosition([2, 5])
+      editor.addCursorAtBufferPosition([3, 3])
       [cursor1, cursor2, cursor3, cursor4] = editor.getCursors()

       editor.deleteToBeginningOfSubword()
@@ -4579,30 +4579,30 @@
       expect(buffer.lineForRow(1)).toBe(' getviousWord')
       expect(buffer.lineForRow(2)).toBe('e,  ')
       expect(buffer.lineForRow(3)).toBe('  ')
-      expect(cursor1.getBufferPosition()).toEqual([0,1])
-      expect(cursor2.getBufferPosition()).toEqual([1,4])
-      expect(cursor3.getBufferPosition()).toEqual([2,3])
-      expect(cursor4.getBufferPosition()).toEqual([3,1])
+      expect(cursor1.getBufferPosition()).toEqual([0, 1])
+      expect(cursor2.getBufferPosition()).toEqual([1, 4])
+      expect(cursor3.getBufferPosition()).toEqual([2, 3])
+      expect(cursor4.getBufferPosition()).toEqual([3, 1])

       editor.deleteToBeginningOfSubword()
       expect(buffer.lineForRow(0)).toBe('')
       expect(buffer.lineForRow(1)).toBe(' viousWord')
       expect(buffer.lineForRow(2)).toBe('e ')
       expect(buffer.lineForRow(3)).toBe(' ')
-      expect(cursor1.getBufferPosition()).toEqual([0,0])
-      expect(cursor2.getBufferPosition()).toEqual([1,1])
-      expect(cursor3.getBufferPosition()).toEqual([2,1])
-      expect(cursor4.getBufferPosition()).toEqual([3,0])
+      expect(cursor1.getBufferPosition()).toEqual([0, 0])
+      expect(cursor2.getBufferPosition()).toEqual([1, 1])
+      expect(cursor3.getBufferPosition()).toEqual([2, 1])
+      expect(cursor4.getBufferPosition()).toEqual([3, 0])

       editor.deleteToBeginningOfSubword()
       expect(buffer.lineForRow(0)).toBe('')
       expect(buffer.lineForRow(1)).toBe('viousWord')
       expect(buffer.lineForRow(2)).toBe('  ')
       expect(buffer.lineForRow(3)).toBe('')
-      expect(cursor1.getBufferPosition()).toEqual([0,0])
-      expect(cursor2.getBufferPosition()).toEqual([1,0])
-      expect(cursor3.getBufferPosition()).toEqual([2,0])
-      expect(cursor4.getBufferPosition()).toEqual([2,1])
+      expect(cursor1.getBufferPosition()).toEqual([0, 0])
+      expect(cursor2.getBufferPosition()).toEqual([1, 0])
+      expect(cursor3.getBufferPosition()).toEqual([2, 0])
+      expect(cursor4.getBufferPosition()).toEqual([2, 1])

   describe ".deleteToEndOfSubword", ->
     it "deletes subwords", ->
@@ -4611,10 +4611,10 @@
       editor.insertText("getPreviousWord \n")
       editor.insertText("e, => \n")
       editor.insertText(" 88 \n")
-      editor.setCursorBufferPosition([0,0])
-      editor.addCursorAtBufferPosition([1,0])
-      editor.addCursorAtBufferPosition([2,2])
-      editor.addCursorAtBufferPosition([3,0])
+      editor.setCursorBufferPosition([0, 0])
+      editor.addCursorAtBufferPosition([1, 0])
+      editor.addCursorAtBufferPosition([2, 2])
+      editor.addCursorAtBufferPosition([3, 0])
       [cursor1, cursor2, cursor3, cursor4] = editor.getCursors()

       editor.deleteToEndOfSubword()
@@ -4622,20 +4622,20 @@
       expect(buffer.lineForRow(1)).toBe('PreviousWord ')
       expect(buffer.lineForRow(2)).toBe('e, ')
       expect(buffer.lineForRow(3)).toBe('88 ')
-      expect(cursor1.getBufferPosition()).toEqual([0,0])
-      expect(cursor2.getBufferPosition()).toEqual([1,0])
-      expect(cursor3.getBufferPosition()).toEqual([2,2])
-      expect(cursor4.getBufferPosition()).toEqual([3,0])
+      expect(cursor1.getBufferPosition()).toEqual([0, 0])
+      expect(cursor2.getBufferPosition()).toEqual([1, 0])
+      expect(cursor3.getBufferPosition()).toEqual([2, 2])
+      expect(cursor4.getBufferPosition()).toEqual([3, 0])

       editor.deleteToEndOfSubword()
       expect(buffer.lineForRow(0)).toBe('')
       expect(buffer.lineForRow(1)).toBe('Word ')
       expect(buffer.lineForRow(2)).toBe('e,')
       expect(buffer.lineForRow(3)).toBe(' ')
-      expect(cursor1.getBufferPosition()).toEqual([0,0])
-      expect(cursor2.getBufferPosition()).toEqual([1,0])
-      expect(cursor3.getBufferPosition()).toEqual([2,2])
-      expect(cursor4.getBufferPosition()).toEqual([3,0])
+      expect(cursor1.getBufferPosition()).toEqual([0, 0])
+      expect(cursor2.getBufferPosition()).toEqual([1, 0])
+      expect(cursor3.getBufferPosition()).toEqual([2, 2])
+      expect(cursor4.getBufferPosition()).toEqual([3, 0])

   describe 'gutters', ->
     describe 'the TextEditor constructor', ->


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


make sure the command exists before you try to list it

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


Split problem metadata out from problem editing contents when rendering

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


fix for url without parameters

fix for url without parameters

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


Add-back datastore and model properties and update $boot to use.

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


Simple $.ajax wrapper for loading our packages async

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

--- lib/get_script.coffee
+++ lib/get_script.coffee
@@ -0,0 +1,9 @@
+{ ASSET_PATH, JS_EXT } = require('sharify').data
+
+module.exports = (packageName, callback) ->
+  $.ajax
+    cache    : true
+    type     : 'GET'
+    dataType : 'script'
+    url      : ASSET_PATH + packageName + JS_EXT
+    success  : callback


Added base test case

Added base test case

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

--- test/t0-basics.coffee
+++ test/t0-basics.coffee
@@ -0,0 +1,10 @@
+
+{ expect, assert } = require('chai')
+
+baselib = require './../index.coffee'
+
+describe 'baselib', ->
+
+  it 'Existence', ->
+
+    expect(baselib).to.be.an('object')


add async integration tests

add async integration tests

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

--- test/async-integration.coffee
+++ test/async-integration.coffee
@@ -0,0 +1,68 @@
+Promise = require 'bluebird'
+
+hinoki = require '../src/hinoki'
+
+factories =
+    count: (xs) ->
+        Promise.delay(xs.length, 100)
+    mean: (xs, count) ->
+        reducer = (acc, x) ->
+            acc + x
+        Promise.delay(xs.reduce(reducer, 0) / count, 100)
+    meanOfSquares: (xs, count) ->
+        reducer = (acc, x) ->
+            acc + x * x
+        Promise.delay(xs.reduce(reducer, 0) / count, 100)
+    variance: (mean, meanOfSquares) ->
+        Promise.delay(meanOfSquares - mean * mean, 100)
+
+module.exports =
+
+    'ask for count': (test) ->
+        c = hinoki.newContainer factories,
+            xs: [1, 2, 3, 6]
+
+        hinoki.inject c, (count) ->
+            test.equals count, 4
+            test.deepEqual c.instances,
+                xs: [1, 2, 3, 6]
+                count: 4
+            test.done()
+
+    'ask for mean': (test) ->
+        c = hinoki.newContainer factories,
+            xs: [1, 2, 3, 6]
+
+        hinoki.inject c, (mean) ->
+            test.equals mean, 3
+            test.deepEqual c.instances,
+                xs: [1, 2, 3, 6]
+                count: 4
+                mean: 3
+            test.done()
+
+    'ask for meanOfSquares': (test) ->
+        c = hinoki.newContainer factories,
+            xs: [1, 2, 3, 6]
+
+        hinoki.inject c, (meanOfSquares) ->
+            test.equals meanOfSquares, 12.5
+            test.deepEqual c.instances,
+                xs: [1, 2, 3, 6]
+                count: 4
+                meanOfSquares: 12.5
+            test.done()
+
+    'ask for variance': (test) ->
+        c = hinoki.newContainer factories,
+            xs: [1, 2, 3, 6]
+
+        hinoki.inject c, (variance) ->
+            test.equals variance, 3.5
+            test.deepEqual c.instances,
+                xs: [1, 2, 3, 6]
+                count: 4
+                mean: 3
+                meanOfSquares: 12.5
+                variance: 3.5
+            test.done()


Fixed bug when updating an incident

Fixed bug when updating an incident

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


+ add ObjectAttributes class

+ add ObjectAttributes class

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

--- src/object-attributes.coffee
+++ src/object-attributes.coffee
@@ -0,0 +1,86 @@
+createObject    = require 'inherits-ex/lib/createObject'
+isString        = require 'util-ex/lib/is/type/string'
+isFunction      = require 'util-ex/lib/is/type/function'
+isEmptyObject   = require 'util-ex/lib/is/empty-object'
+Type            = require 'abstract-type'
+AttributeType   = require './attribute-type'
+defaultType     = require './default-type'
+
+getOwnPropertyNames = Object.getOwnPropertyNames
+
+register  = Type.register
+aliases   = Type.aliases
+
+
+# collect the attributes of an object.
+module.exports = class ObjectAttributes
+
+  constructor: (aAttributes)->
+    return new ObjectAttributes(aAttributes) unless @ instanceof ObjectAttributes
+    @defineAttributes aAttributes if aAttributes
+
+  ###
+    aOptions *(string)*: the type name.
+    aOptions *(AttributeType)*
+    aOptions *(Type)*: the type of this attribute.
+    aOptions *(object)*:
+      required: Boolean
+      type: ...
+  ###
+  defineAttribute: (aName, aOptions, aAttributes)->
+    unless aName and aName.length
+      throw TypeError('defineAttribute has no attribute name')
+    aAttributes = @ unless aAttributes?
+    if aAttributes[aName]?
+      throw TypeError('the attribute "' + aName + '" has already defined.')
+    if isString aOptions
+      vType = Type(aOptions)
+      throw TypeError("no such type registered:"+aOptions) unless vType
+      aOptions = {}
+      aOptions.type = vType
+    else if aOptions instanceof AttributeType
+      vAttribute = aOptions
+    else if aOptions instanceof Type
+      aOptions = {type: aOptions}
+    else if aOptions?
+      if aOptions.type
+        vType = aOptions.type
+        vType = Type(vType) #if isString vType
+        throw TypeError('no such type registered:'+aOptions.type) unless vType
+        vType = vType.clone(aOptions) unless vType.isSame(aOptions)
+        aOptions.type = vType
+      else if defaultType.type
+        aOptions.type = defaultType.type
+    unless vAttribute
+      aOptions = aOptions || {}
+      aOptions.name = aName
+      vAttribute = createObject AttributeType, aName, aOptions
+    aAttributes[aName] = vAttribute
+
+  ###
+    attributes =
+      attrName:
+        required: true
+        type: 'string'
+  ###
+  defineAttributes: (aAttributes, result)->
+    if not isEmptyObject(aAttributes) #avoid to recusive
+      result = @ unless result?
+      for k,v of aAttributes
+        continue unless k? and v? and aAttributes.hasOwnProperty k
+        @defineAttribute k, v, result
+    return result
+  assign: (aAttributes)->
+    for key of @
+      delete @[key] if @hasOwnProperty key
+    @defineAttributes aAttributes
+  getKeys: ->
+    result = []
+    for k, v of @
+      result.push k unless isFunction v
+    result
+  value: ->
+    result = {}
+    for k, v of @
+      result[k] = v unless isFunction v
+    result


Remove console.log's from production

Remove console.log's from production

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


Adds manifest.json to copy task

Adds manifest.json to copy task

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


Adding tags script

Adding tags script

error: pathspec 'ui/app/fm/tags.coffee' did not match any file(s) known to git

--- ui/app/fm/tags.coffee
+++ ui/app/fm/tags.coffee
@@ -0,0 +1,40 @@
+h = require('virtual-dom/h')
+
+tags = {}
+
+names = [
+    # Super elements
+    'meta',
+
+    # Block-level layout elements
+    'article', 'nav', 'aside', 'section', 'header', 'footer',
+
+    # Other block-level elements
+    'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'main', 'address',
+    'p', 'hr', 'pre', 'blockquote', 'ol', 'ul', 'li', 'dl', 'dt', 'dd',
+    'figure', 'figcaption', 'div', 'br',
+
+    # Table elements
+    'table', 'caption', 'thead', 'tbody', 'tfoot',
+    'tr', 'th', 'td', 'col', 'colgroup',
+
+    # Form elements
+    'form', 'fieldset', 'legend', 'label', 'input', 'button', 'select',
+    'datalist', 'optgroup', 'option', 'textarea', 'output',
+    'progress', 'meter',
+
+    # Media elements
+    'img', 'iframe', 'embed', 'object', 'param', 'video', 'audio', 'source',
+    'canvas', 'track',
+
+    # Inline elements
+    'a', 'em', 'strong', 'i', 'small', 'abbr', 'del', 'ins',
+    'q', 'cite', 'dfn', 'sub', 'sup', 'time', 'code', 'kbd', 'samp', 'var',
+    'mark', 'span'
+]
+
+for name in names
+    tags[name] = (props, content) ->
+        return h(name, props, content)
+
+module.exports = tags


Fix errors.

Fix errors.

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


Atom config changes

Atom config changes

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


update

update

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


now customers may be removed

now customers may be removed

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

--- app/client/templates/company_profile/containers/company_profile_customersItem.coffee
+++ app/client/templates/company_profile/containers/company_profile_customersItem.coffee
@@ -0,0 +1,7 @@
+Template.CustomerItem.events
+  'click [data-action="remove-customer"]': (e) ->
+    e.preventDefault()
+    customer = Template.currentData().customerName
+    company = Template.parentData().company
+    Companies.update {_id: company._id},
+      $pull: customers: name: customer


initialized drmSort

initialized drmSort

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


Add unpause message

Add unpause message

--- SingularityUI/app/models/Request.coffee
+++ SingularityUI/app/models/Request.coffee
@@ -54,12 +54,14 @@
             url:  "#{ @url() }/paused"
             type: 'DELETE'

-    unpause: =>
+    unpause: (data) =>
         $.ajax
             url:  "#{ @url() }/unpause?user=#{ app.getUsername() }"
             contentType: 'application/json'
             type: 'POST'
-            data: '{}'
+            data: JSON.stringify(
+                message: data.message
+            )

     pause: (killTasks, duration, message) =>
         data =
@@ -302,9 +304,12 @@
     promptUnpause: (callback) =>
         vex.dialog.confirm
             message: unpauseTemplate id: @get "id"
+            input: """
+                <input name="message" id="disable-healthchecks-message" type="text" placeholder="Message (optional)" />
+            """
             callback: (confirmed) =>
                 return unless confirmed
-                @unpause().done callback
+                @unpause(confirmed).done callback

     promptRun: (callback) =>
         vex.dialog.prompt


Fixes #951, don't update a message not in the database.

--- server/methods/updateMessage.coffee
+++ server/methods/updateMessage.coffee
@@ -4,6 +4,9 @@
 			throw new Meteor.Error('invalid-user', "[methods] updateMessage -> Invalid user")

 		originalMessage = RocketChat.models.Messages.findOneById message._id
+
+		if not originalMessage?._id?
+			return

 		hasPermission = RocketChat.authz.hasPermission(Meteor.userId(), 'edit-message', message.rid)
 		editAllowed = RocketChat.settings.get 'Message_AllowEditing'
@@ -42,4 +45,3 @@

 		# Meteor.defer ->
 		# 	RocketChat.callbacks.run 'afterSaveMessage', RocketChat.models.Messages.findOneById(message.id)
-


Minor code improvement

Minor code improvement

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


Run 'compile-main' & 'compile-others' concurrently


Add indent rules

Add indent rules

/bin/sh: 1: Syntax error: "(" unexpected


Android is also AppleWebKit, detection against iPhone, iPad, iPod

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


Closes #50; Fix problem with cordova method callbacks

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


test validation of authorization params

test validation of authorization params

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

--- test/oidc/validateAuthorizationParams.coffee
+++ test/oidc/validateAuthorizationParams.coffee
@@ -0,0 +1,261 @@
+chai = require 'chai'
+chai.should()
+
+
+
+
+{validateAuthorizationParams} = require '../../lib/oidc'
+
+
+
+
+req = (params) -> connectParams: params, cookies: { 'connect.sid': 'secret' }
+res = {}
+err = null
+
+
+
+
+describe 'Validate Authorization Parameters', ->
+
+  describe 'all requests', ->
+
+    describe 'with missing redirect_uri', ->
+
+      before (done) ->
+        params = {}
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_request'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing redirect uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 400
+
+
+
+
+    describe 'with invalid redirect_uri', ->
+
+      it 'should provide an AuthorizationError'
+      it 'should provide an error code'
+      it 'should provide an error description'
+      it 'should provide a redirect_uri'
+      it 'should provide a status code'
+
+
+
+
+    describe 'with missing response_type', ->
+
+      before (done) ->
+        params = { redirect_uri: 'https://redirect.uri' }
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_request'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing response type'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+
+
+
+    describe 'with unsupported response_type', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'unsupported'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'unsupported_response_type'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Unsupported response type'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+
+
+
+    describe 'with missing client_id', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'code'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'unauthorized_client'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing client id'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 403
+
+
+
+
+    describe 'with missing scope', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'code'
+          client_id: 'uuid'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_scope'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing scope'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+
+
+
+    describe 'with missing "openid" scope', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'code'
+          client_id: 'uuid'
+          scope: 'insufficient'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_scope'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing openid scope'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+
+
+
+  describe 'for implicit flow requests', ->
+
+    describe 'with missing nonce', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'id_token token'
+          client_id: 'uuid'
+          scope: 'openid'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_request'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Missing nonce'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+
+
+
+    describe 'with invalid nonce', ->
+
+      before (done) ->
+        params =
+          redirect_uri: 'https://redirect.uri'
+          response_type: 'id_token token'
+          client_id: 'uuid'
+          scope: 'openid'
+          nonce: 'invalid'
+
+        validateAuthorizationParams req(params), res, (error) ->
+          err = error
+          done()
+
+      it 'should provide an AuthorizationError', ->
+        err.name.should.equal 'AuthorizationError'
+
+      it 'should provide an error code', ->
+        err.error.should.equal 'invalid_request'
+
+      it 'should provide an error description', ->
+        err.error_description.should.equal 'Invalid nonce'
+
+      it 'should provide a redirect_uri', ->
+        err.redirect_uri.should.equal 'https://redirect.uri'
+
+      it 'should provide a status code', ->
+        err.statusCode.should.equal 302
+
+


JSON2QIF converter.

JSON2QIF converter.

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

--- json2qif.coffee
+++ json2qif.coffee
@@ -0,0 +1,40 @@
+fs = require 'fs'
+
+jsonFile = process.argv[2]
+
+if !jsonFile?
+  console.error "No JSON file specified"
+  process.exit 1
+
+if !jsonFile.match /\.json$/
+  console.error "JSON file must end in .json"
+  process.exit 2
+
+try
+  json = JSON.parse fs.readFileSync(jsonFile)
+catch e
+  console.error "Could not decode JSON"
+  process.exit 3
+
+statements = []
+for name, statement of json
+  statement.date = new Date(Date.parse(statement.date))
+  statements.push statement
+
+statements.sort (a, b) -> a.date - b.date
+
+qif = "!Type:Bank\n"
+for statement in statements
+  for row in statement.rows
+    #console.log "+ #{row.in} - #{row.out} = #{row.balance}"
+    desc = row.details ? row.description
+    desc = desc.replace /\n/g, " | "
+    date = new Date(Date.parse("#{row.date} #{statement.date.getFullYear()}"))
+    if +date > +statement.date + 1000 * 60 * 60 * 24 * 31
+      date.setFullYear(date.getFullYear()-1)
+    qif += "D#{date.toISOString().substr(0,10)}\n"
+    qif += "T#{(row.in - row.out)/100}\n"
+    qif += "P#{desc}\n"
+    qif += "^\n"
+
+fs.writeFileSync "#{jsonFile.replace(/.json$/, "")}.qif", qif


NEW-FUNC Template helper

NEW-FUNC Template helper

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

--- src/helpers/template.coffee
+++ src/helpers/template.coffee
@@ -0,0 +1,8 @@
+class Neck.Helper.template extends Neck.Helper
+
+  constructor: ->
+    super
+
+    @scope._main = @$el.html()
+    @$el.addClass 'ui-hide'
+


Show material tooltip only when the dock is in use

--- views/components/main/parts/kdock-panel.cjsx
+++ views/components/main/parts/kdock-panel.cjsx
@@ -102,7 +102,8 @@
     {
       for i in [1..4]
         dockName = i18n.resources.__ @state.docks[i].name
-        isLSC = @state.docks[i].material[0] >= 1000
+        isInUse = @state.docks[i].completeTime >= 0
+        isLSC = isInUse and @state.docks[i].material[0] >= 1000
         content =

                     {dockName}
                     <CountdownLabel key={i}
@@ -112,28 +113,26 @@
                                     dockName={dockName} />

-        <OverlayTrigger key={i} placement='top' overlay={
-          <Tooltip id="kdock-material-#{i}">
-            {
-              if isLSC
-
-
-                    {dockName}
-
-

-
-              else
-                {dockName}

-            }
-            {getMaterialImage 1} {@state.docks[i].material[0]}
-            {getMaterialImage 2} {@state.docks[i].material[1]}
-            {getMaterialImage 3} {@state.docks[i].material[2]}
-            {getMaterialImage 4} {@state.docks[i].material[3]}
-            {getMaterialImage 7} {@state.docks[i].material[4]}
-          </Tooltip>
-        }>
-        {content}
-        </OverlayTrigger>
+        if isInUse
+          <OverlayTrigger key={i} placement='top' overlay={
+            <Tooltip id="kdock-material-#{i}">
+              {
+                style = if isLSC then {color: '#D9534F', fontWeight: 'bold'} else null
+                {dockName}

+              }
+              {getMaterialImage 1} {@state.docks[i].material[0]}
+              {getMaterialImage 2} {@state.docks[i].material[1]}
+              {getMaterialImage 3} {@state.docks[i].material[2]}
+              {getMaterialImage 4} {@state.docks[i].material[3]}
+              {getMaterialImage 7} {@state.docks[i].material[4]}
+            </Tooltip>
+          }>
+            {content}
+          </OverlayTrigger>
+        else
+
+            {content}
+
     }


Removed double got_questions i18n tag in en.coffee from commit e439e3f

--- app/locale/en.coffee
+++ app/locale/en.coffee
@@ -375,7 +375,6 @@
     level_search_title: "Search Levels Here"
     signup_to_create: "Sign Up to Create a New Content"
     read_only_warning2: "Note: you can't save any edits here, because you're not logged in."
-    got_questions: "Questions about using the CodeCombat editors?"

   article:
     edit_btn_preview: "Preview"


Update ru.coffee

Update ru.coffee

--- app/locale/ru.coffee
+++ app/locale/ru.coffee
@@ -49,9 +49,9 @@
     blog: "Блог"
     forum: "Форум"
     account: "Аккаунт"
-#    profile: "Profile"
-#    stats: "Stats"
-#    code: "Code"
+    profile: "Профиль"
+    stats: "Характеристики"
+    code: "Код"
     admin: "Админ"
     home: "Домой"
     contribute: "Сотрудничество"
@@ -179,14 +179,14 @@
     new_password: "Новый пароль"
     new_password_verify: "Подтверждение пароля"
     email_subscriptions: "Email-подписки"
-#    email_subscriptions_none: "No Email Subscriptions."
+    email_subscriptions_none: "Нет активных подписок."
     email_announcements: "Оповещения"
     email_announcements_description: "Получать email-оповещения о последних новостях CodeCombat."
     email_notifications: "Уведомления"
     email_notifications_summary: "Настройки автоматических email-уведомлений, основанных на вашей активности на CodeCombat."
     email_any_notes: "Все уведомления"
     email_any_notes_description: "Отключите, чтобы больше не получать извещения."
-#    email_news: "News"
+    email_news: "Рассылка"
     email_recruit_notes: "Возможности для работы"
     email_recruit_notes_description: "Если вы действительно хорошо играете, то мы можем связаться с вами для предложения (лучшей) работы."
     contributor_emails: "Рассылки по классам участников"
@@ -244,7 +244,7 @@
 #    basics_job_title: "Desired Job Title"
 #    basics_job_title_help: "What role are you looking for?"
     basics_city: "Город"
-#    basics_city_help: "City you want to work in (or live in now)."
+    basics_city_help: "Город, в котором Вы живете или хотели ли бы работать."
     basics_country: "Страна"
 #    basics_country_help: "Country you want to work in (or live in now)."
 #    basics_visa: "US Work Status"
@@ -480,13 +480,13 @@
     editor_config_behaviors_label: "Умное поведение"
     editor_config_behaviors_description: "Автозавершать квадратные, фигурные скобки и кавычки."

-#  guide:
-#    temp: "Temp"
+  guide:
+    temp: "Временный"

   multiplayer:
     multiplayer_title: "Настройки мультиплеера"
-#    multiplayer_toggle: "Enable multiplayer"
-#    multiplayer_toggle_description: "Allow others to join your game."
+    multiplayer_toggle: "Включить мультиплеер"
+    multiplayer_toggle_description: "Разрешить другим игрокам присоединяться к игре."
     multiplayer_link_description: "Дайте эту ссылку кому-нибудь, чтоб он присоединился к вам."
     multiplayer_hint_label: "Подсказка: "
     multiplayer_hint: "кликните на ссылку, чтобы выделить её, затем нажмите ⌘-С или Ctrl-C, чтобы скопировать."
@@ -932,7 +932,7 @@
 #    thang: "Thang"
 #    thangs: "Thangs"
     level_session: "Ваша сессия"
-#    opponent_session: "Opponent Session"
+    opponent_session: "Сессия противника"
     article: "Статья"
     user_names: "Никнеймы"
 #    thang_names: "Thang Names"
@@ -942,8 +942,8 @@
     document: "Документ"
 #    sprite_sheet: "Sprite Sheet"
 #    candidate_sessions: "Candidate Sessions"
-#    user_remark: "User Remark"
-#    versions: "Versions"
+    user_remark: "Пользовательские поправки"
+    versions: "Версии"

   delta:
     added: "Добавлено"
@@ -954,37 +954,37 @@
 #    merge_conflict_with: "MERGE CONFLICT WITH"
     no_changes: "Нет изменений"

-#  user:
-#    stats: "Stats"
-#    singleplayer_title: "Singleplayer Levels"
-#    multiplayer_title: "Multiplayer Levels"
-#    achievements_title: "Achievements"
-#    last_played: "Last Played"
-#    status: "Status"
-#    status_completed: "Completed"
-#    status_unfinished: "Unfinished"
-#    no_singleplayer: "No Singleplayer games played yet."
-#    no_multiplayer: "No Multiplayer games played yet."
-#    no_achievements: "No Achievements earned yet."
-#    favorite_prefix: "Favorite language is "
-#    favorite_postfix: "."
-
-#  achievements:
-#    last_earned: "Last Earned"
-#    amount_achieved: "Amount"
-#    achievement: "Achievement"
-#    category_contributor: "Contributor"
-#    category_miscellaneous: "Miscellaneous"
-#    category_levels: "Levels"
-#    category_undefined: "Uncategorized"
-#    current_xp_prefix: ""
-#    current_xp_postfix: " in total"
-#    new_xp_prefix: ""
-#    new_xp_postfix: " earned"
-#    left_xp_prefix: ""
-#    left_xp_infix: " until level "
-#    left_xp_postfix: ""
-
-#  account:
-#    recently_played: "Recently Played"
-#    no_recent_games: "No games played during the past two weeks."
+  user:
+    stats: "Характеристики"
+    singleplayer_title: "Уровни одиночной игры"
+    multiplayer_title: "Уровни многопользовательской игры"
+    achievements_title: "Достижения"
+    last_played: "Последнее сыгранное"
+    status: "Статус"
+    status_completed: "Завершено"
+    status_unfinished: "Не завершено"
+    no_singleplayer: "Не сыграно ни одной одиночной игры."
+    no_multiplayer: "Не сыграно ни одной многопользовательской игры."
+    no_achievements: "Нет заработанных достижений."
+    favorite_prefix: "Предпочитаемый язык "
+    favorite_postfix: "."
+
+  achievements:
+    last_earned: "Последнее"
+    amount_achieved: "Количество"
+    achievement: "Достижение"
+    category_contributor: "Помощь"
+    category_miscellaneous: "Помощь"
+    category_levels: "Уровни"
+    category_undefined: "Неопределено"
+    current_xp_prefix: ""
+    current_xp_postfix: " в общем"
+    new_xp_prefix: ""
+    new_xp_postfix: " заработано"
+    left_xp_prefix: ""
+    left_xp_infix: " до уровня "
+    left_xp_postfix: ""
+
+  account:
+    recently_played: "Недавно сыграно"
+    no_recent_games: "Нет сыгранных игр за последние две недели."


fixed disableFields for Android

fixed disableFields for Android

--- src/coffeescripts/BaseAction.coffee
+++ src/coffeescripts/BaseAction.coffee
@@ -58,9 +58,9 @@
   # have focus right away.
   androidDelay: ->
     if Platform.isAndroid()
-      disableFields true
-      setTimeout ->
-        disableFields false
+      @disableFields true
+      setTimeout =>
+        @disableFields false
       , 1000

   # Since some Android version don't have an HTML5 date picker


commit

commit

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


Fix bug where resubmission showed empty textarea

Since the froala textarea is bound to the text comment draft content,
on a resubmission the draft content should default to the submitted
text.

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


achievement get!

achievement get!

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

--- src/scripts/achievement_unlocked.coffee
+++ src/scripts/achievement_unlocked.coffee
@@ -0,0 +1,11 @@
+#
+# achievement get <achievement> [achiever's email] - life goals are in reach.
+#
+module.exports = (robot) ->
+  robot.hear /achievement get (.+?)((?:\s*)[^@\s]+@[^@\s]+)?$/i, (msg) ->
+    caption = msg.match[1]
+    email = msg.match[2]
+    url = "http://achievement-unlocked.heroku.com/xbox/#{escape(caption)}.png"
+    if email
+      url += "?email=#{escape(email.trim())}.png"
+    msg.send(url)


add component to display login buttons as modal

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

--- assets/coffee/components/LogInLink.cjsx
+++ assets/coffee/components/LogInLink.cjsx
@@ -0,0 +1,32 @@
+React = require 'react'
+Modal = require './Modal'
+LogIn = require './LogIn'
+ReactLayeredComponentMixin = require '../mixins/ReactLayeredComponentMixin'
+
+LogInLink = React.createClass
+  displayName: 'LogInLink'
+
+  mixins: [ReactLayeredComponentMixin],
+
+  handleClick: ->
+    @setState {shown: !@state.shown}
+
+  getInitialState: ->
+    {shown: false, modalShown: false}
+
+  renderLayer: ->
+    if (!@state.shown)
+      return (
+
+      )
+    else
+      return (
+        <Modal onRequestClose={@handleClick}>
+          <LogIn />
+        </Modal>
+      )
+
+  render: ->
+    Sign in to vote!
+
+module.exports = LogInLink


Fix viewing repo after viewing all repos on safari

When transitioning from recent route to a specific repo deactivate is
not called for some reason on Safari. It seems like a bug in Ember.js,
but I need to investigate more.

A solution is to also try to remove observer in reset controller

--- app/routes/main-tab.coffee
+++ app/routes/main-tab.coffee
@@ -17,6 +17,9 @@
   deactivate: ->
     @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange')

+  resetController: ->
+    @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange')
+
   currentRepoDidChange: ->
     if repo = @controllerFor('repos').get('firstObject')
       @controllerFor('repo').set('repo', repo)


get the last color from http://www.cheerlights.com

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

--- src/scripts/cheerlights.coffee
+++ src/scripts/cheerlights.coffee
@@ -0,0 +1,10 @@
+#get last color from http://www.cheerlights.com
+module.exports = (robot) ->
+  robot.respond /cheerlights/i, (msg) ->
+   msg.http("http://api.thingspeak.com/channels/1417/field/1/last.json")
+    .get() (err, res, body) ->
+      response = JSON.parse body
+      if response
+       msg.send "The last color is: " + response["field1"]
+      else
+       msg.send "Error"


Grammar fix

Grammar fix

--- src/scripts/eardropping.coffee
+++ src/scripts/eardropping.coffee
@@ -48,7 +48,7 @@

   robot.respond /stop ear *dropping$/i, (msg) ->
     earDropping.deleteAll()
-    msg.send 'Okay, fine. :(  I am keep my ears shut.'
+    msg.send 'Okay, fine. :( I will keep my ears shut.'

   robot.respond /stop ear *dropping (for|on) (.+?)$/i, (msg) ->
     pattern = msg.match[2]


util: add fetchAccount util

util: add fetchAccount util

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


collaboration: handle isInSession better for state transition


Add getter and setter for buffer text

Add getter and setter for buffer text

--- src/app/edit-session.coffee
+++ src/app/edit-session.coffee
@@ -268,6 +268,17 @@
   #
   # Returns a {String}.
   getPath: -> @buffer.getPath()
+
+  # Public: Retrieves the current buffer's text.
+  #
+  # Return a {String}.
+  getText: -> @buffer.getText()
+
+  # Public: Set the current buffer's text content.
+  #
+  # Return a {String}.
+  setText: (text) -> @buffer.setText(text)
+
   # Public: Retrieves the current buffer.
   #
   # Returns a {String}.


:memo: Update AtomApplication.openUrl() comment

--- src/atom-application.coffee
+++ src/atom-application.coffee
@@ -251,7 +251,11 @@
             console.log("Killing process #{pid} failed: #{error.code}")
         delete @pidsToOpenWindows[pid]

-  # Private: Handles an atom:// url.
+  # Private: Open an atom:// url.
+  #
+  # The host of the URL being opened is assumed to be the package name
+  # responsible for opening the URL.  A new window will be created with
+  # that package's `urlMain` as the bootstrap script.
   #
   # * options
   #    + urlToOpen:


Always restore Reopen Project menu, fixes #13758

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


Airbrake API hubot connecter. Displays the latest errors for your project

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

--- src/scripts/airbrake.coffee
+++ src/scripts/airbrake.coffee
@@ -0,0 +1,83 @@
+# Returns error info from Airbrake
+#
+# hubot show me airbrake errors - Get the most recent active errors
+jsdom = require 'jsdom'
+env = process.env
+
+# ENV Variables required :
+# HUBOT_AIRBRAKE_AUTH_TOKEN : Auth token from your account ( Login to site and go to 'Settings' )
+# HUBOT_AIRBRAKE_PROJECT    : Account name (eg: http://<account name>.airbrakeapp.com)
+
+# Add to heroku :
+# % heroku config:add HUBOT_AIRBRAKE_AUTH_TOKEN="..."
+# % heroku config:add HUBOT_AIRBRAKE_PROJECT="..."
+# Example error and further API :
+# http://help.airbrake.io/kb/api-2/api-overview
+
+module.exports = (robot) ->
+
+  robot.respond /(show me )?airbrake( errors)?(.*)/i, (msg) ->
+    query msg, (body, err, project_name) ->
+      return msg.send err if err
+
+
+      error_groups = body.getElementsByTagName("group")
+      return msg.send "Congrats! No errors in the system right now!" unless error_groups?
+
+      output = "#{error_groups.length} recent errors found :"
+
+      for group in error_groups
+        most_recent_at = group.getElementsByTagName("most-recent-notice-at")[0].innerHTML
+        created_at    = group.getElementsByTagName("created-at")[0].innerHTML
+        updated_at    = group.getElementsByTagName("updated-at")[0].innerHTML
+        notices_count = group.getElementsByTagName("notices-count")[0].innerHTML
+
+        error_id      = group.getElementsByTagName("id")[0].innerHTML
+        error_class   = group.getElementsByTagName("error-class")[0].innerHTML
+        error_message = group.getElementsByTagName("error-message")[0].innerHTML
+        resolved      = group.getElementsByTagName("resolved")[0].innerHTML
+
+        file          = group.getElementsByTagName("file")[0].innerHTML
+        rails_env     = group.getElementsByTagName("rails-env")[0].innerHTML
+        line_number   = group.getElementsByTagName("line-number")[0].innerHTML
+
+        error_url     = "https://#{project_name}.airbrakeapp.com/errors/#{error_id}"
+
+        output += "\n****"
+        output += "\n* ##{error_id}(#{notices_count}) : Last error @ #{most_recent_at}"
+        output += "\n* #{rails_env} - #{error_class} : #{error_message}"
+        output += "\n* #{error_url} => #{file}:#{line_number}"
+
+      msg.send output
+      msg.send "\n****"
+
+
+  getDom = (xml) ->
+    body = jsdom.jsdom(xml)
+    throw Error("No XML data returned.") if body.getElementsByTagName("group")[0].childNodes.length == 0
+    body
+
+  query = (msg, cb) ->
+    airbrake_auth_key = process.env.HUBOT_AIRBRAKE_AUTH_TOKEN
+    airbrake_project  = process.env.HUBOT_AIRBRAKE_PROJECT
+
+    unless airbrake_auth_key
+       msg.send "Airbrake auth token isn't set. Sign up at http://airbrakeapp.com"
+       msg.send "Then set the HUBOT_AIRBRAKE_AUTH_TOKEN environment variable"
+       return
+
+    unless airbrake_project
+       msg.send "Airbrakeproject isn't set. Sign up at http://airbrakeapp.com. Your project name is : http://<project_name>.airbrakeapp.com ."
+       msg.send "Then set the HUBOT_AIRBRAKE_PROJECT environment variable"
+       return
+
+    msg.http("https://#{airbrake_project}.airbrake.io/errors.xml")
+      .query(auth_token: airbrake_auth_key)
+      .get() (err, res, body) ->
+        try
+          body = getDom body
+        catch err
+          err = "Could not fetch airbrake errors."
+        cb(body, err, airbrake_project)
+
+


Playerクラスの簡易的なテストコード

Playerクラスの簡易的なテストコード

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

--- test/TestPlayer.coffee
+++ test/TestPlayer.coffee
@@ -0,0 +1,22 @@
+assert = require("assert")
+players = require('../src/models/player')
+
+
+describe 'Player test', () ->
+  describe '#displayPositive', () ->
+    it 'ref it.numOfRights', () ->
+      p = new players.Player(1, 'test')
+      assert.equal '◯ 0', p.displayPositive()
+      p.numOfRights++
+      assert.equal '◯ 1', p.displayPositive()
+      p.numOfWrongs++
+      assert.equal '◯ 1', p.displayPositive()
+
+  describe '#displayNegative', () ->
+    it 'ref it.numOfWrongs', () ->
+      p = new players.Player(1, 'test')
+      assert.equal '✕ 0', p.displayNegative()
+      p.numOfWrongs++
+      assert.equal '✕ 1', p.displayNegative()
+      p.numOfRights++
+      assert.equal '✕ 1', p.displayNegative()


sidebar/container: remove redundant requires

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

--- client/app/lib/sidebar/container.coffee
+++ client/app/lib/sidebar/container.coffee
@@ -21,9 +21,6 @@
 require './styl/sidebarstackwidgets.styl'
 require './styl/sidebarmachineslistItem.styl'
 require './styl/sidebarwidget.styl'
-
-calculateOwnedResources = require 'app/util/calculateOwnedResources'
-calculateSharedResources = require 'app/util/calculateSharedResources'

 module.exports = class SidebarContainer extends React.Component


Catch both string and object targets

Catch both string and object targets

--- src/command-registry.coffee
+++ src/command-registry.coffee
@@ -92,10 +92,10 @@
         disposable.add @add(target, commandName, callback)
       return disposable

+    if typeof callback isnt 'function'
+      throw new Error("Can't register a command with non-function callback.")
+
     if typeof target is 'string'
-      if typeof callback isnt 'function'
-        throw new Error("Can't register a command with non-function callback.")
-
       validateSelector(target)
       @addSelectorBasedListener(target, commandName, callback)
     else


Use a variable and disable the button

Use a variable and disable the button

--- components/add_block/client/view.coffee
+++ components/add_block/client/view.coffee
@@ -14,7 +14,7 @@
     'click .js-button': 'save'

   initialize: ->
-    @state = new Backbone.Model saving: false
+    @saving = false

   onInput: (e) ->
     @checkInput()
@@ -61,14 +61,15 @@
     false

   save: ->
-    return false if @state.get('saving')
+    return if @saving

     val = @dom.input.val().trim()

     return if val is ''

-    @state.set saving: true
+    @saving = true
     @dom.button.text 'Adding'
+    @dom.button.attr 'disabled', true

     attrs = if isURL val
       source: val
@@ -83,14 +84,16 @@
         @dom.button.text 'Added'
         @dom.input.val ''
         @dom.input.focus()
-        @state.set saving: false
+        @dom.button.attr 'disabled', false
+        @saving = false
         @checkInput()
         setTimeout (=> @dom.button.text 'Add block'), 2000

       error: (_m, e) =>
         console.error e
-        @state.set saving: false
+        @saving = false
         @dom.button.text 'Error'
+        @dom.button.attr 'disabled', false
         setTimeout (=> @dom.button.text 'Add block'), 2000

   postRender: ->


Initial spec for ProcessingChainEntrance

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

--- test/processingchainentrance.coffee
+++ test/processingchainentrance.coffee
@@ -0,0 +1,5 @@
+ProcessingChainEntrance = require('../lib/processingchainentrance')
+
+describe 'ProcessingChainEntrance', ->
+  xit 'should intialize the transaction log and replication when starting'
+  xit 'should log, replicate, and package a messge upon receiving it'


+ test custom validator.

+ test custom validator.

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

--- test/register-validator-test.coffee
+++ test/register-validator-test.coffee
@@ -0,0 +1,58 @@
+extend          = require 'util-ex/lib/extend'
+chai            = require 'chai'
+sinon           = require 'sinon'
+sinonChai       = require 'sinon-chai'
+should          = chai.should()
+expect          = chai.expect
+assert          = chai.assert
+chai.use(sinonChai)
+
+TypeInfo        = require '../src'
+Value           = require '../src/value'
+Attributes      = require '../src/attributes'
+setImmediate    = setImmediate || process.nextTick
+register        = TypeInfo.register
+
+class TestType
+  constructor: ->return super
+  $attributes: Attributes
+    min:
+      type: 'Number'
+    max:
+      type: 'Number'
+
+
+describe 'Custom Validator', ->
+  before ->
+    result = register TestType
+    result.should.be.true
+  after ->
+    TypeInfo.unregister 'Test'
+
+  it 'should register a validator via object', ->
+    T = TypeInfo('Test')
+    is1 =
+      name: 'is1'
+      validate: sinon.spy (aValue, aOptions)->
+        T.should.be.equal @
+        aValue is 1
+    t = T.createValue 2
+    result = TypeInfo.registerValidator is1
+    expect(result, 'registerValidator').to.be.true
+    expect(t.isValid(is1:true)).to.be.false
+    expect(is1.validate).to.be.calledOnce
+    TypeInfo.unregisterValidator 'is1'
+
+  it 'should register a validator via arguments', ->
+    T = TypeInfo('Test')
+    is1 =
+      name: 'is1'
+      validate: sinon.spy (aValue, aOptions)->
+        T.should.be.equal @
+        aValue is 1
+    t = T.createValue 2
+    result = TypeInfo.registerValidator is1.name, is1.validate
+    expect(result, 'registerValidator').to.be.true
+    expect(t.isValid(is1:true)).to.be.false
+    expect(is1.validate).to.be.calledOnce
+    TypeInfo.unregisterValidator 'is1'