Skip to content

Commit 1fa559f

Browse files
Merge pull request #79 from nodezoo/malex
Added test for matching the url. Updated packages, linting, some more debug messages. Fixes #68
2 parents b2611c3 + 9052334 commit 1fa559f

File tree

3 files changed

+138
-95
lines changed

3 files changed

+138
-95
lines changed

lib/github.js

Lines changed: 123 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
var GitHub = require('github4')
44
var github = new GitHub()
55
var Request = require('request')
6-
var async = require('async')
6+
var Async = require('async')
77

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

2929
function cmdGet (msg, done) {
30-
var cache = opts.cache
31-
var registry = opts.registry + msg.name
30+
let moduleName = msg.name
31+
let cache = opts.cache
32+
let registry = opts.registry + moduleName
33+
let context = this
3234

33-
cache.load$(msg.name, (err, github) => {
35+
context.log.debug(`Processing module: ${moduleName}`)
36+
cache.load$(moduleName, (err, github) => {
3437
if (err) return done(err)
3538

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

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

62-
if (!params.user || !params.repo) {
63-
return done(new Error('not found on github'))
64-
}
60+
if (matches && matches.length >= 2) {
61+
var params = {
62+
name: moduleName,
63+
url: url,
64+
user: matches[1] || null,
65+
repo: matches[2] || null
66+
}
67+
68+
if (!params.user || !params.repo) {
69+
return done(new Error(`module ${moduleName} not found on github`))
70+
}
6571

66-
queryGithub(params, done)
72+
queryGithub(params, done)
73+
}
74+
else {
75+
return done(new Error(`invalid github url: ${url}, for module: ${moduleName}`))
76+
}
6777
}
68-
else{
69-
return done(new Error('not found on github'))
78+
else {
79+
return done(new Error(`module ${moduleName} not found on github`))
7080
}
7181
})
7282
})
73-
}
7483

75-
function aliasGet (msg, done) {
76-
var seneca = this
77-
var payload = {name: msg.name}
84+
function queryGithub (params, done) {
85+
var cache = opts.cache
7886

79-
seneca.act('role:github,cmd:get', payload, (err, data) => {
80-
if (err) return done(err)
87+
github.authenticate({
88+
type: 'token',
89+
token: opts.token
90+
})
8191

82-
payload.data = data
83-
seneca.act('role:info,res:part,part:github', payload)
84-
done(null, {ok: true})
85-
})
86-
}
92+
Async.parallel({
93+
getRepository: function (cb) {
94+
github.repos.get({user: params.user, repo: params.repo}, function (err, data) {
95+
if (err) {
96+
context.log.debug(`Read repo for ${moduleName} get error: ${err}`)
97+
}
8798

88-
function queryGithub (msg, done) {
89-
var cache = opts.cache
99+
cb(err, data)
100+
})
101+
},
102+
103+
getReadme: function (cb) {
104+
github.repos.getReadme({user: params.user, repo: params.repo}, (err, readme) => {
105+
if (err) {
106+
context.log.debug(`Read readme for ${moduleName} get error: ${err}`)
107+
return cb(err)
108+
}
109+
110+
if (!readme || !readme.content) {
111+
context.log.debug(`Read readme for ${moduleName} no content`)
112+
return cb(null, false)
113+
}
114+
115+
github.misc.renderMarkdownRaw({
116+
data: new Buffer(readme.content, 'base64').toString('ascii')
117+
}, (err, response) => {
118+
if (err && !response) {
119+
context.log.debug(`Render readme for ${moduleName} error: ${err}`)
120+
return cb(err)
121+
} // API fails expecting a JSON object
122+
123+
cb(null, response.data)
124+
})
125+
})
126+
},
90127

91-
github.authenticate({
92-
type: 'token',
93-
token: opts.token
94-
})
128+
getPullRequests: function (cb) {
129+
github.pullRequests.getAll({user: params.user, repo: params.repo, state: 'open'}, function(err, data){
130+
if (err) {
131+
context.log.debug(`Read Github pull requests for ${moduleName} get error: ${err}`)
132+
}
95133

96-
async.parallel({
97-
getRepository: function (cb) {
98-
github.repos.get({user: msg.user, repo: msg.repo}, cb)
99-
},
134+
cb(err, data)
135+
})
136+
}
137+
}, (err, results) => {
138+
if (err) {
139+
context.log.debug(`Read pull requests for ${moduleName} got error: ${err}`)
140+
return complete(err)
141+
}
142+
var data = {
143+
name: params.repo || '',
144+
user: params.user || '',
145+
repo: params.repo || '',
146+
stars: results.getRepository.stargazers_count || 0,
147+
watches: results.getRepository.subscribers_count || 0,
148+
forks: results.getRepository.forks_count || 0,
149+
last: results.getRepository.pushed_at || '',
150+
urlRepo: 'https://github.com/' + params.user + '/' + params.repo,
151+
urlClone: 'git+https://github.com/' + params.user + '/' + params.repo + '.git',
152+
urlSsh: '[email protected]:' + params.user + '/' + params.repo + '.git',
153+
readme: results.getReadme,
154+
pullRequests: results.getPullRequests && results.getPullRequests.length || 0,
155+
cached: Date.now()
156+
}
100157

101-
getReadme: function (cb) {
102-
github.repos.getReadme({user: msg.user, repo: msg.repo}, (err, readme) => {
103-
if (err) return cb(err)
104-
if (!readme.content) return cb(null, false)
158+
context.log.debug(`Read Github data for module ${moduleName} completed.`)
159+
cache.load$(params.name, (err, cached) => {
160+
if (err) {
161+
return complete(err)
162+
}
105163

106-
github.misc.renderMarkdownRaw({
107-
data: new Buffer(readme.content, 'base64').toString('ascii')
108-
}, (err, response) => {
109-
if (err && !response) return cb(err) // API fails expecting a JSON object
164+
if (cached) {
165+
return cached.data$(data).save$(complete)
166+
}
110167

111-
cb(null, response.data)
112-
})
168+
data.id$ = params.name
169+
cache.make$(data).save$(complete)
113170
})
114-
},
115-
116-
getPullRequests: function (cb) {
117-
github.pullRequests.getAll({user: msg.user, repo: msg.repo, state: 'open'}, cb)
118-
}
119-
}, (err, results) => {
120-
if (err) return done(err)
121171

122-
var data = {
123-
name: msg.repo || '',
124-
user: msg.user || '',
125-
repo: msg.repo || '',
126-
stars: results.getRepository.stargazers_count || 0,
127-
watches: results.getRepository.subscribers_count || 0,
128-
forks: results.getRepository.forks_count || 0,
129-
last: results.getRepository.pushed_at || '',
130-
urlRepo: 'https://github.com/' + msg.user + '/' + msg.repo,
131-
urlClone: 'git+https://github.com/' + msg.user + '/' + msg.repo + '.git',
132-
urlSsh: '[email protected]:' + msg.user + '/' + msg.repo + '.git',
133-
readme: results.getReadme,
134-
pullRequests: results.getPullRequests && results.getPullRequests.length || 0,
135-
cached: Date.now()
136-
}
172+
function complete (err, data) {
173+
if (err) {
174+
context.log.debug(`Save Github data for ${moduleName} got error: ${err}`)
175+
return done(err)
176+
}
177+
else done(null, data ? data.data$(data) : data)
178+
}
179+
})
180+
}
181+
}
137182

138-
function complete (err, data) {
139-
if (err) return done(err)
140-
else done(null, data.data$(data))
141-
}
183+
function aliasGet (msg, done) {
184+
var seneca = this
185+
var payload = {name: msg.name}
142186

143-
cache.load$(msg.name, (err, cached) => {
144-
if (err) return done(err)
145-
if (cached) return cached.data$(data).save$(complete)
187+
seneca.act('role:github,cmd:get', payload, (err, data) => {
188+
if (err) return done(err)
146189

147-
data.id$ = msg.name
148-
cache.make$(data).save$(complete)
149-
})
190+
payload.data = data
191+
seneca.act('role:info,res:part,part:github', payload)
192+
done(null, {ok: true})
150193
})
151194
}

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
},
3535
"license": "MIT",
3636
"dependencies": {
37-
"github4": "0.5.4",
38-
"request": "2.70.0",
39-
"seneca": "2.0.0",
37+
"github4": "1.0.0",
38+
"request": "2.72.0",
39+
"seneca": "2.0.1",
4040
"seneca-balance-client": "0.4.0",
4141
"seneca-entity": "0.0.1",
4242
"seneca-level-store": "0.2.3",
@@ -46,10 +46,10 @@
4646
"devDependencies": {
4747
"code": "2.2.0",
4848
"coveralls": "2.11.9",
49-
"eslint-config-seneca": "1.1.2",
49+
"eslint-config-seneca": "2.0.0",
5050
"eslint-plugin-hapi": "4.0.0",
5151
"eslint-plugin-standard": "1.3.2",
52-
"proxyquire": "1.7.4",
53-
"lab": "10.3.1"
52+
"proxyquire": "1.7.8",
53+
"lab": "10.5.1"
5454
}
5555
}

test/github.test.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('A valid "role:github,cmd:get" call', () => {
4646
var seneca = createInstance(done)
4747
var payload = {name: 'seneca'}
4848

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

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

6363
var cachedOne = reply.cached
6464

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

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

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

8383
var cachedOne = reply.cached
8484
payload.update = true
8585

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

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

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

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

127-
seneca.add(`role:info,res:part`, (msg, cb) => {
127+
seneca.add('role:info,res:part', (msg, cb) => {
128128
expect(msg).to.exist()
129129
cb()
130130
done()
131131
})
132132

133-
seneca.act(`role:info,req:part`, payload, (err, reply) => {
133+
seneca.act('role:info,req:part', payload, (err, reply) => {
134134
expect(err).to.not.exist()
135135
expect(reply).to.exist()
136136
})

0 commit comments

Comments
 (0)