first actual code commit

first actual code commit

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

--- fizzylogo.coffee
+++ fizzylogo.coffee
@@ -0,0 +1,737 @@
+# We code the runtime ONLY in terms of JS/coffeescript classes/code.
+# We don't mimic runtime-created classes/objects with JS/coffee classes/objects,
+# we just model the runtime here i.e. the "ground" mechanisms,
+# i.e. what can't be really changed
+# from the system itself. Stuff like the matching of messages with
+# "method patterns",
+# the primitive classes and objects, what the context is and
+# how it works, how the scoping works, looking up the value
+# of an atom from the correct place, etc.
+
+class RosettaObjects
+  rosettaClass: null # the class it belongs to
+  instanceVariablesDict: null # a JS dictionary
+
+  constructor: ->
+    #console.log " instanceVariablesDict initiated "
+    @instanceVariablesDict = {}
+
+class RosettaPrimitiveObjects extends RosettaObjects
+
+class RosettaContext
+  self: null # a RosettaObject
+  programCounter: 0 # an integer
+  message: null # a RosettaMessage, which is an RList and a cursor
+  tempVariablesDict: null # a JS dictionary
+  previousContext: null
+  returned: null
+
+  constructor: (@previousContext, @self, @message) ->
+    @tempVariablesDict = {}
+
+  lookUpAtomValuePlace: (theAtom) ->
+    # we first look in this context, and then we go up
+    # context by context until we reach the top without
+    # having found anything.
+
+    # so, for each context,
+    #   first, check the temporaries
+    #     if the class lists the atom in the temporaties
+    #       then the value resides in the context itself
+    #   then the instance variables
+    #     if the class lists the atom in the intance variables
+    #       then the value resides in the self object
+    #   then the class variables.
+    #     if the class lists the atom in the class variables
+    #       then the value resides in the class
+    # We always return a rosetta object (or a rosetta class
+    # , which is also a rosetta object)
+
+    # check the temporaries
+    contextBeingSearched = @
+    atomValue = theAtom.value
+
+    if atomValue == "self"
+      return @
+
+    while contextBeingSearched?
+
+      console.log "evaluation " + indentation() + "looking in class: " + contextBeingSearched.self.rosettaClass
+      console.dir contextBeingSearched.self.rosettaClass
+
+      temps = contextBeingSearched.self.rosettaClass.tempVariables
+      if temps?
+        console.log "evaluation " + indentation() + "lookup: checking in " + temps.value
+        if (temps.value.find (element) -> element.value == atomValue)
+          console.log "evaluation " + indentation() + "lookup: found " + atomValue + " in tempVariables"
+          return contextBeingSearched.tempVariablesDict
+
+      instances = contextBeingSearched.self.rosettaClass.instanceVariables
+      if instances?
+        console.log "evaluation " + indentation() + "lookup: checking in " + instances.value
+        if (instances.value.find (element) -> element.value == atomValue)
+          console.log "evaluation " + indentation() + "lookup: found " + atomValue + " in instanceVariables"
+          return contextBeingSearched.self.instanceVariablesDict
+
+      statics = contextBeingSearched.self.rosettaClass.classVariables
+      if statics?
+        console.log "evaluation " + indentation() + "lookup: checking in " + statics.value
+        if (statics.value.find (element) -> element.value == atomValue)
+          console.log "evaluation " + indentation() + "lookup: found " + atomValue + " in classVariables"
+          return contextBeingSearched.self.rosettaClass.classVariablesDict
+
+      # nothing found from this context, move up
+      # to the sender (i.e. the callee)
+      console.log "evaluation " + indentation() + "lookup: not found in this context, going up "
+      contextBeingSearched = contextBeingSearched.previousContext
+
+    console.log "evaluation " + indentation() + "lookup: " + atomValue + " not found!"
+
+  lookUpAtomValue: (theAtom) ->
+    # we first look _where_ the value of the Atom is,
+    # then we fetch it
+
+    dictWhereValueIs = @lookUpAtomValuePlace theAtom
+    console.log "evaluation " + indentation() + "lookup: " + theAtom.value + " found dictionary and it contains:"
+    console.dir dictWhereValueIs
+    return dictWhereValueIs[theAtom.value]
+
+
+rosettaContexts = []
+
+
+class RosettaClasses extends RosettaObjects
+  name: null #a RosettaString
+  msgPatterns: null # an array of RosettaLists
+  methodBodies: null # an array of RosettaLists
+
+  classVariables: null # a RosettaList
+  instanceVariables: null # a RosettaList
+  tempVariables: null # a RosettaList
+
+  classVariablesDict: null # a JS dictionary
+
+  constructor: ->
+    @classVariablesDict = {}
+    @msgPatterns = []
+    @methodBodies = []
+
+
+# implementation of these is not changeable
+# and not inspectable. "Below the surface" native
+# implementations here.
+class RosettaPrimitiveClasses extends RosettaClasses
+
+class RosettaNonPrimitiveClasses extends RosettaClasses
+
+# the root of everything
+rosettaClass = new RosettaPrimitiveClasses()
+rosettaClass.rosettaClass = rosettaClass
+
+class RosettaAnonymousClass extends RosettaPrimitiveClasses
+
+
+skipNextMessageElement = (message, theContext) ->
+  message = message.restOfMessage()
+  theContext.programCounter++
+  return message
+
+evalFirstMessageElement = (message, theContext) ->
+  firstElement = message.firstElement()
+  console.log "           " + indentation() + "evaling element " + firstElement.value
+  [evaledFirstElement, unused] = rosettaEval firstElement, theContext
+  restOfMessage = skipNextMessageElement message, theContext
+  return [evaledFirstElement, restOfMessage]
+
+messageSend = (object, message, theContext) ->
+  # so, we need to keep the program counter unchanged here,
+  # because otherwise we add the consumption of the method BODY
+  # which we don't want. From the caller's perspective, we
+  # just consume from the method invocation, i.e. we just consume
+  # while we matched the correct method, which we account for
+  # when we do the matching, not here after the matching happened.
+
+  newContext = new RosettaContext theContext, object, message
+  rosettaContexts.push newContext
+  rosettaEval message, newContext
+  rosettaContexts.pop()
+  message = message.advanceMessageBy newContext.programCounter
+  return [newContext, message]
+
+
+
+# Note that only part of the message might be consumed
+progressWithMessage = (object, message, theContext, theSelf) ->
+
+  if !theSelf?
+    theSelf = theContext.self
+
+  newContext = new RosettaContext theContext, theSelf, message
+  rosettaContexts.push newContext
+  object.evalMessage newContext
+  rosettaContexts.pop()
+  theContext.programCounter += newContext.programCounter
+  message = message.advanceMessageBy newContext.programCounter
+  return [newContext, message]
+
+# You eval things just by sending them the empty message.
+# Note that if you invoke this on a list, the whole list is evaluated.
+rosettaEval = (message, theContext) ->
+  console.log "           " + indentation() + "messageList " + message.print()
+  [newContext, message] = progressWithMessage message, emptyMessage(), theContext
+  return [newContext.returned, message]
+
+class RosettaAtomClass extends RosettaPrimitiveClasses
+  createNew: (theAtomName) ->
+    toBeReturned = new RosettaPrimitiveObjects()
+    toBeReturned.value = theAtomName
+    toBeReturned.rosettaClass = RAtom
+
+    toBeReturned.print = ->
+      return @value
+
+    toBeReturned.evalMessage = (theContext) ->
+      message = theContext.message
+      console.log "evaluation " + indentation() + "messaging atom " + theAtomName + " with " + message.print()
+
+      if message.isEmpty()
+        theContext.returned = theContext.lookUpAtomValue @
+        console.log "evaluation " + indentation() + "atom " + theAtomName + " contents: " + theContext.returned.value
+
+      else if message.firstElement().value == "<-"
+        console.log "evaluation " + indentation() + "assignment to atom " + theAtomName
+
+        # skip the <- symbol
+        message = skipNextMessageElement message, theContext
+
+        # now evaluate the rest of the list
+        # now we are using the message as a list because we have to evaluate it.
+        # to evaluate it, we treat it as a list and we send it the empty message
+        [theValue, unusedRestOfMessage] = rosettaEval message, theContext
+        theContext.returned = theValue
+
+        console.log "evaluation " + indentation() + "value to assign: " + theValue.value
+
+        dictToPutAtomIn = theContext.lookUpAtomValuePlace @
+        dictToPutAtomIn[theAtomName] = theValue
+
+        console.log "evaluation " + indentation() + "stored value in dictionary"
+
+
+
+    return toBeReturned
+
+RAtom = new RosettaAtomClass() # ...
+
+
+class RosettaListPrimitiveClass extends RosettaPrimitiveClasses
+
+
+  # A note about messages, which are special lists.
+  # ...a rosetta message is just an RList which is meant to
+  # be used as a message only, which means that:
+  #    - its elements don't change
+  #    - it can be split ( "." splits statements)
+  #    - we can "consume" one or more elements
+  #    - we don't need messages to be rosetta objects,
+  #      they are part of the runtime and invisible to
+  #      the user.
+  #    - a message is never sent a message, because
+  #      a message is not a rosetta object
+  # so we try to make some of these operations more efficient
+  # for messages, since all operations don't modify the elements
+  # we can do splits and we can consume things just by moving
+  # around a start index and an end index of an unchanging
+  # array of elements.
+  # The alternative would be to use no indexes and just
+  # do shallow copies around. That would be fine for performance
+  # but there is just something about the constant shallow copying
+  # during interpretation that looks like it's a quadratic
+  # operation, so we say no to that.
+
+  createNew: ->
+    toBeReturned = new RosettaPrimitiveObjects()
+    toBeReturned.value = []
+    toBeReturned.rosettaClass = RList
+
+    # these are only used for messages, which
+    # are special kinds of lists
+    toBeReturned.cursorStart = 0
+    toBeReturned.cursorEnd = -1
+    toBeReturned.isFromMessage = false
+
+    # nothing much to do, but it makes it more
+    # clear in the code to show "how"
+    # one is using the message/list
+    toBeReturned.toList = ->
+      @
+
+    # nothing much to do, but it makes it more
+    # clear in the code to show "how"
+    # one is using the message/list
+    toBeReturned.toMessage = ->
+      @isFromMessage = true
+      @
+
+    toBeReturned.push = (theItemToPush) ->
+      if @isFromMessage
+        throw "RList deriving from a message should never be modified"
+      @value.push theItemToPush
+      @cursorEnd++
+
+    toBeReturned.elementAt = (theElementNumber) ->
+      @value[@cursorStart + theElementNumber]
+
+    toBeReturned.print = ->
+      #console.log "@value:" + @value
+      if @length() == 0
+        return "empty message"
+      toBePrinted = "( "
+      for i in [0...@length()]
+        #console.log "@value element " + i + " : " + @value[i]
+        #console.log "@value element " + i + " content: " + @value[i].value
+        toBePrinted += " " + @elementAt(i).print()
+      toBePrinted += " )"
+      return toBePrinted
+
+    # the first receiver is optional
+    toBeReturned.evalMessage = (theContext) ->
+      message = theContext.message
+      console.log "evaluation " + indentation() + "messaging list with " + message.print()
+
+      if message.isEmpty()
+        # a list without any messages just evaluates itself, which
+        # consists of the following:
+        #  a) separate all the statements (parts separated by ".")
+        #  b) for each statement, evaluate its first element as the receiver
+        #  c) send to the receiver the remaining part of the statement, as the message
+
+        console.log "evaluation " + indentation() + "list received empty message, evaluating content of list"
+        console.log "evaluation " + indentation() + "  i.e. " + @print()
+
+        @isFromMessage = true
+
+        statements = @separateStatements()
+
+        for eachStatement in statements
+
+          list = eachStatement.toList()
+
+          console.log "evaluation " + indentation() + "evaluating single statement"
+          console.log "evaluation " + indentation() + "  i.e. " + list.print()
+
+          [receiver, restOfMessage] = evalFirstMessageElement list, theContext
+
+          console.log "evaluation " + indentation() + "remaining part of list to be sent as message is: " + restOfMessage.print()
+
+          # now that we have the receiver, we send it the rest of the original message
+          until restOfMessage.isEmpty()
+
+            console.log "evaluation " + indentation() + "receiver: " + receiver.value
+            console.log "evaluation " + indentation() + "message: " + restOfMessage.print()
+
+            # now actually send the message to the receiver. Note that
+            # only part of the message might be consumed, this is why
+            # we have to keep iterating until the whole message is consumed
+            [newContext, restOfMessage] = progressWithMessage receiver, restOfMessage, theContext, theContext.self
+            receiver = newContext.returned
+
+            rosettaContexts.pop()
+            console.log "evaluation " + indentation() + "list evaluation returned: " + receiver?.value
+
+
+
+          console.log "evaluation " + indentation() + "list: nothing more to evaluate"
+          theContext.returned = receiver
+          rosettaContexts.pop()
+
+    toBeReturned.length = ->
+      return @cursorEnd - @cursorStart + 1
+
+    toBeReturned.restOfMessage = ->
+      copy = @copy()
+      copy.cursorStart++
+      return copy
+
+    toBeReturned.firstElement =  ->
+      if @cursorStart > @cursorEnd
+        throw "no first element, array is empty"
+      return @elementAt 0
+
+    # returns the first element and returns
+    # a copy of the rest of the message
+    toBeReturned.nextElement = ->
+      [@firstElement(), @restOfMessage()]
+
+    toBeReturned.advanceMessageBy = (numberOfElements) ->
+
+      if numberOfElements > @length()
+        return emptyMessage()
+
+      copy = @copy()
+      copy.cursorStart += numberOfElements
+      return copy
+
+    toBeReturned.isEmpty = ->
+      return @length() == 0
+
+    toBeReturned.copy = ->
+      copy = RList.createNew()
+      copy.value = @value
+      copy.cursorStart = @cursorStart
+      copy.cursorEnd = @cursorEnd
+      copy.isFromMessage = @isFromMessage
+      return copy
+
+    toBeReturned.separateStatements = ->
+      console.log "evaluation " + indentation() + "separating statements   start "
+      arrayOfStatements = []
+      lastStatementEnd = @cursorStart - 1
+      for i in [@cursorStart..@cursorEnd]
+        console.log "evaluation " + indentation() + "separating statements   examining element " + @value[i].print()
+        if (@value[i] == RStatementSeparatorSymbol) or (i == @cursorEnd)
+          statementToBeAdded = @copy()
+          statementToBeAdded.cursorStart = lastStatementEnd + 1
+          statementToBeAdded.cursorEnd = i - 1
+          if (i == @cursorEnd) then statementToBeAdded.cursorEnd++
+          lastStatementEnd = i
+          arrayOfStatements.push statementToBeAdded
+          console.log "evaluation " + indentation() + "separating statements isolated new statement " + statementToBeAdded.print()
+
+
+      return arrayOfStatements
+
+
+
+    return toBeReturned
+
+
+RList = new RosettaListPrimitiveClass()
+
+isEvaluatingParam = (element) ->
+  element.length() == 1
+
+getParamAtom = (element) ->
+  if isEvaluatingParam(element)
+    return element.elementAt(0)
+  else
+    return element.elementAt(1)
+
+class RosettaNumberPrimitiveClass extends RosettaPrimitiveClasses
+  createNew: (value) ->
+    toBeReturned = new RosettaPrimitiveObjects()
+    toBeReturned.value = parseFloat(value)
+    toBeReturned.rosettaClass = RNumber
+
+    toBeReturned.print = ->
+      return @value
+
+    toBeReturned.matchMethodAndPassParams = (theContext, methodInvocationToBeChecked) ->
+      console.log "evaluation " + indentation() + "  !!! looking up method invocation " + methodInvocationToBeChecked.print() + " with signatures!" + " PC: " + theContext.programCounter
+      console.log "evaluation " + indentation() + "  !!! looking up method invocation, is method empty? " + methodInvocationToBeChecked.isEmpty() + " PC: " + theContext.programCounter
+
+      # as we check the matches of the invocation with the
+      # signature, we might need to roll back the program
+      # counter, which is what keeps tab of how much of the
+      # message (in the context) we consume.
+      # so let's remember the original value here
+      originalProgramCounter = theContext.programCounter
+
+      countSignaturePosition = -1
+      for eachSignature in @rosettaClass.msgPatterns
+        console.log "evaluation " + indentation() + "  matching - checking if this signature matches: " + eachSignature.print() + " PC: " + theContext.programCounter
+        method = methodInvocationToBeChecked
+        countSignaturePosition++
+
+        # as we might have failed a match of a signature, we need to restore
+        # the program counter so we keep the correct tab of how much
+        # of the message (in the context) we consume.
+        theContext.programCounter = originalProgramCounter
+
+        console.log "evaluation " + indentation() + "  matching - checking if signature matches this invocation " + method.print() + " PC: " + theContext.programCounter
+
+        soFarEverythingMatched = true
+        originalMethodStart = method.cursorStart
+        until eachSignature.isEmpty() or method.isEmpty()
+          [eachElementOfSignature, eachSignature] = eachSignature.nextElement()
+          [eachElementOfInvocation, method] = method.nextElement()
+
+          console.log "evaluation " + indentation() + "  matching - found: " + eachElementOfSignature.print() + " is list: " + (eachElementOfSignature.rosettaClass == RAtom) + " PC: " + theContext.programCounter
+
+          # the element of a signature can only be of two kinds:
+          # an atom or an RList containing one parameter (with
+          # prepended "@" in case the parameter doesn't require
+          # evaluation)
+          if eachElementOfSignature.rosettaClass == RAtom
+            # if the signature contains an atom, the message
+            # must contain the same atom, otherwise we don't
+            # have a match.
+            if eachElementOfInvocation.rosettaClass == RAtom
+              # ok at least the message contains an atom, but
+              # now we have to check that they spell the same
+              if eachElementOfSignature.value == eachElementOfInvocation.value
+                console.log "evaluation " + indentation() + "  matching - atom matched: " + eachElementOfSignature.print() + " PC: " + theContext.programCounter
+                # OK good match of atomsr,
+                # check the next token in the signature
+                continue
+              else
+                # no match between the atoms, check next signature
+                soFarEverythingMatched = false
+                break
+            else
+              # the signature sais "atom" but the message contains
+              # something else: no match, check the next
+              # signature
+              console.log "evaluation " + indentation() + "  matching - no match: " + eachElementOfSignature.print() + " vs. " + eachElementOfInvocation.print() + " PC: " + theContext.programCounter
+              # this signature doesn't match check the next one
+              soFarEverythingMatched = false
+              break
+          else
+            # the signature has a param. we have to check if
+            # it requires an evaluation or not
+            console.log "evaluation " + indentation() + "  matching - getting the atom inside the parameter: " + eachElementOfSignature.print() + " PC: " + theContext.programCounter
+            paramAtom = getParamAtom(eachElementOfSignature)
+            console.dir paramAtom
+            console.log "evaluation " + indentation() + "  matching - atom inside the parameter: " + paramAtom.print() + " PC: " + theContext.programCounter
+            if isEvaluatingParam(eachElementOfSignature)
+              console.log "evaluation " + indentation() + "  matching - need to evaluate next msg element from: " + method.print() + " and bind to: " + paramAtom.print() + " PC: " + theContext.programCounter
+              [valueToBeBound, method] = evalFirstMessageElement method, theContext
+            else
+              console.log "evaluation " + indentation() + "  matching - need to get next msg element from: " + method.print() + " and bind to: " + paramAtom.print() + " PC: " + theContext.programCounter
+              [valueToBeBound, method] = method.nextElement()
+            # TODO we should insert without repetition
+            theContext.self.rosettaClass.tempVariables.push paramAtom
+            theContext.tempVariablesDict[paramAtom.value] = valueToBeBound
+            # ok let's keep matching further parts of the signature
+            continue
+
+        # ok either the signature or the invocation are completely consumed
+        if eachSignature.isEmpty() and soFarEverythingMatched
+          console.log "evaluation " + indentation() + "  matching - found a matching signature: " + eachSignature.print() + " PC: " + theContext.programCounter
+          # we have a matching signature!
+          methodBody = @rosettaClass.methodBodies[countSignaturePosition]
+
+          # now, the correct PC that we need to report is
+          # the original plus what we consumed from matching the
+          # signature.
+          theContext.programCounter += method.cursorStart - originalMethodStart
+
+          # note that this doesn't change the program counter,
+          # because we don't care here what we consume from the body
+          # execution, from the caller perspective it only matters
+          # what we consume from the invocation, which we accounted
+          # for just above.
+          [newContext, restOfMessage] = messageSend @, methodBody, theContext
+
+
+          theContext.returned =  newContext.returned
+          return theContext.returned
+
+      # we are still here trying to match but
+      # there are no signatures left, time to quit.
+      # fix the program counter first!
+      console.log "evaluation " + indentation() + "  matching - no match found" + " PC: " + theContext.programCounter
+      theContext.programCounter = originalProgramCounter
+      return null
+
+
+
+
+    toBeReturned.evalMessage = (theContext) ->
+      message = theContext.message
+      console.log "evaluation " + indentation() + "messaging number " + @value + " with " + message.print()
+
+      console.log "evaluation " + indentation() + "before matching game the message is: " + message.print() + " and PC: " + theContext.programCounter
+      returned = @matchMethodAndPassParams(theContext, message)
+      console.log "evaluation " + indentation() + "after matching game the message is: " + message.print() + " and PC: " + theContext.programCounter
+
+      if returned?
+        # "matchMethodAndPassParams" has already done the job of
+        # making the call and fixing theContext's PC and
+        # updating the return value, we are done here
+        return
+
+      if !message.isEmpty()
+        if message.firstElement().value == "print"
+          console.log "evaluation " + indentation() + " RNumber about to print, message: " + message.print() + " and PC: " + theContext.programCounter
+
+          console.log "///////// program printout: " + @value
+
+          message = skipNextMessageElement message, theContext
+
+          theContext.returned = @
+          rosettaContexts.pop()
+          return
+        else if message.firstElement().value == "plus"
+
+          # skip the plus symbol
+          message = skipNextMessageElement message, theContext
+
+
+          # now evaluate the rest of the list
+          # now we are using the message as a list because we have to evaluate it.
+          # to evaluate it, we treat it as a list and we send it the empty message
+          [theValue, unusedRestOfMessage] = rosettaEval message, theContext
+
+          @value += theValue.value
+          theContext.returned = @
+          return
+
+
+      if !message.isEmpty()
+        console.log "evaluation " + indentation() + "this message to number should be empty? " + message.print()
+      theContext.returned = @
+      rosettaContexts.pop()
+
+    return toBeReturned
+
+
+
+class RosettaSymbolClass extends RosettaAnonymousClass
+  createNew: (value) ->
+    toBeReturned = new RosettaPrimitiveObjects()
+    toBeReturned.value = value
+    toBeReturned.rosettaClass = RSymbol
+
+    toBeReturned.print = ->
+      return @value
+
+    return toBeReturned
+
+RSymbol = new RosettaSymbolClass() # this is a class, an anonymous class
+
+
+# there is nothing special what all symbols do,
+# so we just have them to be part of the anonymous class
+# Literals are things that don't have value, just
+# some sort of role.
+
+RLiteralSymbol = RSymbol.createNew "@"
+# the signature is: @ (@x), so this consumes only one token
+# example: @x returns the Atom X
+RLiteralSymbol.evalMessage = (theContext) ->
+    message = theContext.message
+    console.log "evaluation " + indentation() + "messaging literal symbol with " + message.print()
+
+    if message.isEmpty()
+      theContext.returned = @
+    else
+      theContext.returned = message.firstElement()
+      message = skipNextMessageElement message, theContext
+
+    console.log "evaluation " + indentation() + "literal symbol evaluation returning " + theContext.returned.value
+
+    rosettaContexts.pop()
+
+
+RNewSymbol = RSymbol.createNew "new"
+RAssignmentSymbol = RSymbol.createNew "<-"
+RStatementSeparatorSymbol = RSymbol.createNew "."
+
+
+indentation = ->
+  return " ".repeat(rosettaContexts.length * 2)
+
+rosettaParse = (command) ->
+  listsStack = []
+  outerList = RList.createNew()
+  listsStack.push outerList
+  currentList = outerList
+
+  simpleTokenization = command.split(" ")
+  for eachToken in simpleTokenization
+    console.log "eachToken: " + eachToken
+    if /[a-zA-Z]+/.test(eachToken)
+      console.log eachToken + " is an Atom"
+      currentList.push (RAtom.createNew eachToken)
+    else if /@/.test(eachToken)
+      console.log eachToken + " is @ symbol"
+      currentList.push RLiteralSymbol
+    else if /\./.test(eachToken)
+      console.log eachToken + " is . symbol"
+      currentList.push RStatementSeparatorSymbol
+    else if /<-/.test(eachToken)
+      console.log eachToken + " is <- symbol"
+      currentList.push RAssignmentSymbol
+    else if /\d+/.test(eachToken)
+      console.log eachToken + " is a Number"
+      currentList.push (RNumber.createNew eachToken)
+    else if /\(/.test(eachToken)
+      nestedList = RList.createNew()
+      currentList.push nestedList
+      listsStack.push currentList
+      currentList = nestedList
+    else if /\)/.test(eachToken)
+      currentList = listsStack.pop()
+  return outerList
+
+emptyMessage = ->
+  newMessage = RList.createNew()
+  newMessage.isFromMessage = true
+  return newMessage
+
+RNumber = new RosettaNumberPrimitiveClass()
+RNumber.msgPatterns.push rosettaParse "anotherPrint"
+RNumber.methodBodies.push rosettaParse "self print"
+
+RNumber.msgPatterns.push rosettaParse "doublePrint"
+RNumber.methodBodies.push rosettaParse "self print print"
+
+RNumber.msgPatterns.push rosettaParse "increment"
+RNumber.methodBodies.push rosettaParse "@ self <- self plus 1"
+
+RNumber.msgPatterns.push rosettaParse "something ( param )"
+RNumber.msgPatterns.push rosettaParse "somethingElse ( @ param )"
+
+
+#parsed = rosettaParse "@ a <- 5 . a increment . @ a <- a plus 1 . a print"
+#parsed = rosettaParse "@ a <- 5 . @ a <- a plus 1 . a increment print"
+#parsed = rosettaParse "@ a <- 5 plus 1 . a increment print"
+#parsed = rosettaParse "@ a <- ( 5 plus 1 ) . a increment print"
+#parsed = rosettaParse "@ a <- ( 4 plus 1 plus 1 ) . a increment print"
+#parsed = rosettaParse "@ a <- ( 4 plus ( 1 plus 1 ) ) . a increment print"
+#parsed = rosettaParse "@ a <- ( ( 4 plus 1 ) plus ( 0 plus 1 ) ) . a increment print"
+#parsed = rosettaParse "7 anotherPrint"
+#parsed = rosettaParse "7 doublePrint"
+#parsed = rosettaParse "7 print print"
+parsed = rosettaParse "6 doublePrint plus 1"
+
+console.log parsed.value.length
+for eachParsedItem in parsed.value
+  console.log eachParsedItem.value
+
+class RosettaWorkspaceClass extends RosettaAnonymousClass
+  createNew: ->
+    toBeReturned = new RosettaPrimitiveObjects()
+    toBeReturned.rosettaClass = RWorkspace
+
+    toBeReturned.evalMessage = (theContext) ->
+      message = theContext.message
+      console.log "evaluation " + indentation() + "messaging workspace with " + message.print()
+
+      # now we are using the message as a list because we have to evaluate it.
+      # to evaluate it, we treat it as a list and we send it the empty message
+      # note that "self" will remain the current one, since anything that
+      # is in here will still refer to "self" as the current self in the
+      # overall message.
+      [theValue, unusedRestOfMessage] = rosettaEval message, theContext
+      theContext.returned = theValue
+
+      console.log "evaluation " + indentation() + "end of workspace evaluation"
+
+    return toBeReturned
+
+
+
+RWorkspace = new RosettaWorkspaceClass() # this is a class
+rWorkspace = RWorkspace.createNew()
+
+rWorkspace.rosettaClass.instanceVariables = RList.createNew()
+rWorkspace.rosettaClass.instanceVariables.push RAtom.createNew "a"
+
+# outer-most context
+parsed.isFromMessage = true
+outerMostContext = new RosettaContext null, rWorkspace, parsed
+rosettaContexts.push outerMostContext
+rWorkspace.evalMessage outerMostContext
+console.log "final return: " + outerMostContext.returned.value


added add all and commit

added add all and commit

error: pathspec 'lib/git-add-all-and-commit.coffee' did not match any file(s) known to git

--- lib/git-add-all-and-commit.coffee
+++ lib/git-add-all-and-commit.coffee
@@ -0,0 +1,9 @@
+GitCommit = require './git-commit'
+GitAdd = require './git-add'
+
+#Add and commit current file only
+gitAddAllAndCommit = ->
+  GitAdd(true)
+  GitCommit()
+
+module.exports = gitAddAllAndCommit


Added console

Added console

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

--- src/core/console.coffee
+++ src/core/console.coffee
@@ -0,0 +1,19 @@
+do (window = @) ->
+  'use strict';
+
+  ###
+    Console object fixes
+  ###
+  noop = ->
+
+  methods = ['assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
+        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
+        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
+        'timeStamp', 'trace', 'warn']
+
+  console = (window.console or= {})
+
+  for i in methods
+    method = methods[i]
+
+    console[method] or= noop


Check in the draft impl of the Bilaterate protocol

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

--- library/membrane/bilateral.coffee
+++ library/membrane/bilateral.coffee
@@ -0,0 +1,149 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+asciify = require "asciify"
+connect = require "connect"
+logger = require "winston"
+assert = require "assert"
+colors = require "colors"
+nconf = require "nconf"
+https = require "https"
+http = require "http"
+util = require "util"
+
+tools = require "./../nucleus/tools"
+plumbs = require "./../nucleus/plumbs"
+extendz = require "./../nucleus/extends"
+compose = require "./../nucleus/compose"
+
+{format} = require "util"
+{STATUS_CODES} = require "http"
+{EventEmitter2} = require "eventemitter2"
+{remote, external} = require "./remote"
+{Barebones} = require "./skeleton"
+{Marshal} = require "./marshal"
+{Duplex} = require "./duplex"
+
+# The bilateral is an abstract compound built up on top of `Duplex`
+# commodity that facilitates full duplex, both ways (bilateral) way
+# of communicating between client and server sites. Original duplex
+# is oriented for client-to-service communications only, while this
+# compounds adds the service-to-client communication on top of that.
+module.exports.Bilateral = class Bilateral extends Duplex
+
+    # This is a marker that indicates to some internal subsystems
+    # that this class has to be considered abstract and therefore
+    # can not be treated as a complete class implementation. This
+    # mainly is used to exclude or account for abstract classes.
+    @abstract yes
+
+    # This server side method is called on the context prior to the
+    # context being compiled and flushed down to the client site. The
+    # method is wired in an synchronous way for greater functionality.
+    # This is the place where you would be importing the dependencies.
+    prelude: (symbol, context, request, next) ->
+        _.forIn this, (value, name, service) =>
+            set = "#{symbol}.#{name}.%s = (%s)"
+            directives = value?.uplink?.directives
+            return unless _.isPlainObject directives
+            assert json = JSON.stringify directives
+            template = format set, "directives", json
+            context.invokes.push "\r\n#{template}\r\n"
+            uplinks = context.uplinks ?= new Object
+            uplinks[name] = directives; return @
+        return next undefined
+
+    # Declarate the supplied implementation function as the uplink.
+    # An uplink is an external (remote) function published on socket
+    # channel. This is a client site counterpart of the providers. A
+    # function that is supplied as an implementation is automatocally
+    # externalized and transferred (by the `Screenplay`) to a client.
+    @uplink: (directives, implementation) ->
+        invalidFunc = "supply a function for the uplink"
+        implementation = _.find arguments, _.isFunction
+        directives = {} unless _.isPlainObject directives
+        assert _.isFunction(implementation), invalidFunc
+        p = @prototype; overwrapping = (container) ->
+            name = _.findKey p, (x) -> x is overwrapping
+            assert socket = container.socket or container
+            assert socket._events?, "no container/socket"
+            return @createLinkage socket, name, directives
+        remoted = _.isObject(implementation.remote or null)
+        ext = if remoted then implementation else undefined
+        assert externalized = ext or external implementation
+        assert overwrapping.uplink = directives: directives
+        assert overwrapping.remote = externalized.remote
+        assert overwrapping.remote.source; overwrapping
+
+    # This is a client site, bilaterate bootloader that gets fired
+    # on the client automatically (with `autocall`) and detects all
+    # the uplinks. Once detected, each uplink gets published onto a
+    # socket channel that makes it available for the invocation by
+    # the corresponding server site facilities implemented belows.
+    bilateral: @autocall z: +999, ->
+        assert _.isFunction o = Marshal.serialize
+        assert _.isFunction i = Marshal.deserialize
+        uplinking = "Uplink %s at #{@location}, nsp=%s"
+        ack = "Ack an uplink %s at #{@location}, nsp=%s"
+        _.forIn this, (value, reference, context) =>
+            return unless reference of (@uplinks or {})
+            assert mangled = "#{@location}/#{reference}"
+            mangled += "/#{nsp}" if _.isString nsp = @nsp
+            @socket.on mangled, (args..., callback) =>
+                args.push c unless _.isFunction c = callback
+                callback = null unless _.isFunction callback
+                console.log uplinking, reference, nsp
+                assert args; return value i(args)..., =>
+                    return c(o(arguments)...) if c = callback
+                    id = @socket.sacks = (@socket.sacks ?= 0) + 1
+                    packet = type: "ack", name: mangled, ack: "data"
+                    _.extend packet, ackId: id, args: o(arguments)
+                    assert packet.ackId; @socket.packet packet
+
+    # This is a complementary part of the bilaterate implementation.
+    # It is invoked to produce a server side agent that is aware of
+    # the protocol for calling the specific uplink exported by the
+    # client site. Please refer to `bilaterate` method for more info.
+    # This method should not normally be used outside of the class.
+    createLinkage: (socket, name, directives) ->
+        assert identify = @constructor.identify()
+        uplinking = "Invoking uplink #{identify}#%s"
+        responded = "Uplink #{identify}#%s responded"
+        noBinder = "container has got no valid binder"
+        notify = "incorrect callback for the uplink"
+        assert _.isFunction o = Marshal.serialize
+        assert _.isFunction i = Marshal.deserialize
+        return (parameters..., callback=(->)) =>
+            assert _.isFunction(callback), notify
+            assert mangled = "#{@location()}/#{name}"
+            assert binder = socket.binder, noBinder
+            mangled += "/#{nsp}" if nsp = binder.nsp
+            logger.debug uplinking.cyan, name.bold
+            socket.emit mangled, o(parameters)..., a = =>
+                key = _.findKey socket.acks, (x) -> x is a
+                assert key, "ack"; delete socket.acks[key]
+                logger.debug responded.cyan, name.bold
+                return callback.apply this, i(arguments)


Add javascript to set up namespace for javascript functions

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

--- app/assets/javascripts/namespace.js.coffee
+++ app/assets/javascripts/namespace.js.coffee
@@ -0,0 +1 @@
+window.Inquest ||= {}


fixed undo manager to not remove all code

--- app/views/play/level/tome/SpellView.coffee
+++ app/views/play/level/tome/SpellView.coffee
@@ -3,6 +3,7 @@
 {me} = require 'lib/auth'
 filters = require 'lib/image_filter'
 Range = ace.require('ace/range').Range
+UndoManager = ace.require('ace/undomanager').UndoManager
 Problem = require './Problem'
 SpellDebugView = require './SpellDebugView'
 SpellToolbarView = require './SpellToolbarView'
@@ -175,6 +176,7 @@

   fillACE: ->
     @ace.setValue @spell.source
+    @aceSession.setUndoManager(new UndoManager())
     @ace.clearSelection()

   addZatannaSnippets: (e) ->
@@ -209,6 +211,7 @@
     @loaded = false
     @previousSource = @ace.getValue()
     @ace.setValue('')
+    @aceSession.setUndoManager(new UndoManager())
     fireURL = 'https://codecombat.firebaseio.com/' + @spell.pathComponents.join('/')
     @fireRef = new Firebase fireURL
     firepadOptions = userId: me.id
@@ -223,6 +226,7 @@
       @spell.source = firepadSource
     else
       @ace.setValue @previousSource
+      @aceSession.setUndoManager(new UndoManager())
       @ace.clearSelection()
     @onAllLoaded()

@@ -303,6 +307,7 @@
       @firepad.setText source
     else
       @ace.setValue source
+      @aceSession.setUndoManager(new UndoManager())
     @eventsSuppressed = false
     try
       @ace.resize true  # hack: @ace may not have updated its text properly, so we force it to refresh


Bubble contents-modified from buffer through editSession

--- src/edit-session.coffee
+++ src/edit-session.coffee
@@ -117,6 +117,7 @@
       project.setPath(path.dirname(@getPath())) unless project.getPath()?
       @trigger "title-changed"
       @trigger "path-changed"
+    @subscribe @buffer, "contents-modified", => @trigger "contents-modified"
     @subscribe @buffer, "contents-conflicted", => @trigger "contents-conflicted"
     @subscribe @buffer, "modified-status-changed", => @trigger "modified-status-changed"
     @preserveCursorPositionOnBufferReload()


Fix #remove() to correctly remove headers.

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


Client: Activity: Tests: Added ChannelInfoView tests

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


feat (references) Add support for deep objs in storage.

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


Fake daily stats. Temp

Fake daily stats. Temp

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


2750 submit only with status

2750 submit only with status

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


ROSE guide

ROSE guide

error: pathspec 'files/boostnote/notes/df72605b-fbc2-4a00-b91f-dff8c07786e9.cson' did not match any file(s) known to git

--- files/boostnote/notes/df72605b-fbc2-4a00-b91f-dff8c07786e9.cson
+++ files/boostnote/notes/df72605b-fbc2-4a00-b91f-dff8c07786e9.cson
@@ -0,0 +1,124 @@
+createdAt: "2018-11-26T15:40:39.505Z"
+updatedAt: "2018-12-24T01:47:52.774Z"
+type: "MARKDOWN_NOTE"
+folder: "5201fb241aae7a5e7a9b"
+title: "ROSE Installation"
+content: '''
+  # ROSE Installation
+
+  | Method   |  Status  |
+  |----------------------|-------------|
+  | binary                        |  `Fail`  |
+  | src with ml `boost`      | `Fail`  |
+  | src with `boost` src      | `Fail` |
+  | tag rls with `boost` src  | `Fail` at build, furthest gotten |
+
+  ## installation that worked
+  ### ROSE src, boost src
+  ##### module used: autoconf\\2.69 java\\1.7 boost-1.61.0-src
+  Boost config command. Possible reason for working this time:
+  a) **no serialization**
+  b) used default **4.8.5 gcc**
+
+  ```
+  .\\bootstrap.sh --prefix=\\home\\users\\scrasmussen\\local\\boost\\1.61.0 --with-libraries=chrono,date_time,filesystem,iostreams,program_options,random,regex,signals,system,thread,wave
+  .\\b2 --prefix=$BOOST_ROOT -sNO_BZIP2=1 install  cxxflags="-std=c++11"
+  ```
+
+  ROSE config command after `.\\build` in `src`
+
+  ```
+  FC=gfortran CC=gcc CXX=g++  \\home\\users\\scrasmussen\\src\\rose\\rose-git\\configure   --with-CXX_DEBUG=-g   --with-C_OPTIMIZE=-O0   --with-CXX_OPTIMIZE=-O0      --with-boost= --prefix=\\home\\users\\scrasmussen\\local\\ROSE\\0.9.9.0-ofp-boost-1.61-java-1.7-email --enable-languages=c,c++,fortran --with-gfortran=gfortran --with-alternate-backend-fortran-compiler=gfortran
+  ```
+
+  Now the problem is when trying a test like
+
+  ```
+  DEL:\\>identityTranslator --help
+  identityTranslator: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
+  ```
+
+  Where is libjvm.so?
+  Needed to add `\\usr\\local\\packages\\java\\1.7\\jre\\lib\\amd64\\server\\libjvm.so` to `LD_LIBRARY_PATH`
+
+
+
+  -------------------------------
+
+
+  ## binary install [failed]
+  * note: had to create the path manually with `mkdir -p`. This worked the second time though with different install path, maybe it can create one directory.
+
+
+  ```shell
+  D:\\>bash .\\rose-installer  -v --prefix=$HOME\\local\\rose\\0.9.9.171-bin-install
+  D:\\>uname -a
+  Linux delphi 3.10.0-327.36.3.el7.x86_64 #1 SMP Mon Oct 24 16:09:20 UTC 2016 x86_64 x86_64 x86_64 GNU\\Linux
+  ```
+
+  Installs everything ok, but it seems it can't install the Fortran front end.
+
+  ``` shell
+  D:\\>identityTranslator --version
+  ROSE (version: 0.9.9.171)
+    --- using ROSE SCM version:
+        --- ID: 13d6f3d9cd593503a0d50bb8a393df4e146677db
+        --- Timestamp: 2018-01-06 01:28:48 UTC
+    --- using EDG C\\C++ front-end version: edg-4.12
+    --- using OFP Fortran parser version: unknown (OFP is disabled)
+    --- using Boost version: 1.65.1 (\\net\\wci-cl1.llnl.gov\\vol\\home\\reus1\\ROSE-git-clones\\ROSE-rzgenie-2018.01.08.23.15.27\\BOOST-install\\1.65.1)
+    --- using backend C compiler: gcc version: 4.8
+    --- using backend C compiler path (as specified at configure time): gcc
+    --- using backend C++ compiler: g++ version: 4.8
+    --- using backend C++ compiler path (as specified at configure time): g++
+    --- using original build tree path: \\net\\wci-cl1.llnl.gov\\vol\\home\\reus1\\ROSE-git-clones\\ROSE-rzgenie-2018.01.08.23.15.27\\ROSE\\rose-build
+    --- using instalation path: \\net\\wci-cl1.llnl.gov\\vol\\home\\reus1\\ROSE-git-clones\\ROSE-rzgenie-2018.01.08.23.15.27\\ROSE-install
+    --- using GNU readline version: unknown (readline is disabled)
+    --- using libmagic version: unknown (libmagic is disabled)
+    --- using yaml-cpp version: unknown (yaml-cpp is disabled)
+  ```
+
+  ## From source [testing]
+  Needed autoconf, need to build `rose` project before installing
+
+  ```
+  D:\\>cd rose
+  D:\\>ml boost\\1.61
+  D:\\>ml autoconf
+  D:\\>.\\build
+  ```
+
+  Then `cd` to where `rose-config-ofp.sh` script is and run it.
+  Fails `configure: Count not link against boost_regex !` thought other boost libraries are found.
+
+  ## From source tag 0.9.9.0 my boost from src
+  actually build but when I got to the build process
+
+  ```
+  make[3]: Entering directory `\\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src'
+    CXXLD    rose-config
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::wave::grammars::defined_grammar_gen<boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > > >::parse_operator_defined(boost::wave::util::unput_queue_iterator<std::_List_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> > > const&, boost::wave::util::unput_queue_iterator<std::_List_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> > > const&, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> >&)'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::re_detail_106100::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform_primary[abi:cxx11](char const*, char const*) const'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::re_detail_106100::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match()'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::wave::grammars::cpp_grammar_gen<boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> > >::parse_cpp_grammar(boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > > const&, boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > > const&, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > const&, bool&, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >&, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> >&)'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::wave::grammars::defined_grammar_gen<boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > > >::parse_operator_defined(boost::wave::util::unput_queue_iterator<boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> > > const&, boost::wave::util::unput_queue_iterator<boost::wave::cpplexer::lex_iterator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> > > const&, std::__cxx11::list<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::fast_pool_allocator<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >, boost::default_user_allocator_new_delete, std::mutex, 32u, 0u> >&)'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::re_detail_106100::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::re_detail_106100::cpp_regex_traits_implementation<char>::transform[abi:cxx11](char const*, char const*) const'
+  \\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src\\.libs\\librose.so: undefined reference to `boost::wave::cpplexer::new_lexer_gen<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::new_lexer(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > const&, boost::wave::language_support)'
+  collect2: error: ld returned 1 exit status
+  make[3]: *** [rose-config] Error 1
+  make[3]: Leaving directory `\\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src'
+  make[2]: *** [all-recursive] Error 1
+  make[2]: Leaving directory `\\storage\\users\\scrasmussen\\src\\ROSE\\rose-build\\src'
+  make[1]: *** [all-recursive] Error 1
+  make[1]: Leaving directory `\\storage\\users\\scrasmussen\\src\\ROSE\\rose-build'
+  ```
+
+
+
+
+'''
+tags: []
+isStarred: false
+isTrashed: false


Get if we are the leader on worker startup

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


Verify PIN Modal

Verify PIN Modal

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

--- client/landing/app/CommonViews/VerifyPINModal.coffee
+++ client/landing/app/CommonViews/VerifyPINModal.coffee
@@ -0,0 +1,34 @@
+
+class VerifyPINModal extends KDModalViewWithForms
+
+  constructor:(buttonTitle = "Submit", callback) ->
+
+    options =
+      title                       : "Please provide the PIN that you've just received"
+      overlay                     : yes
+      width                       : 400
+      height                      : "auto"
+      tabs                        :
+        navigable                 : yes
+        forms                     :
+          form                    :
+            callback              : =>
+              callback @modalTabs.forms.form.inputs.pin.getValue()
+              @destroy()
+            buttons               :
+              Submit              :
+                title             : buttonTitle
+                cssClass          : "modal-clean-gray"
+                type              : "submit"
+            fields                :
+              pin                 :
+                label             : "PIN:"
+                name              : "pin"
+                placeholder       : "PIN"
+                validate          :
+                  rules           :
+                    required      : yes
+                  messages        :
+                    required      : "PIN required!"
+
+    super options


atom config bump

atom config bump

--- atom.symlink/config.cson
+++ atom.symlink/config.cson
@@ -3,6 +3,7 @@
     'showIndentGuide': true
     'fontFamily': 'Menlo'
     'fontSize': 15
+    'invisibles': {}
   'core':
     'ignoredNames': [
       '.bundle'
@@ -32,4 +33,3 @@
     'showOnStartup': false
   'release-notes':
     'viewedVersion': '0.89.0'
-  'go-plus': {}


Fixed accounts entry bug

Fixed accounts entry bug

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

--- client/tracker.coffee
+++ client/tracker.coffee
@@ -0,0 +1,7 @@
+Tracker.autorun ->
+	#Accounts entry routing bug
+	if Meteor.userId() and not _.isNull(Router.current()) and Router.current().route.name == 'entrySignIn'
+		Router.go 'dashboard'
+
+	if Meteor.userId() and not _.isNull(Router.current()) and Router.current().route.name == 'entrySignUp'
+		Router.go 'dashboard'


[macros] @SquidDev ಠ_ಠ.

[macros] @SquidDev ಠ_ಠ.

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


Cleanup

Cleanup

--- lib/projects-list-view.coffee
+++ lib/projects-list-view.coffee
@@ -73,17 +73,17 @@
     @setItems(items)
     @focusFilterEditor()

-  viewForItem: (project) ->
+  viewForItem: ({title, group, icon, devMode, paths}) ->
     $$ ->
-      @li class: 'two-lines', 'data-project-title': project.title, =>
+      @li class: 'two-lines', 'data-project-title': title, =>
         @div class: 'primary-line', =>
-          @span class: 'project-manager-devmode' if project.devMode
-          @div class: "icon #{project.icon}", =>
-            @span project.title
-            @span class: 'project-manager-list-group', project.group if project.group?
+          @span class: 'project-manager-devmode' if devMode
+          @div class: "icon #{icon}", =>
+            @span title
+            @span class: 'project-manager-list-group', group if group?

         if atom.config.get('project-manager.showPath')
-          for path in project.paths
+          for path in paths
             @div class: 'secondary-line', =>
               @div class: 'no-icon', path


Improve gulpfile documentation and code organization.

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


a test

a test

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

--- apps/galleries_institutions2/test/a_to_z.coffee
+++ apps/galleries_institutions2/test/a_to_z.coffee
@@ -0,0 +1,48 @@
+benv = require 'benv'
+{ resolve } = require 'path'
+{ fabricate } = require 'antigravity'
+Profiles = require '../../../collections/profiles'
+
+describe 'Galleries / Institutions', ->
+  before ->
+    @profiles = new Profiles [
+      fabricate 'featured_partners_profiles',
+        id: '43-salon-inter-nacional-de-artistas'
+        owner_type: 'PartnerInstitution'
+        owner: fabricate 'partner', type: 'Museum', name: '43 Salon (Inter) Nacional de Artistas'
+      fabricate 'featured_partners_profiles',
+        id: 'getty'
+        owner_type: 'PartnerInstitution'
+        owner: fabricate 'partner', type: 'Museum', name: 'J. Paul Getty Museum', sortable_id: 'getty'
+      fabricate 'featured_partners_profiles',
+        id: 'lacma'
+        owner_type: 'PartnerInstitution'
+        owner: fabricate 'partner', type: 'Museum', name: 'LACMA'
+    ]
+    @aToZGroup = @profiles.groupByAlphaWithColumns 3
+
+  beforeEach (done) ->
+    benv.setup =>
+      benv.expose $: benv.require 'jquery'
+      benv.render resolve(__dirname, '../templates/a_z.jade'), {
+        sd: CURRENT_PATH: '/institution-a-z'
+        asset: (->)
+        aToZGroup: @aToZGroup
+        type: 'institution'
+        showAZLink: false
+
+      }, done
+
+  afterEach ->
+    benv.teardown()
+
+  describe 'template', ->
+    it 'renders an A to Z list of partners with links to the partner', ->
+      markup = $('.galleries-institutions2-page').html()
+      markup.should.containEql ('Browse Institutions')
+      @profiles.each (profile) ->
+        markup.should.containEql profile.related().owner.get('name')
+        markup.should.containEql "/#{profile.id}"
+      $('.a-to-z-row-letter').eq(0).text().should.equal @aToZGroup[0].letter
+      $('.a-to-z-row-letter').eq(1).text().should.equal @aToZGroup[1].letter
+      $('.a-to-z-row-letter').eq(2).text().should.equal @aToZGroup[2].letter


smartcube-kbox-a250.coffee: Add coffee file for new machine

Signed-off-by: Florin Sarbu <3a837a37a2ac9072a088641ec330e0e5d5b86f4e@balena.io>

error: pathspec 'smartcube-kbox-a250.coffee' did not match any file(s) known to git

--- smartcube-kbox-a250.coffee
+++ smartcube-kbox-a250.coffee
@@ -0,0 +1,59 @@
+deviceTypesCommon = require '@resin.io/device-types/common'
+{ networkOptions, commonImg, instructions } = deviceTypesCommon
+
+GENERIC_FLASH = '''
+	Please make sure you do not have any other USB keys inserted.
+	Power up the hardware. Make sure you have a keyboard connected.
+	Press the F10 key (may differ on some platforms) while BIOS is loading in order to enter the boot menu.
+	Next, select the name of your USB key.
+'''
+
+GENERIC_POWERON = 'Power on your device.'
+
+postProvisioningInstructions = [
+	instructions.BOARD_SHUTDOWN
+	instructions.REMOVE_INSTALL_MEDIA
+	GENERIC_POWERON
+]
+
+module.exports =
+	version: 1
+	slug: 'smartcube-kbox-a250'
+	aliases: [ 'smartcube-kbox-a250' ]
+	name: 'SmartCube KBOX A250'
+	arch: 'amd64'
+	state: 'new'
+	private: false
+
+	stateInstructions:
+		postProvisioning: postProvisioningInstructions
+
+	instructions: [
+		instructions.ETCHER_USB
+		instructions.EJECT_USB
+		instructions.FLASHER_WARNING
+		GENERIC_FLASH
+	].concat(postProvisioningInstructions)
+
+	gettingStartedLink:
+		windows: 'https://www.balena.io/docs/learn/getting-started/intel-nuc/nodejs/'
+		osx: 'https://www.balena.io/docs/learn/getting-started/intel-nuc/nodejs/'
+		linux: 'https://www.balena.io/docs/learn/getting-started/intel-nuc/nodejs/'
+
+	yocto:
+		machine: 'smartcube-kbox-a250'
+		image: 'resin-image-flasher'
+		fstype: 'resinos-img'
+		version: 'yocto-warrior'
+		deployArtifact: 'resin-image-flasher-smartcube-kbox-a250.resinos-img'
+		compressed: true
+
+	configuration:
+		config:
+			partition:
+				primary: 1
+			path: '/config.json'
+
+	options: [ networkOptions.group ]
+
+	initialization: commonImg.initialization


#14 added special expire test

#14 added special expire test

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

--- test/test-expire.coffee
+++ test/test-expire.coffee
@@ -0,0 +1,32 @@
+NodeCache = require('../')
+queriesCache = new NodeCache({ stdTTL: 2, checkperiod: 1 })
+
+idx = 0
+_write = ->
+	console.log "test - WRITE:A query:#{idx}"
+	queriesCache.set "query", idx, ( err, success )->
+		console.log "test - WRITE:B query:#{idx}", err, success
+		idx++
+		return
+	return
+
+_read = ->
+	console.log "test - read:A query"
+	queriesCache.get "query", ( err, value )->
+		if value[ "query" ]?
+			console.log "test - read:B query:#{value[ "query" ]}"
+		else
+			console.log "test - !! EMPTY !! - read:B query:#{value[ "query" ]}"
+		return
+	return
+
+queriesCache.on "expired", ( key, value )->
+	console.log "test - EXPIRED query:#{value}"
+	_write()
+	return
+
+_write()
+
+setInterval( _read, 600 )
+#setInterval( _read, 200 )
+#setInterval( _read, 100 )


Only set ATOM_API_URL

Only set ATOM_API_URL

--- spec/unpublish-spec.coffee
+++ spec/unpublish-spec.coffee
@@ -28,7 +28,6 @@

     process.env.ATOM_HOME = temp.mkdirSync('apm-home-dir-')
     process.env.ATOM_API_URL = "http://localhost:3000"
-    process.env.ATOM_PACKAGES_URL = "http://localhost:3000/packages"

   afterEach ->
     server.close()


Create test for canvas 2 buffer component

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

--- spec/CanvasToBuffer.coffee
+++ spec/CanvasToBuffer.coffee
@@ -0,0 +1,44 @@
+noflo = require 'noflo'
+unless noflo.isBrowser()
+  chai = require 'chai' unless chai
+  CanvasToBuffer = require '../components/CanvasToBuffer.coffee'
+else
+  CanvasToBuffer = require 'noflo-image/components/CanvasToBuffer.js'
+
+describe 'CanvasToBuffer component', ->
+  c = null
+  ins = null
+  out = null
+  error = null
+  beforeEach ->
+    c = CanvasToBuffer.getComponent()
+    ins = noflo.internalSocket.createSocket()
+    out = noflo.internalSocket.createSocket()
+    error = noflo.internalSocket.createSocket()
+    c.inPorts.url.attach ins
+    c.outPorts.buffer.attach out
+    c.outPorts.error.attach error
+
+  describe 'when instantiated', ->
+    it 'should have input ports', ->
+      chai.expect(c.inPorts.canvas).to.be.an 'object'
+    it 'should have output ports', ->
+      chai.expect(c.outPorts.buffer).to.be.an 'object'
+    it 'should have an error output port', ->
+      chai.expect(c.outPorts.error).to.be.an 'object'
+
+  describe 'when sending a canvas', ->
+    unless noflo.isBrowser()
+      it 'should return a buffer', (done) ->
+        expected = 'spec/test-80x80.jpg'
+        out.once 'data', (data) ->
+          console.log 'data', data
+          chai.expect(data).to.be.an 'object'
+          chai.expect(data).to.be.an.instanceOf Buffer
+          done()
+        src = 'spec/test-80x80.jpg'
+        testutils.getCanvasWithImageNoShift src, (canvas) ->
+          ins.beginGroup 'foo'
+          ins.send canvas
+          ins.endGroup()
+


Always assume that resourcePath is set properly

--- spec/spec-bootstrap.coffee
+++ spec/spec-bootstrap.coffee
@@ -7,6 +7,7 @@

 # Start the crash reporter before anything else.
 require('crash-reporter').start(productName: @pkgJson.name, companyName: 'atom-shell-starter')
+specRootPath = path.resolve(global.loadSettings.resourcePath, 'spec/')

 if global.loadSettings.exitWhenDone
   jasmineFn = require 'jasmine'
@@ -21,9 +22,6 @@
   jasmineEnv = jasmine.getEnv()
   jasmineEnv.addReporter(reporter)

-  specRootPath = 'spec/'
-  if global.loadSettings.resourcePath
-    specRootPath = path.resolve(global.loadSettings.resourcePath, specRootPath)
   for specFilePath in fs.listTreeSync(specRootPath) when /-spec\.(coffee|js)$/.test specFilePath
     require specFilePath

@@ -38,9 +36,6 @@
   require '../vendor/jasmine/lib/jasmine-2.1.3/jasmine-html'
   require '../vendor/jasmine/lib/jasmine-2.1.3/boot'

-  specRootPath = 'spec/'
-  if global.loadSettings.resourcePath
-    specRootPath = path.resolve(global.loadSettings.resourcePath, specRootPath)
   for specFilePath in fs.listTreeSync(specRootPath) when /-spec\.(coffee|js)$/.test specFilePath
     require specFilePath


Add method for SAML 'ArtifactResolve' messages, this currently only generates and signs the XML for the request. TODO: Add making the artifact resolution request to this library.

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


Fix typo

Fix typo

--- src/text-editor-component.coffee
+++ src/text-editor-component.coffee
@@ -263,7 +263,7 @@
     # before observing any keyup event, we observe events in the following
     # sequence:
     #
-    # keydown(keyCode: X), keypress, keydown(codeCode: X)
+    # keydown(keyCode: X), keypress, keydown(keyCode: X)
     #
     # The keyCode X must be the same in the keydown events that bracket the
     # keypress, meaning we're *holding* the _same_ key we intially pressed.


Err, yeah, we care about undefined, not false.

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -42,7 +42,7 @@
     @startReflowing() if @continuousReflow
     @updating = false

-    @scrollPastEndOverride = scrollPastEnd || true
+    @scrollPastEndOverride = scrollPastEnd ? true

   setLinesYardstick: (@linesYardstick) ->


move predictor graph pins over 3 px

move predictor graph pins over 3 px


home/stack: show cloning disabled message

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

--- client/home/lib/stacks/components/stacktemplateitem/index.coffee
+++ client/home/lib/stacks/components/stacktemplateitem/index.coffee
@@ -75,6 +75,24 @@
       <ItemLink
         onClick={onAddToSidebar}
         title='ADD TO SIDEBAR' />
+
+
+  canClone: ->
+    { canCreateStacks, template, onCloneFromDashboard } = @props
+
+    return not onCloneFromDashboard or template.isMine() or canCreateStacks
+
+
+  renderCloningDisabledMessage: ->
+
+    { canCreateStacks, template, onCloneFromDashboard } = @props
+
+    return null  if @canClone()
+
+

+      Cloning is disabled for members.
+      Please ask one of your admins to enable stack creation permission.
+

   renderUnreadCount: ->
@@ -162,6 +180,7 @@

         {@renderButton()}
+        {@renderCloningDisabledMessage()}


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -663,7 +663,7 @@
   #
   #     [{ id: '8c0c3eab-8114-41d6-8808-2ae8615d38b4',
   #        params: [ 'param1', 'param2' ],
-  #        queued: Sat, 12 May 2012 07:41:33 GMT
+  #        queued: Sat, 12 May 2012 07:41:33 GMT // Date Object
   #      }, ...]
   #
   # Possible combos of arguments are: