• Jump To … +
    server.coffee src/actionknob.coffee src/autosem.coffee src/bitbucket_kba.coffee src/browserlog.coffee src/datareduction.coffee src/dci.coffee src/dciknob.coffee src/deeseeeye.coffee src/dnd.coffee src/doof.coffee src/formurla-mngr.coffee src/fractalpanel.coffee src/fractalpanel_test.coffee src/front.coffee src/ingestor.coffee src/kbabitbucket.coffee src/knobctrl.coffee src/lib_test.coffee src/nanoclock.coffee src/noodb.coffee src/noodbabstract.coffee src/noodbbrowser.coffee src/noodbbrowser_test.coffee src/noodbsec.coffee src/noorauth.coffee src/noorplugin.coffee src/noorquery.coffee src/noorvm.coffee src/noorwrite.coffee src/quadparser.coffee src/quadparsern3.coffee src/rbac.coffee src/reactor.coffee src/rebase.coffee src/rsrcidx.coffee src/sandboxactions.coffee src/screen_ctx.coffee src/spogi.coffee src/tabular_widget.coffee src/visctrl.coffee src/voicesknob.coffee src/whowhen.coffee src/xsd2native.coffee
  • kbabitbucket.coffee

  • ¶
  • ¶

    KBA = require(‘kba’).KBA

    class KBA
      constructor: (@noodb) ->
    
      get_kb_with_write_capability: (capability) ->
  • ¶

    cap_spogi = @noodb.query([{p: ‘nrn:hasWriteCapability’, o: capability}, {g: “nrn:capabilitiesKB”}], {which: “first”})

        retval = 'nrn:smurp_libnoo_issues_kb'
  • ¶

    retval = ‘nrn:foaf20140114’

        @ensure_kb_is_readable(retval)
        return retval
    
      ensure_kb_is_readable: (kb_qn) ->
        @noodb.log.warning("KBA.ensure_kb_is_readable('#{kb_qn}') is an ugly hack.  Permission setting should happen at the time of kb creation")
  • ¶

    one way to achieve this is to make the kb publicly readable

        @noodb.allege(kb_qn, 'nrn:readableBy', 'nrn:public', 'nrn:permissionsKB')
  • ¶

    another way is to make the kb inherit permissions from something readable @noodb.allege(kb_qn, ‘nrn:inheritsPermissionsFrom’, ‘nrn:core’, ‘nrn:permissionsKB’)

    class KBASoftwareIssue extends KBA
      constructor: ->
        super
        try
          @noodb.prefixdb.add_prefix('nrnprjiss', 'http://nooron.com/__/nrnprjiss#')
        catch e
  • ¶

    no problem if there is a collision

  • ¶

    TODO make these into links to the resources or at least strings with _typ These are the mappings from KBASoftwareIssue to an ontological view of the data Note that these mappings would ideally be expressed in an external ontology.

      Issue: 'nrnprjiss:Issue'
      issueCreationDate: 'nrnprjiss:issueCreationDate'
      issueKind: 'nrnprjiss:kind'
      issueMilestone: 'nrnprjiss:milestone'
      issuePriority: 'nrnprjiss:priority'
      issueState: 'nrnprjiss:state'
      issueTitle: 'dc:title'
      issueUpdateDate: 'nrnprjiss:issueUpdateDate'
      issueWatchers: 'nrnprjiss:watchers'
      issueVotes: 'nrnprjiss:votes'
    
      process_event_fields: (req, res, kb_qn, body, eventKey, flds) ->
        subj = @get_subject(body, kb_qn, eventKey)
        out = []
        if eventKey is 'issue:created'
          @noodb.allege(subj, 'rdf:type', @Issue, kb_qn)
        for fld in flds
          ont = @fld2ont[fld]
          if not ont?
            throw new Error("no fld2ont entry for '#{fld}'")
          path = fld.split(':')
          part = path.shift()
          limb = body
          while part
            limb = limb[part]
            part = path.shift and path.shift() or false
          if limb?
            pred = @[ont]
            if pred?
              if "string" is typeof limb
                limb = "\"#{limb}\""
              wrote = @noodb.allege(subj, pred, limb, kb_qn)
              out.push(wrote)
              console.log(wrote.toString())
            else
              throw new Error("no entry on #{this.constructor.name} for '#{ont}'")
        res.send(out.join('\n') or 'no allegations generated')
        return
    
    class KBABitBucket extends KBASoftwareIssue
      fld2ont:  # these are the mappings from BitBucket JSON to KBASoftwareIssue
        'issue:created_on': 'issueCreationDate'
        'issue:kind': 'issueKind'
        'issue:milestone': 'issueMilestone'
        'issue:priority': 'issuePriority'
        'issue:state': 'issueState'
        'issue:title': 'issueTitle'
        'issue:updated_on': 'issueUpdateDate'
        'issue:votes': 'issueVotes'
        'issue:watches': 'issueWatchers'
    
      webhook: (req, res) =>
  • ¶

    console.log(JSON.stringify(req.body, null, 4))

        if req.params.capability
          kb_qn = @get_kb_with_write_capability(req.params.capability)
  • ¶

    res.send(JSON.stringify(req.body, null, 4))

          eventKey = req.headers['x-event-key']
          res.setHeader('content-type','text/plain') # not critical
          if typeof req.body isnt 'object'
            res.send("typeof req.body is #{typeof req.body}")
            return
          b = req.body
          switch eventKey
            when 'issue:updated', 'issue:created', 'issue:commented'
              @process_event_fields(req, res, kb_qn, b, eventKey, @event2flds[eventKey])
            else
              res.send("X-Event-Key '#{eventKey}' not supported")
        else
          res.send("/kba/bitbucket/CAPABILITY")
          res.send(204)
    
      event2flds:
        'issue:created': [
          'issue:created_on'
          'issue:kind'
          'issue:milestone'
          'issue:priority'
          'issue:state'
          'issue:title'
          'issue:votes'
          'issue:watches'
          ]
        'issue:updated': [
          'issue:created_on'
          'issue:kind'
          'issue:milestone'
          'issue:priority'
          'issue:state'
          'issue:title'
          'issue:votes'
          'issue:watches'
          ]
        'issue:commented': 'created_on updated_on votes watches state milestone title priority'.split(' ')
    
      get_subject: (body, kb_qn, eventKey) ->
        subj = body.issue.links.html.href
        subj.replace(/\/[^\/]*$/, '') # remove '/a-title' https://bitbucket.org/WHO/REPO/issues/12/a-title
    
    (exports ? this).KBABitBucket = KBABitBucket