Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added test for matching the url. Updated packages, linting, some more debug messages. Fixes #68 #79

Merged
merged 2 commits into from
May 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 123 additions & 80 deletions lib/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
var GitHub = require('github4')
var github = new GitHub()
var Request = require('request')
var async = require('async')
var Async = require('async')

var opts = {
registry: 'http://registry.npmjs.org/',
Expand All @@ -27,10 +27,13 @@ module.exports = function (options) {
}

function cmdGet (msg, done) {
var cache = opts.cache
var registry = opts.registry + msg.name
let moduleName = msg.name
let cache = opts.cache
let registry = opts.registry + moduleName
let context = this

cache.load$(msg.name, (err, github) => {
context.log.debug(`Processing module: ${moduleName}`)
cache.load$(moduleName, (err, github) => {
if (err) return done(err)

if (github && !msg.update) {
Expand All @@ -50,102 +53,142 @@ function cmdGet (msg, done) {
var repository = latest.repository || {}
var url = repository.url || ''

if(url.length > 0) {
context.log.debug(`Module: ${moduleName}, github url: ${url}`)
if (url.length > 0) {
var matches = /[\/:]([^\/:]+?)[\/:]([^\/]+?)(\.git)*$/.exec(url)
var params = {
name: msg.name,
url: url,
user: matches[1] || null,
repo: matches[2] || null
}

if (!params.user || !params.repo) {
return done(new Error('not found on github'))
}
if (matches && matches.length >= 2) {
var params = {
name: moduleName,
url: url,
user: matches[1] || null,
repo: matches[2] || null
}

if (!params.user || !params.repo) {
return done(new Error(`module ${moduleName} not found on github`))
}

queryGithub(params, done)
queryGithub(params, done)
}
else {
return done(new Error(`invalid github url: ${url}, for module: ${moduleName}`))
}
}
else{
return done(new Error('not found on github'))
else {
return done(new Error(`module ${moduleName} not found on github`))
}
})
})
}

function aliasGet (msg, done) {
var seneca = this
var payload = {name: msg.name}
function queryGithub (params, done) {
var cache = opts.cache

seneca.act('role:github,cmd:get', payload, (err, data) => {
if (err) return done(err)
github.authenticate({
type: 'token',
token: opts.token
})

payload.data = data
seneca.act('role:info,res:part,part:github', payload)
done(null, {ok: true})
})
}
Async.parallel({
getRepository: function (cb) {
github.repos.get({user: params.user, repo: params.repo}, function (err, data) {
if (err) {
context.log.debug(`Read repo for ${moduleName} get error: ${err}`)
}

function queryGithub (msg, done) {
var cache = opts.cache
cb(err, data)
})
},

getReadme: function (cb) {
github.repos.getReadme({user: params.user, repo: params.repo}, (err, readme) => {
if (err) {
context.log.debug(`Read readme for ${moduleName} get error: ${err}`)
return cb(err)
}

if (!readme || !readme.content) {
context.log.debug(`Read readme for ${moduleName} no content`)
return cb(null, false)
}

github.misc.renderMarkdownRaw({
data: new Buffer(readme.content, 'base64').toString('ascii')
}, (err, response) => {
if (err && !response) {
context.log.debug(`Render readme for ${moduleName} error: ${err}`)
return cb(err)
} // API fails expecting a JSON object

cb(null, response.data)
})
})
},

github.authenticate({
type: 'token',
token: opts.token
})
getPullRequests: function (cb) {
github.pullRequests.getAll({user: params.user, repo: params.repo, state: 'open'}, function(err, data){
if (err) {
context.log.debug(`Read Github pull requests for ${moduleName} get error: ${err}`)
}

async.parallel({
getRepository: function (cb) {
github.repos.get({user: msg.user, repo: msg.repo}, cb)
},
cb(err, data)
})
}
}, (err, results) => {
if (err) {
context.log.debug(`Read pull requests for ${moduleName} got error: ${err}`)
return complete(err)
}
var data = {
name: params.repo || '',
user: params.user || '',
repo: params.repo || '',
stars: results.getRepository.stargazers_count || 0,
watches: results.getRepository.subscribers_count || 0,
forks: results.getRepository.forks_count || 0,
last: results.getRepository.pushed_at || '',
urlRepo: 'https://github.com/' + params.user + '/' + params.repo,
urlClone: 'git+https://github.com/' + params.user + '/' + params.repo + '.git',
urlSsh: '[email protected]:' + params.user + '/' + params.repo + '.git',
readme: results.getReadme,
pullRequests: results.getPullRequests && results.getPullRequests.length || 0,
cached: Date.now()
}

getReadme: function (cb) {
github.repos.getReadme({user: msg.user, repo: msg.repo}, (err, readme) => {
if (err) return cb(err)
if (!readme.content) return cb(null, false)
context.log.debug(`Read Github data for module ${moduleName} completed.`)
cache.load$(params.name, (err, cached) => {
if (err) {
return complete(err)
}

github.misc.renderMarkdownRaw({
data: new Buffer(readme.content, 'base64').toString('ascii')
}, (err, response) => {
if (err && !response) return cb(err) // API fails expecting a JSON object
if (cached) {
return cached.data$(data).save$(complete)
}

cb(null, response.data)
})
data.id$ = params.name
cache.make$(data).save$(complete)
})
},

getPullRequests: function (cb) {
github.pullRequests.getAll({user: msg.user, repo: msg.repo, state: 'open'}, cb)
}
}, (err, results) => {
if (err) return done(err)

var data = {
name: msg.repo || '',
user: msg.user || '',
repo: msg.repo || '',
stars: results.getRepository.stargazers_count || 0,
watches: results.getRepository.subscribers_count || 0,
forks: results.getRepository.forks_count || 0,
last: results.getRepository.pushed_at || '',
urlRepo: 'https://github.com/' + msg.user + '/' + msg.repo,
urlClone: 'git+https://github.com/' + msg.user + '/' + msg.repo + '.git',
urlSsh: '[email protected]:' + msg.user + '/' + msg.repo + '.git',
readme: results.getReadme,
pullRequests: results.getPullRequests && results.getPullRequests.length || 0,
cached: Date.now()
}
function complete (err, data) {
if (err) {
context.log.debug(`Save Github data for ${moduleName} got error: ${err}`)
return done(err)
}
else done(null, data ? data.data$(data) : data)
}
})
}
}

function complete (err, data) {
if (err) return done(err)
else done(null, data.data$(data))
}
function aliasGet (msg, done) {
var seneca = this
var payload = {name: msg.name}

cache.load$(msg.name, (err, cached) => {
if (err) return done(err)
if (cached) return cached.data$(data).save$(complete)
seneca.act('role:github,cmd:get', payload, (err, data) => {
if (err) return done(err)

data.id$ = msg.name
cache.make$(data).save$(complete)
})
payload.data = data
seneca.act('role:info,res:part,part:github', payload)
done(null, {ok: true})
})
}
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@
},
"license": "MIT",
"dependencies": {
"github4": "0.5.4",
"request": "2.70.0",
"seneca": "2.0.0",
"github4": "1.0.0",
"request": "2.72.0",
"seneca": "2.0.1",
"seneca-balance-client": "0.4.0",
"seneca-entity": "0.0.1",
"seneca-level-store": "0.2.3",
Expand All @@ -46,10 +46,10 @@
"devDependencies": {
"code": "2.2.0",
"coveralls": "2.11.9",
"eslint-config-seneca": "1.1.2",
"eslint-config-seneca": "2.0.0",
"eslint-plugin-hapi": "4.0.0",
"eslint-plugin-standard": "1.3.2",
"proxyquire": "1.7.4",
"lab": "10.3.1"
"proxyquire": "1.7.8",
"lab": "10.5.1"
}
}
18 changes: 9 additions & 9 deletions test/github.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ describe('A valid "role:github,cmd:get" call', () => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
done()
Expand All @@ -57,12 +57,12 @@ describe('A valid "role:github,cmd:get" call', () => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.not.exist()

var cachedOne = reply.cached

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.not.exist()

var cachedTwo = reply.cached
Expand All @@ -77,13 +77,13 @@ describe('A valid "role:github,cmd:get" call', () => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.not.exist()

var cachedOne = reply.cached
payload.update = true

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.not.exist()

var cachedTwo = reply.cached
Expand All @@ -100,7 +100,7 @@ describe('An invalid "role:github,cmd:get" call', () => {
var seneca = createInstance(done)
var payload = {name: 'shooobydoobydooboop'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
seneca.act('role:github,cmd:get', payload, (err, reply) => {
expect(err).to.exist()
expect(reply).to.not.exist()
done()
Expand All @@ -113,7 +113,7 @@ describe('A valid "role:info,req:part" call', () => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:info,req:part`, payload, (err, reply) => {
seneca.act('role:info,req:part', payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
done()
Expand All @@ -124,13 +124,13 @@ describe('A valid "role:info,req:part" call', () => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.add(`role:info,res:part`, (msg, cb) => {
seneca.add('role:info,res:part', (msg, cb) => {
expect(msg).to.exist()
cb()
done()
})

seneca.act(`role:info,req:part`, payload, (err, reply) => {
seneca.act('role:info,req:part', payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
})
Expand Down