Skip to content

Commit d86f72e

Browse files
committed
initial
1 parent a0477ea commit d86f72e

10 files changed

Lines changed: 286 additions & 1 deletion

File tree

.gitignore

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
lib-cov
2+
*.seed
3+
*.log
4+
*.csv
5+
*.dat
6+
*.out
7+
*.pid
8+
*.gz
9+
10+
pids
11+
logs
12+
results
13+
14+
npm-debug.log
15+
16+
node_modules
17+
*~
18+
19+
test/mine.options.js
20+
test/data

.travis.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
language: node_js
2+
node_js:
3+
- "0.11"
4+
- "0.10"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
nodezoo-github
22
==============
33

4-
nodezoo.com micro-service handling github
4+
nodezoo.com micro-service handling github meta data.

dev.options.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
'jsonfile-store': {folder:__dirname+'/data'},
3+
transport:{
4+
port: 9001
5+
}
6+
}

github-service.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
var seneca = require('seneca')()
3+
.use('jsonfile-store')
4+
.use('./github.js')
5+
.listen()

github.js

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/* Copyright (c) 2014 Richard Rodger, MIT License */
2+
/* jshint node:true, asi:true, eqnull:true */
3+
"use strict";
4+
5+
6+
var GitHubAPI = require('github')
7+
8+
var gitapi = new GitHubAPI({
9+
version: "3.0.0"
10+
})
11+
12+
13+
14+
module.exports = function github( options ){
15+
var seneca = this
16+
17+
18+
seneca.add(
19+
'role:github,cmd:get',
20+
{
21+
name: { required$:true, string$:true },
22+
giturl: { string$:true }
23+
},
24+
cmd_get)
25+
26+
27+
seneca.add(
28+
'role:github,cmd:query',
29+
{
30+
name: { required$:true, string$:true },
31+
user: { required$:true, string$:true },
32+
repo: { required$:true, string$:true },
33+
},
34+
cmd_query)
35+
36+
37+
seneca.add(
38+
'role:github,cmd:parse',
39+
{
40+
giturl: { required$:true, string$:true },
41+
},
42+
cmd_parse)
43+
44+
45+
46+
function cmd_get( args, done ) {
47+
var seneca = this
48+
var mod_ent = seneca.make$('mod')
49+
50+
var mod_name = args.name
51+
52+
mod_ent.load$( mod_name, function(err,mod){
53+
if( err ) return done(err);
54+
55+
if( mod ) {
56+
return done(null,mod);
57+
}
58+
else if( args.giturl ) {
59+
seneca.act(
60+
'role:github,cmd:parse',
61+
{name:mod_name,giturl:args.giturl},
62+
63+
function(err,out){
64+
if( err ) return done(err);
65+
66+
seneca.act(
67+
'role:github,cmd:query',
68+
{name:mod_name,user:out.user,repo:out.repo},
69+
done)
70+
})
71+
}
72+
else return done();
73+
})
74+
}
75+
76+
77+
function cmd_query( args, done ) {
78+
var seneca = this
79+
var mod_ent = seneca.make$('mod')
80+
81+
var mod_name = args.name
82+
var user = args.user
83+
var repo = args.repo
84+
85+
gitapi.authenticate({
86+
type: "basic",
87+
username: options.token,
88+
password: 'x-oauth-basic'
89+
})
90+
91+
gitapi.repos.get(
92+
{
93+
user: user,
94+
repo: repo
95+
},
96+
function(err,repo){
97+
if( err ) return done(err);
98+
99+
var data
100+
if( repo ) {
101+
data = {
102+
user: args.user,
103+
repo: args.repo,
104+
stars: repo.stargazers_count,
105+
watches: repo.subscribers_count,
106+
forks: repo.forks_count,
107+
last: repo.pushed_at
108+
}
109+
110+
mod_ent.load$(mod_name, function(err,mod){
111+
if( err ) return done(err);
112+
113+
if( mod ) {
114+
return mod.data$(data).save$(done);
115+
}
116+
else {
117+
data.id$ = mod_name
118+
mod_ent.make$(data).save$(done);
119+
}
120+
})
121+
}
122+
else return done()
123+
124+
}
125+
)
126+
}
127+
128+
129+
function cmd_parse( args, done ) {
130+
var seneca = this
131+
132+
var m = /[\/:]([^\/]+?)\/([^\/]+?)(\.git)*$/.exec(args.giturl)
133+
if( m ) {
134+
return done( null, { user:m[1], repo:m[2] })
135+
}
136+
else return done();
137+
}
138+
139+
140+
}

package.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "nodezoo-github",
3+
"version": "0.1.0",
4+
"description": "nodezoo.com micro-service handling github meta data",
5+
"main": "github.js",
6+
"scripts": {
7+
"test": "mocha test/*.test.js"
8+
},
9+
"keywords": [
10+
"nodezoo",
11+
"seneca",
12+
"github",
13+
"micro-service"
14+
],
15+
"author": "Richard Rodger (richard.rodger@nearform.com)",
16+
"license": "MIT",
17+
"dependencies": {
18+
"github": "^0.2.2"
19+
},
20+
"devDependencies": {
21+
"seneca": "^0.5.20",
22+
"seneca-jsonfile-store": "^0.1.9"
23+
}
24+
}

test/data/seneca.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is a jsonfile-store folder.

test/github.test.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/* Copyright (c) 2014 Richard Rodger */
2+
"use strict";
3+
4+
5+
// mocha github.test.js
6+
7+
8+
var seneca = require('seneca')
9+
10+
var assert = require('assert')
11+
12+
13+
function make_errhandler(fin) {
14+
return function(err){ err && fin(err); return true; }
15+
}
16+
17+
18+
describe('github', function() {
19+
20+
var si = seneca({log:'silent',from:'./mine.options.js'})
21+
.use('jsonfile-store')
22+
.use('../github.js')
23+
24+
it('parse', function( fin ) {
25+
si.options({errhandler:make_errhandler(fin)})
26+
27+
si.act(
28+
'role:github,cmd:parse',
29+
{giturl:'git://github.com/rjrodger/norma.git'}, function(err,out){
30+
assert.equal('rjrodger',out.user)
31+
assert.equal('norma',out.repo)
32+
fin()
33+
})
34+
})
35+
36+
37+
it('query', function( fin ) {
38+
si.options({errhandler:make_errhandler(fin)})
39+
40+
si.act(
41+
'role:github,cmd:query',
42+
{name:'norma',user:'rjrodger',repo:'norma'}, function(err,out){
43+
assert.equal(out.id,'norma')
44+
assert.equal(out.repo,'norma')
45+
assert.equal(out.user,'rjrodger')
46+
fin()
47+
})
48+
})
49+
50+
51+
it('get', function( fin ) {
52+
si.options({errhandler:make_errhandler(fin)})
53+
54+
si.make$('mod').load$('gex',function(err,out){
55+
56+
if( out ) {
57+
out.remove$(do_get)
58+
}
59+
else do_get()
60+
61+
function do_get() {
62+
si.act(
63+
'role:github,cmd:get',
64+
{name:'gex',giturl:'https://github.com/rjrodger/gex.git'},
65+
function(err,out){
66+
assert.equal( out.id, 'gex')
67+
assert.equal( out.repo, 'gex')
68+
assert.equal( out.user, 'rjrodger')
69+
fin()
70+
})
71+
}
72+
})
73+
74+
})
75+
76+
77+
})

test/seneca.options.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
github: {
3+
token: 'GITHUB-PERSONAL-ACCESS-TOKEN'
4+
},
5+
"jsonfile-store":{
6+
folder: __dirname+'/data'
7+
}
8+
}

0 commit comments

Comments
 (0)