add more i18n

add more i18n

--- packages/rocketchat-lib/server/methods/setUsername.coffee
+++ packages/rocketchat-lib/server/methods/setUsername.coffee
@@ -11,12 +11,12 @@
 			return username

 		if not /^[0-9a-zA-Z-_.]+$/.test username
-			throw new Meteor.Error 'username-invalid', TAPi18next.t('project:Username_invalid', username)
+			throw new Meteor.Error 'username-invalid', t('Username_invalid', username)

 		if not RocketChat.checkUsernameAvailability username
-			throw new Meteor.Error 'username-unavailable'
+			throw new Meteor.Error 'username-unavailable', t('Username_unavaliable')

 		unless RocketChat.setUsername user, username
 			throw new Meteor.Error 'could-not-change-username', t('Could_not_change_username')

-		return username+		return username


hide ability to sort by playcount on pending/graveyarded beatmapsets (cuz they don't have playcounts..)

--- resources/assets/coffee/react/beatmaps/search-sort.coffee
+++ resources/assets/coffee/react/beatmaps/search-sort.coffee
@@ -56,6 +56,7 @@
     if @props.filters.status in [4, 5]
       fields.updated = true
       fields.hype = true
+      fields.plays = false
     else
       fields.ranked = true


Add a few more logs

Add a few more logs

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


Cleanup logging

Cleanup logging

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


Add hide,disable property. Closes #15

Add hide,disable property. Closes #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/jerone/flex-toolbar.git/'


Force a preview refresh after posting

Force a preview refresh after posting

--- resources/assets/coffee/_classes/forum-topic-reply.coffee
+++ resources/assets/coffee/_classes/forum-topic-reply.coffee
@@ -127,7 +127,7 @@
   fetchPreview: =>
     return if $(@previewButton).hasClass('active')

-    if $(@previewButton).attr('data-should-refresh') == '1'
+    if $(@previewButton).attr('data-should-refresh') == '0'
       @showPreview()
       return

@@ -140,12 +140,11 @@
     .done (data) =>
       $(@previewBox).html(data)

-      $(@previewButton).attr('data-should-refresh', '1')
-
-      $(@input).one 'input', =>
-        $(@previewButton).attr('data-should-refresh', '0')
+      $(@previewButton).attr('data-should-refresh', '0')
+      $(@input).one 'input', @invalidatePreview

       @showPreview()
+

   showPreview: =>
     $(@editBox).addClass('hidden')
@@ -162,6 +161,10 @@

     $(@previewButton).removeClass('active')
     $(@writeButton).addClass('active')
+
+
+  invalidatePreview: =>
+    $(@previewButton).attr('data-should-refresh', '1')

   posted: (e, data) =>
@@ -173,6 +176,8 @@

     needReload = (@forum.postPosition($newPost[0]) - 1) != @forum.postPosition(@forum.endPost()) ||
       e.target.dataset.forceReload == '1'
+
+    @invalidatePreview()

     if needReload
       osu.navigate $newPost.find('.js-post-url').attr('href')


hound error fix

hound error fix

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


Updated message format.

Updated message format.

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


Changed login error to something a bit more friendly and useful.

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


camera example now works with base64 encoded image

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


Tweaked updateZoom.

Tweaked updateZoom.

--- app/lib/surface/Camera.coffee
+++ app/lib/surface/Camera.coffee
@@ -218,7 +218,7 @@

   updateZoom: (force=false) ->
     # Update when we're focusing on a Thang, tweening, or forcing it, unless we're locked
-    return if @locked or (not force and not @newTarget and not @target?.name)
+    return if (not force) and (@locked or (not @newTarget and not @target?.name))
     if @newTarget
       t = @tweenProgress
       @zoom = @oldZoom + t * (@newZoom - @oldZoom)


Add "add" and "remove" events.

Add "add" and "remove" events.

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


correction

correction

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


create source entry point

create source entry point

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

--- src/nads.coffee
+++ src/nads.coffee
@@ -0,0 +1 @@
+module.exports = {}


activity/flux: add activity realtime action creators

error: pathspec 'client/activity/lib/flux/actions/realtime/actioncreators.coffee' did not match any file(s) known to git

--- client/activity/lib/flux/actions/realtime/actioncreators.coffee
+++ client/activity/lib/flux/actions/realtime/actioncreators.coffee
@@ -0,0 +1,43 @@
+kd = require 'kd'
+actions = require '../actiontypes'
+
+dispatch = (args...) -> kd.singletons.reactor.dispatch args...
+
+wrapChannel = (channel) ->
+
+  kd.singletons.socialapi.onChannelReady channel, ->
+
+    channel.on 'MessageAdded', (message) ->
+      wrapMessage message
+      dispatch actions.LOAD_MESSAGE_SUCCESS, { channel, message, channelId: channel.id }
+
+    channel.on 'MessageRemoved', (message) ->
+      dispatch actions.REMOVE_MESSAGE_SUCCESS, { messageId: message.id }
+
+
+wrapMessage = (message) ->
+
+  messageId = message.id
+  { initialChannelId: channelId } = message
+
+  message.on 'LikeAdded', ({ accountId }) ->
+    dispatch actions.LIKE_MESSAGE_SUCCESS, { userId: accountId, messageId }
+
+  message.on 'LikeRemoved', ({ accountId }) ->
+    dispatch actions.UNLIKE_MESSAGE_SUCCESS, { userId: accountId, messageId }
+
+  message.on 'AddReply', (comment) ->
+    dispatch actions.LOAD_COMMENT_SUCCESS, { messageId, comment }
+
+  message.on 'RemoveReply', (comment) ->
+    dispatch actions.REMOVE_MESSAGE_SUCCESS, { messageId: comment.id }
+
+  message.on 'update', ->
+    channel = kd.singletons.socialapi.retrieveCachedItemById channelId
+    dispatch actions.LOAD_MESSAGE_SUCCESS, { channelId, message, channel }
+
+
+module.exports = {
+  wrapChannel
+  wrapMessage
+}


new conversations: fix admin menu styling

fixes CNVS-9295

test plan:
  * open new conversations
  * select a conversation
  * open the cog menu in the header
  * mark the conversation as unread
  * reopen the cog menu
  * verify that the "Mark as Read" entry is correctly styled

Change-Id: Ib363f2dcdc67bd08ee1c29d83ea7901d4cf53d1d
Reviewed-on: https://gerrit.instructure.com/32239
Tested-by: Jenkins <d95b56ce41a2e1ac4cecdd398defd7414407cc08@instructure.com>
Reviewed-by: Joel Hough <4816dabf8db1bc6cac35b3a24cab2ff844b5b0c7@instructure.com>
QA-Review: Steven Shepherd <e794458448443812fb2685675aab3bbd1a3891bc@instructure.com>
Product-Review: Braden Anderson <a6cc2cef7d25f27847876bdb81651755fcebacf0@instructure.com>

--- app/coffeescripts/views/conversations/InboxHeaderView.coffee
+++ app/coffeescripts/views/conversations/InboxHeaderView.coffee
@@ -117,11 +117,13 @@
     onReadStateChange: (msg) ->
       @hideMarkUnreadBtn(!msg || msg.unread())
       @hideMarkReadBtn(!msg || !msg.unread())
+      @refreshMenu()

     onStarStateChange: (msg) ->
       if msg
         key = if msg.starred() then 'unstar' else 'star'
         @$starToggleBtn.text(@messages[key])
+      @refreshMenu()

     onArchivedStateChange: (msg) ->
       return if !msg
@@ -130,6 +132,10 @@
       @$archiveBtn.attr('title', if archived then @messages['unarchive'] else @messages['archive'])
       @$archiveBtn.find('.screenreader-only')
         .text(if archived then @messages['unarchive_conversation'] else @messages['archive_conversation'])
+      @refreshMenu()
+
+    refreshMenu: ->
+      @$adminMenu.menu('refresh') if @$adminMenu.is('.ui-menu')

     filterObj: (obj) -> _.object(_.filter(_.pairs(obj), (x) -> !!x[1]))


Add ONCE() function for coalescing the current value and a given value. Allows a calculated field to only be calculated 'once'.

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


Add slider test component

Add slider test component

error: pathspec 'spec/components/slider.cjsx' did not match any file(s) known to git

--- spec/components/slider.cjsx
+++ spec/components/slider.cjsx
@@ -0,0 +1,13 @@
+Slider = require '../../components/slider'
+
+module.exports = React.createClass
+  render: ->
+

+
Sliders

+
Normal slider

+      <Slider />
+
With steps, initial value and editable

+      <Slider value={5} min={0} max={10} editable />
+
Pinned and with snaps

+      <Slider pinned snaps value={1} min={0} max={10} step={1} editable />
+


framework for CouchDB API

framework for CouchDB API

 On branch development
	new file:   nodejs_server/lib/db.coffee

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


fixed grammar file

fixed grammar file

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


add credential.test file

add credential.test file

error: pathspec 'workers/social/lib/social/models/computeproviders/credential.test.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/computeproviders/credential.test.coffee
+++ workers/social/lib/social/models/computeproviders/credential.test.coffee
@@ -0,0 +1,446 @@
+JCredential      = require './credential'
+JCredentialData  = require './credentialdata'
+{ Relationship } = require 'jraphical'
+{ daisy
+  expect
+  withDummyClient
+  withConvertedUser
+  expectAccessDenied
+  generateRandomString
+  checkBongoConnectivity } = require '../../../../testhelper'
+{ generateMetaData
+  withConvertedUserAndCredential } = require '../../../../testhelper/models/computeproviders/credentialhelper'
+
+
+# this function will be called once before running any test
+beforeTests = -> before (done) ->
+
+  checkBongoConnectivity done
+
+
+# here we have actual tests
+runTests = -> describe 'workers.social.models.computeproviders.credential', ->
+
+  describe '#getName()', ->
+
+    it 'should return name of the JCredential class', ->
+
+      expect(JCredential.getName()).to.be.equal 'JCredential'
+
+
+  describe '#create()', ->
+
+    it 'should fail if user doesnt have the permission to create', (done) ->
+
+      expectAccessDenied JCredential, 'create', data = {}, done
+
+
+    it 'should fail to create credential if provider is not supported', (done) ->
+
+      withConvertedUser ({ client }) ->
+        JCredential.create client, { provider : 'invalid' }, (err) ->
+          expect(err?.message).to.be.equal 'Provider is not supported'
+          done()
+
+
+    it 'should be able to ocreate credential when the data is valid', (done) ->
+
+      withConvertedUser ({ client, account }) ->
+
+        title          = 'someCredentialTitle'
+        provider       = 'aws'
+        originId       = account.getId()
+        credential     = null
+        credentialData = null
+
+        options =
+          meta     : generateMetaData provider
+          title    : title
+          provider : provider
+
+        queue = [
+
+          ->
+            # expecting credential to be created
+            JCredential.create client, options, (err, credential_) ->
+              expect(err?.message).to.not.exist
+              credential = credential_
+              expect(credential.provider).to.be.equal provider
+              expect(credential.title).to.be.equal title
+              expect(credential.identifier).to.exist
+              expect(credential.originId).to.be.equal originId
+              queue.next()
+
+          ->
+            # expecting credential data to be created as well
+            JCredentialData.one { originId }, (err, credentialData_) ->
+              expect(err).to.not.exist
+              credentialData = credentialData_
+              expect(credentialData).to.exist
+              expect(credentialData.meta).to.be.an 'object'
+              expect(credentialData.meta).to.be.deep.equal options.meta
+              queue.next()
+
+          ->
+            # expecting credential and account relation to be created
+            options =
+              as         : 'owner'
+              targetId   : credential._id
+              sourceId   : account.getId()
+              targetName : 'JCredential'
+              sourceName : 'JAccount'
+
+            Relationship.one options, (err, relationship) ->
+              expect(err).to.not.exist
+              expect(relationship).to.exist
+              queue.next()
+
+          ->
+            # expecting credential and credential data relation to be created
+            options =
+              as         : 'data'
+              targetId   : credentialData._id
+              sourceId   : credential._id
+              targetName : 'JCredentialData'
+              sourceName : 'JCredential'
+
+            Relationship.one options, (err, relationship) ->
+              expect(err).to.not.exist
+              expect(relationship).to.exist
+              queue.next()
+
+          -> done()
+
+        ]
+
+        daisy queue
+
+
+  describe '#fetchByIdentifier()', ->
+
+    it 'should be able to fetch credential', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        JCredential.fetchByIdentifier client, credential.identifier, (err, credential_) ->
+          expect(err?.message).to.not.exist
+          expect(credential_).to.exist
+          expect(credential_._id).to.be.deep.equal credential._id
+          done()
+
+
+  describe '#one$()', ->
+
+    it 'should fail to fetch credential data if user doesnt have permission', (done) ->
+
+      expectAccessDenied JCredential, 'one$', identifier = '', done
+
+
+    it 'should be able to fetch credential data', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        JCredential.one$ client, credential.identifier, (err, credential_) ->
+          expect(err?.message).to.not.exist
+          expect(credential_).to.exist
+          expect(credential_._id).to.be.deep.equal credential._id
+          done()
+
+
+  describe '#some$()', ->
+
+    it 'should fail to fetch credential data if user doesnt have permission', (done) ->
+
+      expectAccessDenied JCredential, 'some$', selector = {}, options = {}, done
+
+
+    it 'should be able to fetch credential data', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        selector = { _id : credential._id }
+        options  = {}
+        JCredential.some$ client, selector, options ,(err, credentials) ->
+          expect(err?.message).to.not.exist
+          expect(credentials).to.be.an 'array'
+          expect(credentials).to.have.length 1
+          done()
+
+
+  describe 'fetchUsers()', ->
+
+    it 'should fail to fetch users if user doesnt have permission', (done) ->
+
+      withConvertedUserAndCredential ({ credential }) ->
+        expectAccessDenied credential, 'fetchUsers', done
+
+
+    it 'should be able to fetch users', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        credential.fetchUsers client, (err, users) ->
+          expect(err).to.not.exist
+          expect(users).to.be.an 'array'
+          expect(users).to.have.length.above 0
+          done()
+
+
+  describe 'setPermissionFor()', ->
+
+    it 'should be able to set permission of target', (done) ->
+
+      client         = {}
+      account        = {}
+      credential     = {}
+      anotherAccount = {}
+
+      queue = [
+
+        ->
+          withConvertedUserAndCredential (data) ->
+            { client, account, credential } = data
+            queue.next()
+
+        ->
+          withConvertedUser (data) ->
+            { account : anotherAccount } = data
+            queue.next()
+
+        ->
+          options = { user : true, owner : true }
+          credential.setPermissionFor anotherAccount, options, (err) ->
+            expect(err).to.not.exist
+            queue.next()
+
+        ->
+          options =
+            as         : 'owner'
+            targetId   : credential._id
+            sourceId   : anotherAccount._id
+            targetName : 'JCredential'
+            sourceName : 'JAccount'
+
+          Relationship.one options, (err, relationship) ->
+            expect(err).to.not.exist
+            expect(relationship).to.exist
+            expect(relationship.sourceId).to.be.deep.equal anotherAccount._id
+            queue.next()
+
+        -> done()
+
+      ]
+
+      daisy queue
+
+
+  describe 'shareWith', ->
+
+    testShareWith = (method, done) ->
+      client         = {}
+      account        = {}
+      credential     = {}
+      anotherAccount = {}
+
+      queue = [
+
+        ->
+          withConvertedUserAndCredential (data) ->
+            { client, account, credential } = data
+            queue.next()
+
+        ->
+          withConvertedUser (data) ->
+            { account : anotherAccount } = data
+            queue.next()
+
+        ->
+          options =
+            user   : true
+            owner  : true
+            target : anotherAccount.profile.nickname
+
+          credential[method] client, options, (err) ->
+            expect(err).to.not.exist
+            queue.next()
+
+        ->
+          options =
+            as         : 'owner'
+            targetId   : credential._id
+            sourceId   : anotherAccount._id
+            targetName : 'JCredential'
+            sourceName : 'JAccount'
+
+          Relationship.one options, (err, relationship) ->
+            expect(err).to.not.exist
+            expect(relationship).to.exist
+            expect(relationship.sourceId).to.be.deep.equal anotherAccount._id
+            queue.next()
+
+        -> done()
+
+      ]
+
+      daisy queue
+
+
+    describe 'shareWith()', ->
+
+      it 'should fail to share if target does not exist', (done) ->
+
+        withConvertedUserAndCredential ({ client, credential }) ->
+          options = { user : true, owner : true, target : 'nonExistent' }
+          credential.shareWith client, options, (err) ->
+            expect(err?.message).to.be.equal 'Target not found.'
+            done()
+
+
+      it 'should be able to share the credential with the target', (done) ->
+
+        testShareWith 'shareWith', done
+
+
+    describe 'shareWith$()', ->
+
+      it 'should fail to share if user doesnt have permission', (done) ->
+
+        withConvertedUserAndCredential ({ credential }) ->
+          expectAccessDenied credential, 'shareWith$', {}, done
+
+
+      it 'should be able to share the credential with the target', (done) ->
+
+        testShareWith 'shareWith$', done
+
+
+  describe 'delete()', ->
+
+    it 'should fail to delete if user doesnt have permission', (done) ->
+
+      withConvertedUserAndCredential ({ credential }) ->
+        expectAccessDenied credential, 'delete', done
+
+
+    it 'should be able to delete the credential', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        credential.delete client, (err) ->
+          expect(err).to.not.exist
+
+          JCredential.one { _id : credential._id }, (err, credential) ->
+            expect(err).to.not.exist
+            expect(credential).to.not.exist
+            done()
+
+
+  describe 'fetchData', ->
+
+    testFetchDataFailure = (method, done) ->
+      withConvertedUserAndCredential ({ client, credential }) ->
+
+        queue = [
+
+          ->
+            credential[method] (err, credData) ->
+              credData.remove (err) ->
+                expect(err).to.not.exist
+                queue.next()
+
+          ->
+            credential[method] (err, data) ->
+              expect(err?.message).to.be.equal 'No data found'
+              queue.next()
+
+          -> done()
+
+        ]
+
+        daisy queue
+
+
+    testFetchDataSuccess = (method, done) ->
+      withConvertedUserAndCredential ({ client, credential }) ->
+        credential[method] (err, credData) ->
+          expect(err).to.not.exist
+          expect(credData).to.be.an 'object'
+          expect(credData.identifier).to.be.equal credential.identifier
+          done()
+
+
+    describe 'fetchData()', ->
+
+      it 'should fail if there is no data', (done) ->
+
+        testFetchDataFailure 'fetchData', done
+
+
+      it 'should be able to fetch credential data', (done) ->
+
+        testFetchDataSuccess 'fetchData', done
+
+
+    describe 'fetchData$()', ->
+
+      it 'should fail to fetch data if user doesnt have the permission', (done) ->
+
+        withConvertedUserAndCredential ({ credential }) ->
+          expectAccessDenied credential, 'fetchData$', done
+
+
+      it 'should fail if there is no data', (done) ->
+
+        testFetchDataFailure 'fetchData', done
+
+
+      it 'should be able to fetch credential data', (done) ->
+
+        testFetchDataSuccess 'fetchData', done
+
+
+  describe 'update$', ->
+
+      it 'should fail to update credential if user doesnt have the permission', (done) ->
+
+        withConvertedUserAndCredential ({ credential }) ->
+          expectAccessDenied credential, 'fetchData$', {}, done
+
+
+      it 'should fail to update if title or meta is not set', (done) ->
+
+        withConvertedUserAndCredential ({ client, credential }) ->
+          credential.update$ client, { title : null }, (err) ->
+            expect(err?.message).to.be.equal 'Nothing to update'
+            done()
+
+
+      it 'should be able to update credential', (done) ->
+
+        withConvertedUserAndCredential ({ client, credential }) ->
+
+          options =
+            title : 'newTitle'
+            meta  : { data : 'newMeta' }
+
+          credential.update$ client, options, (err) ->
+            expect(err).to.not.exist
+            done()
+
+
+  describe 'isBootstrapped()', ->
+
+    it 'should fail to check if user doesnt have the permission', (done) ->
+
+      withConvertedUserAndCredential ({ credential }) ->
+        expectAccessDenied credential, 'isBootstrapped', done
+
+
+    it 'should if credential is bootstrapped', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        credential.isBootstrapped client, (err, result) ->
+          expect(err).to.not.exist
+          expect(result).to.be.a 'boolean'
+          done()
+
+
+beforeTests()
+
+runTests()
+


add d3 tree in neurons index

add d3 tree in neurons index

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

--- app/assets/javascripts/admin/d3tree.coffee
+++ app/assets/javascripts/admin/d3tree.coffee
@@ -0,0 +1,33 @@
+created3tree = ->
+  width = 400
+  height = 600
+  tree = d3.layout.tree().size([
+    height
+    width - 160
+  ])
+  diagonal = d3.svg.diagonal().projection((d) ->
+    [
+      d.y
+      d.x
+    ]
+  )
+  svg = d3.select('#tree_data').append('svg').attr('width', width).attr('height', height).append('g').attr('transform', 'translate(40,0)')
+  d3.json '/admin/neurons/tree_data.json', (error, json) ->
+    nodes = tree.nodes(json[0])
+    console.log(nodes);
+    links = tree.links(nodes)
+    link = svg.selectAll('path.link').data(links).enter().append('path').attr('class', 'link').attr('d', diagonal)
+    node = svg.selectAll('g.node').data(nodes).enter().append('g').attr('class', 'node').attr('transform', (d) ->
+      'translate(' + d.y + ',' + d.x + ')'
+    )
+    node.append('circle').attr 'r', 4.5
+    node.append('text').attr('dx', (d) ->
+      if d.children then -8 else 8
+    ).attr('dy', 3).attr('text-anchor', (d) ->
+      if d.children then 'end' else 'start'
+    ).text (d) ->
+      d.name
+    return
+  d3.select(self.frameElement).style 'height', height + 'px'
+
+$(document).on "ready page:load", created3tree


clio-23421 remove unused variable

clio-23421 remove unused variable

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/seanhealy/lib-themisui.git/'


add aws.test.coffee

add aws.test.coffee

error: pathspec 'workers/social/lib/social/models/computeproviders/aws.test.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/computeproviders/aws.test.coffee
+++ workers/social/lib/social/models/computeproviders/aws.test.coffee
@@ -0,0 +1,78 @@
+Aws      = require './aws'
+
+{ expect
+  withConvertedUser
+  checkBongoConnectivity
+  generateDummyUserFormData } = require '../../../../testhelper'
+
+
+# this function will be called once before running any test
+beforeTests = -> before (done) ->
+
+  checkBongoConnectivity done
+
+
+# here we have actual tests
+runTests = -> describe 'workers.social.models.computeproviders.aws', ->
+
+  describe '#ping()', ->
+
+    it 'should reply to ping request', (done) ->
+
+      userFormData = generateDummyUserFormData()
+
+      withConvertedUser { userFormData }, (data) ->
+
+        { client, account } = data
+        client.r            = { account }
+
+        Aws.ping client, {}, (err, data) ->
+          expect(err?.message).to.not.exist
+          expect(data).to.be.equal "#{Aws.providerSlug} rulez #{account.profile.nickname}!"
+          done()
+
+
+  describe '#create()', ->
+
+    it 'should fail when storage is not a number', (done) ->
+
+      client = null
+
+      Aws.create client, { storage : 'notaNumber' }, (err, data) ->
+        expect(err?.message).to.be.equal 'Requested storage size is not valid.'
+        done()
+
+
+    it 'should return meta data and credential', (done) ->
+
+      client = null
+
+      options =
+        region        : 'us-east-1'
+        storage       : 8
+        instanceType : 't2.micro'
+
+      Aws.create client, options, (err, data) ->
+        expect(err).to.not.exist
+        expect(data.meta.type)            .to.be.equal Aws.providerSlug
+        expect(data.meta.region)          .to.be.equal options.region
+        expect(data.meta.instance_type)   .to.be.equal options.instanceType
+        done()
+
+
+  describe '#fetchAvailable()', ->
+
+    it 'should fetch aws pricing', (done) ->
+
+      client = null
+
+      Aws.fetchAvailable client, {}, (err, data) ->
+        expect(err).to.not.exist
+        expect(data).to.be.an 'array'
+        done()
+
+
+beforeTests()
+
+runTests()
+


Shift everythingone pixel to fix the build

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


Capture ctrl/cmd-S to ignore saving. Fix #285

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

--- client/codemirror/save.coffee
+++ client/codemirror/save.coffee
@@ -0,0 +1,13 @@
+CodeMirror = require "meteor/edemaine:sharejs-codemirror/node_modules/codemirror/lib/codemirror.js"
+
+modifier =
+  if CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault
+    "Cmd"
+  else
+    "Ctrl"
+CodeMirror.keyMap.default["#{modifier}-S"] = "save"
+
+## For now, ignore save actions (Ctrl-S in normal mode, :w in vim mode, etc.),
+## as everything is immediately uploaded to the server, and server decides
+## when to update the database.
+CodeMirror.commands.save = ->


bugfix: global variable problem in apprunner

 On branch master

	modified:   nodejs_server/lib/apprunner.coffee


Client: Activity: Added isPublicChatChannel util methods.

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


Create lib/utils.coffee

Create lib/utils.coffee

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

--- lib/utils.coffee
+++ lib/utils.coffee
@@ -0,0 +1,7 @@
+
+Function::property = (prop, descriptor)->
+  Object.defineProperty @prototype, prop, descriptor
+  @
+
+Object::defineProperty = (prop, descriptor)->
+  Object.defineProperty @, prop, descriptor


fixed formatBytes function

fixed formatBytes function

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


the ol teardown false

the ol teardown false

--- components/artwork_filter/test/view.coffee
+++ components/artwork_filter/test/view.coffee
@@ -20,7 +20,7 @@
       done()

   after ->
-    benv.teardown()
+    benv.teardown(false)

   beforeEach ->
     sinon.stub Backbone, 'sync'


let statements look up expressions

let statements look up expressions

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


lay grounds for super

lay grounds for super


Removed unnecessary variable

Removed unnecessary variable

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


fix multiplewidget.value(null)

fix multiplewidget.value(null)

--- app/assets/javascripts/uploadcare/widget/multiple-widget.js.coffee
+++ app/assets/javascripts/uploadcare/widget/multiple-widget.js.coffee
@@ -12,13 +12,14 @@
       @currentObject?.promise()

     __setObject: (group) =>
-      unless utils.isFileGroupsEqual(@currentObject, group)
+      if not utils.isFileGroupsEqual(@currentObject, group)
         super

     __setExternalValue: (value) ->
       @__lastGroupPr = groupPr = utils.valueToGroup(value, @settings)
-      @template.setStatus('started')
-      @template.statusText.text(t('loadingInfo'))
+      if value
+        @template.setStatus('started')
+        @template.statusText.text(t('loadingInfo'))
       groupPr
         .done (group) =>
           if @__lastGroupPr == groupPr


Add some basic test of Languages methods

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

--- test/languages.coffee
+++ test/languages.coffee
@@ -0,0 +1,31 @@
+{ getLanguage } = require '../src/languages'
+
+exports["CSS comment types"] = (test) ->
+  lang = getLanguage('foo.css')
+  test.equal lang.checkType('  /* ** FOO bar -- **'), 'multistart'
+  test.equal lang.checkType(' ** FOO bar -- **/ '), 'multiend'
+  test.equal lang.checkType('/** FOO bar -- **/ '), 'single', "Multi line comment spanning only one line is a single line comment"
+  test.done()
+
+exports["SASS comment types"] = (test) ->
+  lang = getLanguage('foo.scss')
+  test.equal lang.checkType('  /* ** FOO bar -- **'), 'multistart'
+  test.equal lang.checkType(' // FOO bar -- // '), 'single'
+  test.equal lang.checkType(' ** FOO bar -- **/ '), 'multiend'
+  test.equal lang.checkType(' // **/ '), 'multiend', "Multi comment containing single comment symbol"
+  test.done()
+
+exports["Less comment types"] = (test) ->
+  lang = getLanguage('foo.less')
+  test.equal lang.checkType('  /* ** FOO bar -- **'), 'multistart'
+  test.equal lang.checkType(' // FOO bar -- // '), 'single'
+  test.equal lang.checkType(' ** FOO bar -- **/ '), 'multiend'
+  test.equal lang.checkType(' // **/ '), 'multiend', "Multi comment containing single comment symbol"
+  test.done()
+
+exports["Filter out comments"] = (test) ->
+  lang = getLanguage('foo.css')
+  test.equal lang.filter('/* Comment */'), ' Comment '
+  lang = getLanguage('foo.scss')
+  test.equal lang.filter('// Comment'), ' Comment'
+  test.done()


Add new Angular OrderCycleResource

Add new Angular OrderCycleResource

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

--- app/assets/javascripts/darkswarm/services/order_cycle_resource.js.coffee
+++ app/assets/javascripts/darkswarm/services/order_cycle_resource.js.coffee
@@ -0,0 +1,9 @@
+Darkswarm.factory 'OrderCycleResource', ($resource) ->
+  $resource('/api/order_cycles/:id', {}, {
+    'products':
+      method: 'GET'
+      isArray: true
+      url: '/api/order_cycles/:id/products'
+      params:
+        id: '@id'
+  })


Admin: Integrations: Added sub items under integrations tab.

--- client/admin/lib/index.coffee
+++ client/admin/lib/index.coffee
@@ -13,6 +13,9 @@
 GroupsBlockedUserView     = require './views/groupsblockeduserview'
 AdminIntegrationsView     = require './views/integrations/adminintegrationsview'
 GroupGeneralSettingsView  = require './views/groupgeneralsettingsview'
+AdminIntegrationSetupView = require './views/integrations/adminintegrationsetupview'
+AdminIntegrationsDetailsView = require './views/integrations/adminintegrationdetailsview'
+

 require('./routehandler')()

@@ -31,7 +34,15 @@
         { slug : 'Members',        title : 'Members',           viewClass : AdminMembersView         }
         { slug : 'Invitations',    title : 'Invitations',       viewClass : AdminInvitationsView     }
         { slug : 'Permissions',    title : 'Permissions',       viewClass : GroupPermissionsView     }
-        { slug : 'Integrations',   title : 'Integrations',      viewClass : AdminIntegrationsView    }
+        {
+          slug      : 'Integrations'
+          title     : 'Integrations'
+          viewClass : AdminIntegrationsView,
+          subTabs   : [
+            { title : 'Add',        action: 'Add',              viewClass : AdminIntegrationSetupView    }
+            { title : 'Configure',  action: 'Configure',        viewClass : AdminIntegrationsDetailsView }
+          ]
+        }
         { slug : 'Stacks',         title : 'Compute Stacks',    viewClass : GroupStackSettings       }
       ]
     koding     :


Gem whois script for Hubot.

Gem whois script for Hubot.

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

--- src/scripts/gemwhois.coffee
+++ src/scripts/gemwhois.coffee
@@ -0,0 +1,19 @@
+# Whois for gems, because gem names are like domains in the 90's
+#
+# gem whois <gemname> - returns gem details if it exists
+#
+
+module.exports = (robot) ->
+  robot.respond /gem whois (.*)/i, (msg) ->
+    gemname = escape(msg.match[1])
+    msg.http("http://rubygems.org/api/v1/gems/#{gemname}.json")
+      .get() (err, res, body) ->
+        try
+          json = JSON.parse(body)
+          msg.send "   gem name: #{json.name}\n
+     owners: #{json.authors}\n
+       info: #{json.info}\n
+    version: #{json.version}\n
+  downloads: #{json.downloads}\n"
+        catch err
+          msg.send "Gem not found. It will be mine. Oh yes. It will be mine. *sinister laugh*"


Disable mongod data file preallocation

Disable mongod data file preallocation

Signed-off-by: Sonmez Kartal <d2d15c3d37396a5f2a09f8b42cf5f27d43a3fbde@koding.com>


config: remove echo

config: remove echo


initial rAF.coffee - commit.

initial rAF.coffee - commit.

rAF.coffee, for requestAnimationFrame utility functions written in CoffeeScript.

error: pathspec 'code/github/recipes/assets/script/coffee/module/helper/rAF.coffee' did not match any file(s) known to git

--- code/github/recipes/assets/script/coffee/module/helper/rAF.coffee
+++ code/github/recipes/assets/script/coffee/module/helper/rAF.coffee
@@ -0,0 +1 @@
+# rAF [requestAnimationFrame] CoffeeScript


Copy to _data-events directory.

Copy to _data-events directory.

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


Changed ports for simultaneous development of other projects.

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/ag-data-browser.git/'


udefine configuration

udefine configuration

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

--- udefine/config.coffee
+++ udefine/config.coffee
@@ -0,0 +1,2 @@
+do (root = @) ->
+  root.udefine.globals['mixer'] = root.mixer


autocomplete js de tratamientos

autocomplete js de tratamientos

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

--- app/assets/javascripts/autocomplete_tratamientos.js.coffee
+++ app/assets/javascripts/autocomplete_tratamientos.js.coffee
@@ -0,0 +1,23 @@
+window.Helpers ||= {}
+
+window.Helpers.AutocompleteTratamiento = {
+  init_autocomplete: ->
+    $(".tratamiento").autocomplete
+      minLength: 3
+      source: "/item_tratamientos/autocomplete.json"
+      response: (event, ui) ->
+        unless ui.content.length
+          NoExiste =
+            id: "vacio"
+            label: "No existe: #{event.target.value}"
+          ui.content.push NoExiste
+        else
+          $("#message").empty()
+      select: (event, ui) ->
+        $this = $(this)
+        $this.next(".item_id").val ui.item.id
+}
+
+jQuery window.Helpers.AutocompleteTratamiento.init
+$(document).on "ready page:load", window.Helpers.AutocompleteTratamiento.init_autocomplete
+$(document).on "nested:fieldAdded", window.Helpers.AutocompleteTratamiento.init_autocomplete


Change message in pm10 command

Change message in pm10 command

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


Added markers so that you can alt click in comments

--- lib/services/goto.coffee
+++ lib/services/goto.coffee
@@ -7,6 +7,7 @@
 GotoSelectView = require './goto-select-list-view.coffee'
 {TextEditor} = require 'atom'
 $ = require 'jquery'
+allMarkers = []

 module.exports =

@@ -14,6 +15,7 @@
         @subAtom = new SubAtom
         self = this
         atom.workspace.observeTextEditors (editor) ->
+            self.parseComments editor
             self.registerEvents editor

         # When you go back to only have 1 pane the events are lost, so need
@@ -43,6 +45,8 @@
     ###
     deactivate: () ->
         @subAtom.dispose()
+        for key,marker of allMarkers
+            marker.destroy()

     ###*
      * Goto the class the cursor is on
@@ -100,10 +104,12 @@
     registerEvents: (editor) ->
         if editor.getGrammar().scopeName.match /text.html.php$/
             textEditorElement = atom.views.getView(editor)
-            eventSelectors = '.inherited-class, .support.namespace, .support.class'
-            scrollViewElement = $($(textEditorElement)[0].shadowRoot).find('.scroll-view')
-
-            @subAtom.add scrollViewElement, 'mousemove', eventSelectors, (event) =>
+            hoverEventSelectors = '.entity.inherited-class, .support.namespace, .support.class, .comment-clickable .region'
+            clickEventSelectors = '.entity.inherited-class, .support.namespace, .support.class'
+            scrollViewElement = $(textEditorElement.shadowRoot).find('.scroll-view')
+
+            self = @
+            @subAtom.add scrollViewElement, 'mousemove', hoverEventSelectors, (event) =>
                 if event.altKey == false
                     return
                 selector = @getSelector(event)
@@ -111,19 +117,32 @@
                     return
                 $(selector).css('text-decoration', 'underline')
                 $(selector).css('cursor', 'pointer')
-            @subAtom.add scrollViewElement, 'mouseout', eventSelectors, (event) =>
+                self.isHovering = true
+            @subAtom.add scrollViewElement, 'mouseout', hoverEventSelectors, (event) =>
                 selector = @getSelector(event)
                 if selector == null
                     return
                 $(selector).css('text-decoration', '')
                 $(selector).css('cursor', '')
-            @subAtom.add scrollViewElement, 'click', eventSelectors, (event) =>
+                self.isHovering = false
+            @subAtom.add scrollViewElement, 'click', clickEventSelectors, (event) =>
                 selector = @getSelector(event)
                 if selector == null || event.altKey == false
                     return
                 if event.handled != true
                     @gotoFromWord(editor, $(selector).text())
                     event.handled = true
+            editor.onDidChangeCursorPosition (event) ->
+                if self.isHovering == false
+                    return
+                markerProperties =
+                    containsBufferPosition: event.newBufferPosition
+                markers = event.cursor.editor.findMarkers markerProperties
+                for key,marker of markers
+                    for allKey,allMarker of allMarkers
+                        if marker.id == allMarker.id
+                            self.gotoFromWord(event.cursor.editor, marker.getProperties().class)
+                            break

     ###*
      * Gets the correct selector when a class or namespace is clicked.
@@ -142,3 +161,49 @@
             return $(selector).parent().children('.namespace, .class:not(.operator):not(.constant)')

         return selector
+
+    ###*
+     * Goes through all the lines within the editor looking for classes within
+     * comments. More specifically if they have @var, @param or @return prefixed.
+     * @param  {TextEditor} editor The editor to search through
+    ###
+    parseComments: (editor) ->
+        text = editor.getText()
+        rows = text.split('\n')
+        for key,row of rows
+            regex = /@param|@var|@return/gi
+            if regex.test(row)
+                @addMarkerToCommentLine row.split(' '), parseInt(key), editor, true
+
+    ###*
+     * Analyses the words array given for any classes and then creates a marker
+     * for them.
+     * @param {array} words             The array of words to check.
+     * @param {int} rowIndex            The current row the words are on within the editor.
+     * @param {TextEditor} editor       The editor the words are from.
+     * @param {bool} shouldBreak        Flag to say whether the search should break after finding 1 class.
+     * @param {int} currentIndex = 0    The current column index the search is on.
+     * @param {int} offset       = 0    Any offset that should be applied when creating the marker.
+    ###
+    addMarkerToCommentLine: (words, rowIndex, editor, shouldBreak, currentIndex = 0, offset = 0) ->
+        for key,value of words
+            regex = /^\\?([A-Za-z0-9_]+)\\?([A-Za-zA-Z_\\]*)?/g
+            keywordRegex = /^(array|object|bool|string|static|null|boolean|void|int|integer|mixed|callable)$/gi
+            if regex.test(value) && keywordRegex.test(value) == false
+                if value.includes('|')
+                    @addMarkerToCommentLine value.split('|'), rowIndex, editor, false, currentIndex, parseInt(key)
+                else
+                    range = [[rowIndex, currentIndex + parseInt(key) + offset], [rowIndex, currentIndex + parseInt(key) + value.length + offset]];
+                    marker = editor.markBufferRange(range)
+                    markerProperties =
+                        class: value
+                    marker.setProperties markerProperties
+                    options =
+                        type: 'highlight'
+                        class: 'comment-clickable comment'
+
+                    editor.decorateMarker marker, options
+                    allMarkers.push(marker)
+                if shouldBreak == true
+                    break
+            currentIndex += value.length;


Wait for activation promise

Wait for activation promise

--- spec/editor-spec.coffee
+++ spec/editor-spec.coffee
@@ -2782,12 +2782,13 @@
         expect(tokens[1].value).toBe " SELECT * FROM OCTOCATS"
         expect(tokens[1].scopes).toEqual ["source.js", "comment.line.double-slash.js"]

-
-        atom.packages.activatePackage('package-with-injection-selector')
-
-        {tokens} = editor.lineForScreenRow(0)
-        expect(tokens[1].value).toBe " SELECT * FROM OCTOCATS"
-        expect(tokens[1].scopes).toEqual ["source.js", "comment.line.double-slash.js"]
+        waitsForPromise ->
+          atom.packages.activatePackage('package-with-injection-selector')
+
+        runs ->
+          {tokens} = editor.lineForScreenRow(0)
+          expect(tokens[1].value).toBe " SELECT * FROM OCTOCATS"
+          expect(tokens[1].scopes).toEqual ["source.js", "comment.line.double-slash.js"]

         waitsForPromise ->
           atom.packages.activatePackage('language-sql')


Fixed queue

Fixed queue

--- server/commons/queue.coffee
+++ server/commons/queue.coffee
@@ -201,7 +201,7 @@
         receiptHandle: @_generateRandomReceiptHandle()
         scheduledVisibilityTime: @_constructDefaultVisibilityTimeoutDate()

-    @Message.findOneAndUpdate conditions, update, options, (err, data) =>
+    @Message.findOneAndUpdate conditions, update, (err, data) =>
       return @emit 'error',err,data if err?

       originalData = data


Remove unneeded ?

Remove unneeded ?

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -116,7 +116,7 @@
   atom.workspace = null
   delete atom.state.workspace

-  atom.project?.destroy?()
+  atom.project?.destroy()
   atom.project = null

   delete atom.state.packageStates


SidebarOwnMachinesList: Added view class for my own vm list.


Adding redis_object

Adding redis_object

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

--- src/models/redis_object.coffee
+++ src/models/redis_object.coffee
@@ -0,0 +1,64 @@
+RedisSingleton = require '../redis'
+
+###*
+ * Acts as a base class for all Redis-based objects.
+###
+class RedisObject
+  constructor: ->
+    @base_prefix = "node-ios-ota"
+    @object_prefix = "redis-object"
+    @redis = RedisSingleton.get()
+
+  ###*
+   * Returns the redis prefix for the current object type.
+   * @return {String} The redis object prefix for the current object
+  ###
+  prefix: => [@base_prefix, @object_prefix].join('-')
+
+  ###*
+   * Returns all of the redis objects of the current object type.
+   * @param {Function} (fn) The callback function
+  ###
+  all: (fn) =>
+    fn(null, [])
+
+  ###*
+   * Searches for the redis objects that match the query.
+   * @param {Object} (query) The query object to search
+   * @param {Function} (fn) The callback function
+  ###
+  find: (query, fn) =>
+    fn(null, [])
+
+  ###*
+   * Searches for the redis object that matches the query.
+   * @param {Object} (query) The query object to search
+   * @param {Function} (fn) The callback function
+  ###
+  find_one: (query, fn) =>
+    @find query, (err, obj) ->
+      fn(err, obj)
+
+  ###*
+   * Adds a new redis object of the current type to the database.
+   * @param {Object} (obj) The object to add
+   * @param {Function} (fn) The callback function
+  ###
+  add: (obj, fn) =>
+    fn(null, obj)
+
+  ###*
+   * Updates a redis object with the given parameters.
+   * @param {Object} (obj) The object to merge with updates
+   * @param {Function} (fn) The callback function
+  ###
+  update: (obj, fn) =>
+    fn(null, obj)
+
+  ###*
+   * Deletes a redis object that matches the query.
+   * @param {Object} (query) The query object to search
+   * @param {Function} (fn) the callback function
+  ###
+  delete: (query, fn) =>
+    fn(null, true)


Fix PhantomJS options

Fix PhantomJS options

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


chore: update release commit message

chore: update release commit message

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -11,7 +11,9 @@
     clean: tests: ['tmp']
     nodeunit: tests: ['test/test_*.js']

-    bump: options: commitFiles: [ 'package.json', 'CHANGELOG.md' ]
+    bump: options:
+      commitFiles: [ 'package.json', 'CHANGELOG.md' ]
+      commitMessage: 'chore: Release v%VERSION%'
     'auto-release': options: checkTravisBuild: false
     'npm-contributors': options:
       commit: false


added Grunt support

added Grunt support

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

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,81 @@
+'use strict'
+
+module.exports = (grunt) ->
+  grunt.loadNpmTasks 'grunt-bower-task'
+  grunt.loadNpmTasks 'grunt-contrib-connect'
+  grunt.loadNpmTasks 'grunt-contrib-copy'
+  grunt.loadNpmTasks 'grunt-contrib-watch'
+  grunt.loadNpmTasks 'grunt-exec'
+  grunt.initConfig
+    copy:
+      jquery: files: [ {
+        expand: true
+        cwd: 'bower_components/jquery/dist/'
+        src: 'jquery.min.js'
+        dest: 'vendor/js/'
+      } ]
+      trianglify: files: [ {
+        expand: true
+        cwd: 'bower_components/trianglify/dist/'
+        src: 'trianglify.min.js'
+        dest: 'vendor/js/'
+      } ]
+      normalize: files: [ {
+        expand: true
+        cwd: 'bower_components/normalize-scss/'
+        src: 'normalize.css'
+        dest: 'vendor/css/'
+      } ]
+      fontawesome: files: [ {
+        expand: true
+        cwd: 'bower_components/font-awesome/css/'
+        src: 'font-awesome.min.css'
+        dest: 'vendor/css/'
+      } ]
+      opensans: files: [ {
+        expand: true
+        cwd: 'bower_components/open-sans-fontface/'
+        src: 'open-sans.css'
+        dest: 'vendor/css/'
+      } ]
+      raleway: files: [ {
+        expand: true
+        cwd: 'bower_components/raleway-fontface/css'
+        src: 'raleway-fontface.css'
+        dest: 'vendor/css/'
+      } ]
+      skeleton: files: [ {
+        expand: true
+        cwd: 'bower_components/skeleton/css'
+        src: 'skeleton.css'
+        dest: 'vendor/css/'
+      } ]
+    exec: jekyll: cmd: 'jekyll build --trace'
+    watch:
+      options: livereload: true
+      source:
+        files: [
+          '_drafts/**/*'
+          '_includes/**/*'
+          '_layouts/**/*'
+          '_posts/**/*'
+          '_assets/**/*'
+          '_config.yml'
+          '*.html'
+          '*.md'
+        ]
+        tasks: [ 'exec:jekyll' ]
+    connect: server: options:
+      port: 4040
+      base: '_site'
+      livereload: true
+  grunt.registerTask 'build', [
+    'copy'
+    'exec:jekyll'
+  ]
+  grunt.registerTask 'serve', [
+    'build'
+    'connect:server'
+    'watch'
+  ]
+  grunt.registerTask 'default', [ 'serve' ]


fix(grunt): missing base URL, new `grunt-html-smoosher` config

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -211,6 +211,7 @@
         jsDir: "<%= config.dist %>"
         cssDir: "<%= config.dist %>"
         includeTag: "[data-inline]"
+        assetsUrlPrefix: "<%= config.base %>/assets/"

       dist:
         files: [
@@ -242,7 +243,7 @@
       dist:
         options:
           config: "_config.yml"
-          dest: "<%= config.dist %>"
+          dest: "<%= config.dist %><%= config.base %>"

     shell:
       options:


Added comments on Gruntfile

Added comments on Gruntfile

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


Clean log

Clean log

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


requires-context tag

requires-context tag

error: pathspec 'src/components/tags/requires-context.cjsx' did not match any file(s) known to git

--- src/components/tags/requires-context.cjsx
+++ src/components/tags/requires-context.cjsx
@@ -0,0 +1,28 @@
+React = require 'react'
+BS = require 'react-bootstrap'
+_ = require 'underscore'
+
+PREFIX = 'requires-context'
+Wrapper = require './wrapper'
+{ExerciseActions, ExerciseStore} = require '../../stores/exercise'
+
+RequiresContextTag = React.createClass
+
+  propTypes:
+    exerciseId: React.PropTypes.string.isRequired
+
+  updateTag: (ev) ->
+    console.log ev.target.checked
+    tag = if ev.target.checked then 'true' else false # false will remove tag
+    ExerciseActions.setPrefixedTag(@props.exerciseId, prefix: PREFIX, tag: tag, replaceOthers:true)
+
+  render: ->
+    tag = _.first ExerciseStore.getTagsWithPrefix(@props.exerciseId, PREFIX)
+
+    <Wrapper label="Requires Context">
+      <div className="tag">
+        <input type="checkbox" label="" onChange={@updateTag} checked={tag is 'true'} />
+      </div>
+    </Wrapper>
+
+module.exports = RequiresContextTag


<model> Driver - Schema + Creation

<model> Driver - Schema + Creation

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

--- server/models/driver.coffee
+++ server/models/driver.coffee
@@ -0,0 +1,138 @@
+###
+# =================
+# SCHEMA - Driver
+# =================
+# Defines a Driver, interfacing with devices
+###
+
+fs = require 'fs'
+multiparty = require 'multiparty'
+path = require 'path'
+mkdirp = require 'mkdirp'
+decompress = require 'decompress'
+cozydb = require 'cozydb'
+
+const DRIVERS_DIR = '../drivers/'
+
+sensorsDrivers = null # List of drivers supported by the system - Must be set when server starts.
+module.exports.setDrivers = (ref) -> sensorsDrivers = ref
+
+module.exports = class Driver extends cozydb.CozyModel
+	@schema:
+		name: 		type : String		# not Empty
+
+
+	###
+	# destroy
+	# ====
+	# Deletes the Driver, if there is no Sensor depending on it
+	# @param callback (Function(Error):null):		Callback
+	###
+	destroy: (callback) ->
+		superDestroy = super
+		###
+		# Find if there are still sensors depending on this driver:
+
+			# If yes, return an error:
+
+			# Else stop the driver and delete it (files + instance in DB):
+
+		sensorsDrivers[@type].remove @customId, (err2) ->
+			if err2
+				callback err2
+			else
+				# Remove from DB:
+				superDestroy (err3) ->
+					if err3
+						# Cancelling Modif:
+						sensorsDrivers[@type].remove prevDriver.customId, id, (err2) ->
+							if err2
+								callback 'Device removed from system but not DB. Contact Admin (' + err3 + ' AND ' + err2 + ')'
+							else
+								callback err3
+					else
+						callback null ###
+
+	###
+	# updateAttributes
+	# ====
+	# Prevents updates on the object.
+	# @param data (dictionary): 						New data
+	# @param callback (Function(Error, Driver):null):	Callback
+	###
+	updateAttributes: (data, callback) ->
+		callback 'Drivers can\'t be updated', driver
+
+
+	###
+	# byName
+	# ====
+	# Finds drivers by their name.
+	# @param name (string): 								Name
+	# @param callback (Function(Error, Driver[]):null): 	Callback
+	###
+	@byCalendar = (name, callback) ->
+		@request 'byName', key: name, callback
+
+	###
+	# create
+	# ====
+	# Adds a driver to the DB and system (unzipping its files and initializing its node module). If a similar driver already exists (same name), then this driver is returned.
+	# @param data (Object): 							Data defining the driver
+	# @param callback (Function(Error, Driver):null): 	Callback
+	###
+	@create: (data, callback) ->
+		superCreate = super
+
+		file = data.file
+		unless file.ext = path.extname(file.originalFilename) and file.ext in ['.zip', '.tar', '.tar.bz2', '.tar.gz']
+			callback 'Unknown file extension', null
+			return cleanUp()
+		unless file.name = path.basename(file.originalFilename, file.ext)
+			callback 'Unknown file name', null
+			return cleanUp()
+
+		# Check if this driver isn't already added (the name should be unique):
+		@byName file.name (err, drivers)->
+			if err
+				callback 'DB error', null
+			else if drivers.length isnt 0 # Driver already exists.
+				callback 'Driver already added', drivers[0]
+			else
+				# Create directory for the driver's files:
+				dirName = DRIVERS_DIR+file.name
+				mkdirp(dirName, (err) ->
+					if err
+						callback 'Error creating the directory for the driver', null
+						return
+
+					# Unzip in it:
+					plug = [
+						'.zip' : decompress.zip,
+						'.tar' : decompress.tar,
+						'.tar.bz2' : decompress.tarbz2,
+						'.tar.gz' : decompress.targz][file.ext]
+
+					new decompress( mode: '755' )
+					 .src file.path
+					 .dest dirName
+					 .use plug strip: 1
+					 .run (err) ->
+						if err
+							callback 'Error unzipping the driver', null
+							return
+
+						# Initialize the driver:
+						unless driverModule = require dirName + file.name
+							callback 'Couldn\'t find module', null
+						unless driverModule.add and driverModule.remove and driver.update and driver.init and driver.apply
+							callback 'Driver not implementing the interface', null
+
+						driverModule.init (err) ->
+							if err
+								callback 'Error initializing the driver', null
+							else
+								# If everything worked, save the Driver instance in DB:
+								data =
+									name: file.name
+								superCreate data, callback


Add homepage link to dropdown

Add homepage link to dropdown

--- src/app/package-config-view.coffee
+++ src/app/package-config-view.coffee
@@ -1,4 +1,4 @@
-{View} = require 'space-pen'
+{$$, View} = require 'space-pen'
 requireWithGlobals 'bootstrap/js/bootstrap-dropdown', jQuery: require 'jquery'

 module.exports =
@@ -46,6 +46,17 @@
         @readme.show()
         @readmeLink.text('Hide README')

+    homepage = @pack.homepage
+    unless homepage
+      repoUrl = (@pack.repository?.url ? '').replace(/.git$/, '')
+      homepage = repoUrl if require('url').parse(repoUrl).host is 'github.com'
+
+    if homepage
+      @dropdown.append $$ ->
+        @li =>
+          @a "Visit Homepage", href: homepage
+    @dropdown.on 'click', => @dropdown.hide()
+
     @updateInstallState()

   updateInstallState: ->


fix error

fix error

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


20140905 修改了angular的controller中 OFOUserOrderController


Prevent default action from occurring.

Prevent default action from occurring.

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


detail (Edit) page for apps

detail (Edit) page for apps

error: pathspec 'imports/ui/pages/meteor/AppsDetailPage.coffee' did not match any file(s) known to git

--- imports/ui/pages/meteor/AppsDetailPage.coffee
+++ imports/ui/pages/meteor/AppsDetailPage.coffee
@@ -0,0 +1,18 @@
+{ createContainer } = require 'meteor/react-meteor-data'
+
+
+module.exports = createContainer (props) ->
+  App = props.route.App
+  Apps = App.collections.Apps
+
+  App.subscribe.allApps()
+
+  name = props.params.name
+  version = props.params.version
+
+  app: app = Apps.findOne name: name, version: version
+  title: "#{name}:#{version}"
+  onRemoveApp: -> App.emit 'remove app', app
+  onStartApp: -> App.emit 'start app', app
+
+, require '../AppsDetailPage.cjsx'


:lipstick:

:lipstick:

--- src/browser/squirrel-update.coffee
+++ src/browser/squirrel-update.coffee
@@ -9,9 +9,6 @@
 # Spawn the Update.exe with the given arguments and invoke the callback when
 # the command completes.
 exports.spawn = (args, callback) ->
-  stdout = ''
-  error = null
-
   args = args.map (arg) -> "\"#{arg.toString().replace(/"/g, '\\"')}\""
   if /\s/.test(updateDotExe)
     args.unshift("\"#{updateDotExe}\"")
@@ -22,7 +19,11 @@
   command = process.env.comspec or 'cmd.exe'

   updateProcess = ChildProcess.spawn(command, args, windowsVerbatimArguments: true)
+
+  stdout = ''
   updateProcess.stdout.on 'data', (data) -> stdout += data
+
+  error = null
   updateProcess.on 'error', (processError) -> error ?= processError
   updateProcess.on 'close', (code, signal) ->
     error ?= new Error("Command failed: #{signal}") if code isnt 0


clone and delete

clone and 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/pervino/solidus_designs.git/'


working on new auth/connect

working on new auth/connect

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


adding clarity to messages that the stormpack adapter handles vs stormpack


changed regex for broader compatibility with service definitions

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/Pravici/node-siebel.git/'


Move line comment to repository

Move line comment to repository

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/pyfisch/atom-language-rust.git/'


Remove redundant tests and neaten up a bit


Fixed the total GB estimate NAN bug. (#2411)

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


SyncLocalController: class to sync content on local storage to remote is added

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


fixing another issue on activity feed for continueLoadingTeasers

--- client/landing/app/Applications/Activity.kdapplication/AppController.coffee
+++ client/landing/app/Applications/Activity.kdapplication/AppController.coffee
@@ -177,7 +177,7 @@
         # memberbucket data has no serverside model it comes from cache
         # so it has no meta, that's why we check its date by its overview
         lastDate = if lastItemData.createdAtTimestamps
-          new Date lastItemData.createdAtTimestamps.first
+          new Date lastItemData.createdAtTimestamps[0]
         else
           new Date lastItemData.meta.createdAt


update configuration/setup

update configuration/setup

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/mover-io/hubot-flow-ingredientz.git/'


what the coffee?

what the coffee?

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

--- static/coffee/whatthecoffee.coffee
+++ static/coffee/whatthecoffee.coffee
@@ -0,0 +1,10 @@
+  class Sector
+    constructor: (d)->
+      # "extend" d onto this object but prepend underscore to certain keys
+      changed_keys = "subgroups columns default".split ' '
+      @[if k in changed_keys then "_#{k}" else k] = val  for k, val of d
+
+ -------------------------------------------------------
+
+
+


Student dashboard helpers

Student dashboard helpers

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

--- test-integration/student/dashboard.coffee
+++ test-integration/student/dashboard.coffee
@@ -0,0 +1,34 @@
+{describe, CourseSelect, Calendar, ReadingBuilder} = require '../helpers'
+{expect} = require 'chai'
+_ = require 'underscore'
+
+
+class StudentDashboard
+
+  constructor: (@test, @login, @courseTitle) ->
+    @test.login(@login)
+    CourseSelect.goToCourseByName(@test, @courseTitle)
+
+  progressGuideEl: ->
+    @test.driver.wait =>
+      @test.driver.isElementPresent(css: '.loadable.is-loading').then (isPresent) -> not isPresent
+    @test.driver.findElement(css: '.progress-guide')
+
+module.exports = StudentDashboard
+
+
+describe 'Student Dashboard', ->
+
+  @beforeEach ->
+    @dash = new StudentDashboard(@, 'student01', 'Biology I')
+
+
+  @it 'Shows Performance Forecast', ->
+    guide = @dash.progressGuideEl()
+    titles = guide.findElements(css: '.section > .title')
+    #console.log titles
+    guide.getText().then (txt) ->
+      console.log "TEXT", txt
+    # titles = _.map titles, (el) -> el #.getText()
+    # console.log titles
+    expect(guide).not.to.be.null


Добавлен storage.js (ChocolateStorage)

Добавлен storage.js (ChocolateStorage)

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

--- storage.coffee
+++ storage.coffee
@@ -0,0 +1,61 @@
+
+class ChocolateStorage
+
+    merge = (o1, o2) ->
+        return o1 if o1 == null or o2 == null
+        for key of o2
+            o1[key] = o2[key] if o2.hasOwnProperty key
+        o1
+
+    constructor: () ->
+        @_elements = []
+        @length = 0
+
+    add: (options) ->
+        @_elements[@length] = merge {
+                'i': @length, # ID
+                't': '',      # title
+                'p': '',      # preview
+                'f': '',      # filename
+                'o': '',      # original
+                'w': null,    # width
+                'h': null     # height
+            }, options
+        merge {}, @_elements[@length++]
+
+    get: (key, fn) ->
+        item = @_elements[key]
+        if item.h? and item.w? or item.o == ''
+            fn item
+            return item
+        image = new Image
+        image.src = item.o
+        image.addEventListener "error", () ->
+            item.o = ''
+            item.w = 0
+            item.h = 0
+            fn item
+            item
+        , false
+        image.addEventListener "load", () ->
+            item.w = image.naturalWidth
+            item.h = image.naturalHeight
+            fn item
+            item
+        , false
+        item
+
+    next: (key, fn) ->
+        if ++key < @length
+            console.log 'next '+key
+            return @get key, fn
+        false
+
+    prev: (key, fn) ->
+        if --key > -1
+            console.log 'prev '+key
+            return @get key, fn
+        false
+
+
+window.ChocolateStorage = ChocolateStorage


Changed the recorder date format to DD/MM/YYYY on recording tab. (#2463)


Add initial Level 2 InputEvent tests

Add initial Level 2 InputEvent tests

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

--- test/src/system/level_2_input_test.coffee
+++ test/src/system/level_2_input_test.coffee
@@ -0,0 +1,108 @@
+{assert, clickToolbarButton, defer, insertString, isToolbarButtonActive, selectAll, test, testIf, testGroup, triggerEvent, triggerInputEvent} = Trix.TestHelpers
+
+test = ->
+  testIf(Trix.config.input.getLevel() is 2, arguments...)
+
+testOptions =
+  template: "editor_empty"
+  setup: ->
+    addEventListener("beforeinput", recordInputEvent, true)
+    addEventListener("input", recordInputEvent, true)
+  teardown: ->
+    removeEventListener("beforeinput", recordInputEvent, true)
+    removeEventListener("input", recordInputEvent, true)
+
+inputEvents = []
+
+recordInputEvent = (event) ->
+  # Not all browsers dispatch "beforeinput" event when calling execCommand() so
+  # we manually dispatch a synthetic one. If a second one arrives, ignore it.
+  if event.type is "beforeinput" and inputEvents.length is 1 and inputEvents[0].type is "beforeinput"
+    event.stopImmediatePropagation()
+  else
+    {type, inputType, data} = event
+    inputEvents.push({type, inputType, data})
+
+# Borrowed from https://github.com/web-platform-tests/wpt/blob/master/input-events/input-events-exec-command.html
+performInputTypeUsingExecCommand = (command, {inputType, data}) ->
+  inputEvents = []
+  triggerInputEvent(document.activeElement, "beforeinput", {inputType, data})
+  document.execCommand(command, false, data)
+  assert.equal(inputEvents.length, 2)
+  assert.equal(inputEvents[0].type, "beforeinput")
+  assert.equal(inputEvents[1].type, "input")
+  assert.equal(inputEvents[0].inputType, inputType)
+  assert.equal(inputEvents[0].data, data)
+
+testGroup "Level 2 Input", testOptions, ->
+  test "insertText", (expectDocument) ->
+    performInputTypeUsingExecCommand("insertText", inputType: "insertText", data: "abc")
+    defer ->
+      expectDocument("abc\n")
+
+  test "insertOrderedList", (expectDocument) ->
+    insertString("abc")
+    performInputTypeUsingExecCommand("insertOrderedList", inputType: "insertOrderedList")
+    defer ->
+      assert.blockAttributes([0, 4], ["numberList", "number"])
+      assert.ok isToolbarButtonActive(attribute: "number")
+      expectDocument("abc\n")
+
+  test "insertUnorderedList", (expectDocument) ->
+    insertString("abc")
+    performInputTypeUsingExecCommand("insertUnorderedList", inputType: "insertUnorderedList")
+    defer ->
+      assert.blockAttributes([0, 4], ["bulletList", "bullet"])
+      assert.ok isToolbarButtonActive(attribute: "bullet")
+      expectDocument("abc\n")
+
+  test "insertLineBreak", (expectDocument) ->
+    clickToolbarButton attribute: "quote", ->
+      insertString("abc")
+      performInputTypeUsingExecCommand("insertLineBreak", inputType: "insertLineBreak")
+      defer ->
+        performInputTypeUsingExecCommand("insertLineBreak", inputType: "insertLineBreak")
+        defer ->
+          assert.blockAttributes([0, 6], ["quote"])
+          expectDocument("abc\n\n\n")
+
+  test "insertParagraph", (expectDocument) ->
+    clickToolbarButton attribute: "quote", ->
+      insertString("abc")
+      performInputTypeUsingExecCommand("insertParagraph", inputType: "insertParagraph")
+      defer ->
+        performInputTypeUsingExecCommand("insertParagraph", inputType: "insertParagraph")
+        defer ->
+          assert.blockAttributes([0, 4], ["quote"])
+          assert.blockAttributes([4, 5], [])
+          expectDocument("abc\n\n")
+
+  test "formatBold", (expectDocument) ->
+    insertString("abc")
+    getComposition().setSelectedRange([1, 2])
+    performInputTypeUsingExecCommand("bold", inputType: "formatBold")
+    defer ->
+      assert.textAttributes([0, 1], {})
+      assert.textAttributes([1, 2], bold: true)
+      assert.textAttributes([2, 3], {})
+      expectDocument("abc\n")
+
+  test "formatItalic", (expectDocument) ->
+    insertString("abc")
+    getComposition().setSelectedRange([1, 2])
+    performInputTypeUsingExecCommand("italic", inputType: "formatItalic")
+    defer ->
+      assert.textAttributes([0, 1], {})
+      assert.textAttributes([1, 2], italic: true)
+      assert.textAttributes([2, 3], {})
+      expectDocument("abc\n")
+
+  test "formatStrikeThrough", (expectDocument) ->
+    insertString("abc")
+    getComposition().setSelectedRange([1, 2])
+    performInputTypeUsingExecCommand("strikeThrough", inputType: "formatStrikeThrough")
+    defer ->
+      assert.textAttributes([0, 1], {})
+      assert.textAttributes([1, 2], strike: true)
+      assert.textAttributes([2, 3], {})
+      expectDocument("abc\n")


Client: Activity: Test: Created ChannelParticipantsInputWidget index file


Show "no payment" placeholder

Show "no payment" placeholder


Teamwork: Added preview icon to the files under web folder.

--- client/landing/CollaborativeWorkspace/panes/collaborativefinderpane.coffee
+++ client/landing/CollaborativeWorkspace/panes/collaborativefinderpane.coffee
@@ -63,6 +63,13 @@
     @finderController.treeController.on "ExportRequested", (node) =>
       new TeamworkExportModal {}, node

+    @finderController.treeController.on "PreviewRequested", (node) =>
+      tabView   = @workspace.getActivePanel().getPaneByName "tabView"
+      nickname  = KD.nick()
+      [t, path] = node.getData().path.split "#{nickname}/Web/"
+      publicUrl = "https://#{nickname}.kd.io/#{path}"
+      tabView.createPreview null, null, publicUrl
+
   syncContent: (files) ->
     @workspaceRef.set { files }


Remove .coffee extention is require

Remove .coffee extention is require

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/C-Bouthoorn/Epsilon.git/'


Remove semicolon

Remove semicolon

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -4,7 +4,7 @@
 # background page that we're in domReady and ready to accept normal commands by connectiong to a port named
 # "domReady".
 #
-getCurrentUrlHandlers = []; # function(url)
+getCurrentUrlHandlers = [] # function(url)

 insertModeLock = null
 findMode = false


created Kite List controller for Account page

error: pathspec 'client/app/Applications/Account.kdapplication/account/accKiteList.coffee' did not match any file(s) known to git

--- client/app/Applications/Account.kdapplication/account/accKiteList.coffee
+++ client/app/Applications/Account.kdapplication/account/accKiteList.coffee
@@ -0,0 +1,167 @@
+class AccountKiteListController extends KDListViewController
+
+  constructor:(options,data)->
+    options.cssClass = "kites"
+    super options,data
+
+  loadView:->
+    super
+
+    KD.remote.api.JKite.fetchAll {}, (err, kites) =>
+      if err then warn err
+      else
+        @instantiateListItems kites
+
+    list = @getListView()
+    @getView().parent.addSubView addButton = new KDButtonView
+      style     : "clean-gray account-header-button"
+      title     : "Add new Kite"
+      icon      : yes
+      iconOnly  : yes
+      iconClass : "plus"
+      tooltip     :
+        title     : "Add new Kite"
+        placement : "left"
+      callback  : =>
+        list.showModal()
+
+    ##################### Events ############################
+    list.on "DeleteKiteSubmitted", @bound "deleteKite"
+
+    list.on "UpdateKiteSubmitted", @bound "updateDatabase"
+
+    list.on "CreateKiteSubmitted", @bound "createKite"
+
+    @on "KiteDeleted", list.bound "removeItem"
+
+    @on "KiteUpdated", list.bound ""
+
+    @on "KiteCreated", (itemData)=>
+      list.addItem itemData, null, {type : "slideDown", duration : 100}
+      new KDModalView
+        title   : "New Kite Information"
+        width   : 500
+        overlay : yes
+        content : """
+

+
Kite Application Name:   #{itemData.appName}

+
Kite Name            :   #{itemData.kiteName}

+
Kite Key             :   #{itemData.key}

+

+                  """
+
+  deleteKite:(listItem)->
+    data = listItem.getData()
+    KD.remote.api.JKite.get
+      id   : data.id
+      (err, kite) =>
+        if err
+          @notify err.message, "fail"
+        else
+          if kite?
+            kite.delete (err, success)=>
+              if err == null
+                @notify 'Your kite is deleted', "success"
+          else
+            @notify 'Kite is not found', "fail"
+
+  updateKite:(listItem, formData)->
+    throw new Error 'not implemented yet!'
+    @emit "KiteUpdated", kite
+
+  createKite : (form)->
+    data = form.getData()
+    KD.remote.api.JKite.create
+      appName   : data.kiteAppName
+      kiteName  : data.kiteName
+      count     : data.kiteCallLimit
+      (err, kite) =>
+        if err
+          @notify err.message, "fail"
+        else
+          @notify 'Your kite is created', "success"
+          @emit "KiteCreated", kite
+          form.parent.destroy()
+
+  notify:(title, type)->
+    {modal} = @getListView()
+    new KDNotificationView
+      type      : "mini"
+      cssClass  : "#{type}"
+      title     : "
#{title}
"
+      duration  : 3000
+
+
+class AccountKiteList extends KDListView
+
+  constructor:(options,data)->
+    options = $.extend
+      tagName   : "ul"
+      itemClass : AccountKiteListItem
+    ,options
+    super options,data
+
+  showModal:->
+    form = new AccountAddKiteForm
+      callback : @formSubmit
+      cssClass : "clearfix"
+
+    modal = new KDModalView
+      title     : "Add a new kite"
+      content   : ""
+      overlay   : yes
+      cssClass  : "kite-kdmodal"
+      width     : 500
+      height    : 233
+      view      : form
+      buttons   :
+        "Create New Kite" :
+          style     : "modal-clean-gray"
+          callback  : => @emit "CreateKiteSubmitted", form
+        Cancel   :
+          style     : "modal-cancel"
+          callback  : (event)->
+            form.destroy()
+            modal.destroy()
+
+class AccountAddKiteForm extends KDFormView
+  viewAppended:->
+    super
+    @addSubView kiteAppNameView  = new KDView
+      cssClass : "modalformline"
+    kiteAppNameView.addSubView kiteAppName  = new KDInputView name : "kiteAppName", placeholder : "Your app name..."
+
+    @addSubView kiteNameView  = new KDView
+      cssClass : "modalformline"
+    kiteNameView.addSubView kiteName  = new KDInputView name : "kiteName", placeholder : "Kite name..."
+
+    @addSubView kiteApiCallLimitView  = new KDView
+      cssClass : "modalformline"
+    kiteApiCallLimitView.addSubView kiteApiCallLimit = new KDInputView name : "kiteCallLimit", placeholder : "Kite Api Call limit..."
+
+
+class AccountKiteListItem extends KDListItemView
+  constructor:(options,@data)->
+    options = tagName : "li"
+    options.cssClass = "kite-list-item"
+    super options,data
+
+  # viewAppended:()->
+  #   super
+  #   @addSubView editLink = new KDCustomHTMLView
+  #     tagName      : "a"
+  #     partial      : "Delete This Kite"
+  #     cssClass     : "action-link"
+
+  # click:(event)->
+  #   @emit "DeleteKiteSubmitted", @
+
+  partial:(data)->
+    """
+

+        #{data._id}
+        #{data.appName}
+        #{data.kiteName}
+        #{data.key}
+

+    """


Add array merging code (to be used with offline sync and task sorting conflicts)

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

--- app/merge.coffee
+++ app/merge.coffee
@@ -0,0 +1,64 @@
+# Merge Array Order with Timestamps
+
+ArrayDiff = (a, b) ->
+  a.filter (i) ->
+    not (b.indexOf(i) > -1)
+
+merge = (client, server) ->
+  # client and server are objects with time and order
+
+  # Find diff
+  serverDiff = ArrayDiff server.order, client.order
+  clientDiff = ArrayDiff client.order, server.order
+
+  # Check if only order has been changed
+  sameKeys = not serverDiff.length and not clientDiff.length
+
+  # Only order has been changed
+  if sameKeys
+
+    # Use newer timestamp
+    if client.time > server.time
+      console.log "List order: Same keys so going with latest version - Client"
+      return [client.order, client.time]
+
+    else
+      console.log "List order: Same keys so going with latest version - Server"
+      return [server.order, server.time]
+
+  # Use algorithm if keys are different
+  else
+
+    # Crazy merging code
+    console.log "List order: Merging with algorithm"
+
+    # Remove all keys that aren't in the server
+    client.order = ArrayDiff(client.order, cD)
+
+    for i in [0..serverDiff.length] by 1
+
+      # Get the index of each key in the ServerDiff
+      index = server.order.indexOf(serverDiff[i])
+
+      # Inject the key into the client
+      client.order.splice index, 0, serverDiff[i]
+
+    return [client.order, client.time]
+
+module.exports = merge
+
+###
+# Merge Task Order (Uses same algorithm)
+for list of client.lists.items
+  if not server.lists.items[list].hasOwnProperty("deleted") and not client.lists.items[list].hasOwnProperty("deleted")
+    mlo.client =
+      order: client.lists.items[list].order
+      time: client.lists.items[list].time.order
+
+    mlo.server =
+      order: server.lists.items[list].order
+      time: server.lists.items[list].time.order
+
+    mlo.result = mlo.run(mlo.client, mlo.server)
+    server.lists.items[list].order = mlo.result[0]
+    server.lists.items[list].time.order = mlo.result[1]


Remove stray logging

Remove stray logging

--- src/pane.coffee
+++ src/pane.coffee
@@ -502,7 +502,6 @@
     newItemPath = atom.showSaveDialogSync(itemPath)
     if newItemPath
       try
-        console.log 'here?'
         item.saveAs(newItemPath)
       catch error
         @handleSaveError(error)


Add tests for -v and --version

Add tests for -v and --version

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

--- test/cli/version.coffee
+++ test/cli/version.coffee
@@ -0,0 +1,16 @@
+exec = require('child_process').exec
+path = require 'path'
+
+packageVersion = require(path.join __dirname, '..', '..', 'package.json').version
+
+describe 'brave-mouse (CLI)', ->
+	describe 'version option', ->
+		it 'should output brave-mouse’s version when called with -v', (done) ->
+			exec bin + ' -v', (error, stdout, stderr) ->
+				stdout.should.include 'v' + packageVersion
+				done()
+
+		it 'should output brave-mouse’s version when called with --version', (done) ->
+			exec bin + ' --version', (error, stdout, stderr) ->
+				stdout.should.include 'v' + packageVersion
+				done()


letter grade regex matching

letter grade regex matching

--- app/assets/javascripts/angular/services/GradeSchemeElementsService.js.coffee
+++ app/assets/javascripts/angular/services/GradeSchemeElementsService.js.coffee
@@ -29,18 +29,18 @@
           key: 'letter',
           templateOptions: {
             label: 'Letter',
-            maxlength: 3,
-            minlength: 2,
+            maxlength: 2,
+            minlength: 1,
             placeholder: ''
           }
-          # validators: {
-            # ipAddress: {
-              # expression: (viewValue, modelValue) ->
-              #   value = modelValue || viewValue;
-              #   '/(\d{1,3}\.){3}\d{1,3}/'.test(value)
-              # message: '$viewValue + " is not a valid IP Address"'
-            # }
-          # },
+          validators: {
+            input: {
+              expression: (viewValue, modelValue) ->
+                value = modelValue || viewValue;
+                /^(?:A-?|[BCDEF][+-]?)$/.test(value)
+              message: '$viewValue + " is not a letter grade"'
+            }
+          },
           # modelOptions: {
           #   debounce: {
           #     blur: 0


Add gruntfile

Add gruntfile

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

--- gruntfile.coffee
+++ gruntfile.coffee
@@ -0,0 +1,42 @@
+module.exports = (grunt) ->
+  grunt.loadNpmTasks 'grunt-metalsmith'
+  grunt.loadNpmTasks 'grunt-bowercopy'
+  grunt.loadNpmTasks 'grunt-contrib-clean'
+  grunt.loadNpmTasks 'grunt-image-resize'
+  grunt.loadNpmTasks 'grunt-gh-pages'
+
+  grunt.initConfig
+    'gh-pages':
+      options:
+        base: 'build'
+      src: ['**']
+    metalsmith:
+      staticSite:
+        options:
+          metadata:
+            title: 'Canvas playground'
+            description: 'Canvas playground'
+          plugins:
+            'metalsmith-markdown': {}
+            'metalsmith-stylus':
+              nib: true
+            'metalsmith-templates':
+              engine: 'jade'
+              directory: 'templates'
+            'metalsmith-coffee': {}
+        src: 'src'
+        dest: 'build'
+    bowercopy:
+      all:
+        files:
+          'build/style/normalize.css': 'normalize-css/normalize.css'
+          'build/style/font-awesome.css': 'font-awesome/css/font-awesome.css'
+          'build/fonts': 'font-awesome/fonts'
+          'build/lib/jquery.js': 'jquery/dist/jquery.js'
+          'build/lib/ace.js': 'ace-builds/src/ace.js'
+          'build/lib/mode-javascript.js': 'ace-builds/src/mode-javascript.js'
+          'build/lib/theme-github.js': 'ace-builds/src/theme-github.js'
+          'build/lib/worker-javascript.js': 'ace-builds/src/worker-javascript.js'
+
+  grunt.registerTask 'default', ['metalsmith', 'bowercopy']
+  grunt.registerTask 'deploy', ['default', 'gh-pages']


Get tag removal to work too! Thank goodness for "nested" event binding in thorax.

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/lmjohns3/thorax-media.git/'


Only allow delete while editing an item.


Make moving around in vmode easier

Make moving around in vmode easier

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


clio-27373 Fix

clio-27373 Fix

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/seanhealy/lib-themisui.git/'


Remove .coffee extension for code consistency

--- scripts/transpile.coffee
+++ scripts/transpile.coffee
@@ -6,8 +6,8 @@
 async = require 'async'

 serverSetup = require '../server_setup'
-Level = require '../server/levels/Level.coffee'
-LevelSession = require '../server/levels/sessions/LevelSession.coffee'
+Level = require '../server/levels/Level'
+LevelSession = require '../server/levels/sessions/LevelSession'

 Aether.addGlobal 'Vector', require '../app/lib/world/vector'
 Aether.addGlobal '_', _
@@ -83,4 +83,4 @@
       throw err if err

 serverSetup.connectToDatabase()
-transpileLadderSessions()+transpileLadderSessions()


Changing the origin

Changing the origin

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/lithiumtech/karma-threshold-reporter.git/'


Fix off by one issue in pagination

Fix off by one issue in pagination

--- components/commercial_filter/filters/paginator/paginator_view.coffee
+++ components/commercial_filter/filters/paginator/paginator_view.coffee
@@ -21,7 +21,7 @@
     @params.set page: $(e.currentTarget).data('value')

   totalPages: ->
-    calculated = Math.floor(@filter.get('total') / @params.get('size'))
+    calculated = Math.ceil(@filter.get('total') / @params.get('size'))
     total = Math.min calculated, @maxPage

   render: ->


fixing spacing on edit view scaffold. closes #130

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/ipmobiletech/backbone-rails.git/'


remove param not nedeed

remove param not nedeed

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


Teste de exemplo

Teste de exemplo

error: pathspec 'wrapper/src/app/features/home/specs/controller.spec.coffee' did not match any file(s) known to git

--- wrapper/src/app/features/home/specs/controller.spec.coffee
+++ wrapper/src/app/features/home/specs/controller.spec.coffee
@@ -0,0 +1,6 @@
+
+describe 'Teste', ->
+
+  it 'testando', ->
+    expect(true).toEqual true
+


add example cjsx file

add example cjsx file

error: pathspec 'samples/CoffeeScript/example.cjsx' did not match any file(s) known to git

--- samples/CoffeeScript/example.cjsx
+++ samples/CoffeeScript/example.cjsx
@@ -0,0 +1,40 @@
+###* @cjsx React.DOM ###
+define 'myProject.myComponent', [
+  'React'
+  'myProject.ExampleStore'
+  'myProject.ExampleActions'
+  'myProject.ReactExampleTable'
+], (React, ExampleStore, ExampleActions, ReactExampleTable ) ->
+
+  ReactListDetail = React.createClass
+    mixins: [ListenMixin]
+
+    getInitialState: ->
+      rows: ExampleStore.getRows()
+      meta: ExampleStore.getMeta()
+
+    componentWillMount: ->
+      @listenTo ExampleStore
+
+    componentDidMount: ->
+      ExampleActions.getExampleData()
+
+    onStoreChange: ->
+      if this.isMounted()
+        @setState
+          rows: ExampleStore.getRows()
+          meta: ExampleStore.getMeta()
+
+    componentWillUnmount: ->
+      @stopListening ExampleStore
+
+    render: ->
+      <div className="page-wrap">
+          <header>
+            <strong> {@state.title} </strong>
+          <header>
+            <ReactExampleTable
+              rows={@state.rows},
+              meta={@state.meta}
+            />
+      </div>