Compare commits

...

5 Commits

Author SHA1 Message Date
fengmk2
ee79a80fc0 Release 3.0.0-alpha.11 2017-08-17 13:45:51 +08:00
fengmk2
ee9bf331c4 fix: list since limit to 2 days 2017-08-17 00:44:45 -05:00
fengmk2
5b63dbe514 feat: list all private packages names 2017-08-17 00:44:45 -05:00
fengmk2
32434b22dc feat: trigger package:sync event with changedVersions 2017-08-17 00:44:45 -05:00
fengmk2
bb77186bbc test: should show deprecated info on abbreviatedMeta request (#1193) 2017-06-19 17:57:58 +08:00
12 changed files with 177 additions and 151 deletions

View File

@@ -3,7 +3,6 @@ language: node_js
node_js:
- '4'
- '6'
- '7'
- '8'
addons:
- postgresql: '9.3'

View File

@@ -1,19 +1,5 @@
/**!
* cnpmjs.org - controllers/registry/package/deprecate.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var packageService = require('../../../services/package');
module.exports = deprecateVersions;
@@ -51,10 +37,10 @@ function* deprecateVersions() {
}
yield updateTasks;
// update last modified
yield* packageService.updateModuleLastModified(name);
yield packageService.updateModuleLastModified(name);
this.status = 201;
this.body = {
ok: true
ok: true,
};
}

View File

@@ -1,19 +1,5 @@
/**!
* cnpmjs.org - controllers/registry/package/list_all.js
*
* Copyright(c) fengmk2 and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var packageService = require('../../../services/package');
// GET /-/all

View File

@@ -1,21 +1,32 @@
/**!
* Copyright(c) cnpm and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.com)
*/
'use strict';
/**
* Module dependencies.
*/
var packageService = require('../../../services/package');
const packageService = require('../../../services/package');
const config = require('../../../config');
// GET /-/short
// List all packages names only
// List public all packages names only
module.exports = function* () {
if (this.query.private_only) {
const tasks = [];
for (let i = 0; i < config.scopes.length; i++) {
const scope = config.scopes[i];
tasks.push(packageService.listPrivateModulesByScope(scope));
}
if (config.privatePackages && config.privatePackages.length > 0) {
tasks.push(packageService.listModules(config.privatePackages));
}
const results = yield tasks;
const names = [];
for (const rows of results) {
for (const row of rows) {
names.push(row.name);
}
}
this.body = names;
return;
}
this.body = yield packageService.listAllPublicModuleNames();
};

View File

@@ -3,6 +3,7 @@
var packageService = require('../../../services/package');
var A_WEEK_MS = 3600000 * 24 * 7;
var TWA_DAYS_MS = 3600000 * 24 * 2;
// GET /-/all/since?stale=update_after&startkey={key}
// List packages names since startkey
@@ -30,9 +31,9 @@ module.exports = function* listSince() {
var updated = Date.now();
if (updated - startkey > A_WEEK_MS) {
startkey = updated - A_WEEK_MS;
console.warn('[%s] list modules since time out of range: query: %j, ip: %s',
Date(), query, this.ip);
startkey = updated - TWA_DAYS_MS;
console.warn('[%s] list modules since time out of range: query: %j, ip: %s, limit to %s',
Date(), query, this.ip, startkey);
}
var names = yield packageService.listPublicModuleNamesSince(startkey);

View File

@@ -21,6 +21,7 @@ var common = require('../lib/common');
var npmSerivce = require('../services/npm');
var packageService = require('../services/package');
var logService = require('../services/module_log');
var hook = require('../services/hook');
var User = require('../models').User;
var os = require('os');
@@ -105,7 +106,7 @@ SyncModuleWorker.prototype._saveLog = function () {
var logstr = that._log;
that._log = '';
co(function* () {
yield* logService.append(that._logId, logstr);
yield logService.append(that._logId, logstr);
}).then(function () {
that._loging = false;
if (that._log) {
@@ -589,6 +590,8 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
}
}
// any properties changed versions
var changedVersions = {};
var missingVersions = [];
var missingTags = [];
var missingDescriptions = [];
@@ -734,6 +737,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
id: exists.id,
description: version.description
});
changedVersions[v] = 1;
}
if (config.enableAbbreviatedMetadata) {
@@ -751,6 +755,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
id: exists.id,
readme: version.readme,
});
changedVersions[v] = 1;
}
}
@@ -760,6 +765,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
id: exists.id,
deprecated: version.deprecated,
});
changedVersions[v] = 1;
}
if (exists.package.deprecated && !version.deprecated) {
// remove deprecated info
@@ -767,6 +773,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
id: exists.id,
deprecated: undefined,
});
changedVersions[v] = 1;
}
// find missing abbreviatedMetadata
if (abbreviatedMetadata) {
@@ -791,6 +798,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
Object.assign(version, abbreviatedMetadata);
}
missingVersions.push(version);
changedVersions[v] = 1;
}
// find out deleted versions
@@ -1148,6 +1156,21 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
yield syncAbbreviatedMetadatas();
yield syncDeprecatedsOnExistsModuleAbbreviated();
changedVersions = Object.keys(changedVersions);
// hooks
const envelope = {
event: 'package:sync',
name: name,
type: 'package',
version: null,
hookOwner: null,
payload: {
changedVersions,
},
change: null,
};
hook.trigger(envelope);
return syncedVersionNames;
};

View File

@@ -1,20 +1,5 @@
/**!
* cnpmjs.org - controllers/web/package/list_privates.js
*
* Copyright(c) cnpmjs.org and other contributors.
* MIT Licensed
*
* Authors:
* dead_horse <dead_horse@qq.com> (http://deadhorse.me)
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var packageService = require('../../../services/package');
var config = require('../../../config');

View File

@@ -1,6 +1,6 @@
{
"name": "cnpmjs.org",
"version": "3.0.0-alpha.8",
"version": "3.0.0-alpha.11",
"description": "Private npm registry and web for Enterprise, base on MySQL and Simple Store Service",
"main": "index.js",
"scripts": {
@@ -87,8 +87,7 @@
"web": "https://github.com/cnpm/cnpmjs.org"
},
"bugs": {
"url": "https://github.com/cnpm/cnpmjs.org/issues",
"email": "fengmk2@gmail.com"
"url": "https://github.com/cnpm/cnpmjs.org/issues"
},
"keywords": [
"cnpmjs.org",

View File

@@ -27,7 +27,7 @@ function* getFirstSyncPackages(lastSyncModule) {
module.exports = function* sync() {
var syncTime = Date.now();
var info = yield* totalService.getTotalInfo();
var info = yield totalService.getTotalInfo();
if (!info) {
throw new Error('can not found total info');
}
@@ -36,7 +36,7 @@ module.exports = function* sync() {
logger.syncInfo('Last sync time %s', new Date(info.last_sync_time));
if (!info.last_sync_time) {
logger.syncInfo('First time sync all packages from official registry');
packages = yield* getFirstSyncPackages(info.last_sync_module);
packages = yield getFirstSyncPackages(info.last_sync_module);
} else {
var result = yield npmService.fetchUpdatesSince(info.last_sync_time);
syncTime = result.lastModified;

View File

@@ -1,19 +1,6 @@
/**!
* cnpmjs.org - test/controllers/registry/package/deprecate.test.js
*
* Copyright(c) cnpmjs.org and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
var assert = require('assert');
var should = require('should');
var request = require('supertest');
var mm = require('mm');
@@ -105,56 +92,61 @@ describe('controllers/registry/package/deprecate.test.js', function () {
});
});
it('should deprecate version@<1.0.0', function (done) {
request(app.listen())
.put('/' + pkgname)
.set('authorization', utils.adminAuth)
.send({
name: pkgname,
versions: {
'1.0.0': {
version: '1.0.0'
},
'0.0.1': {
deprecated: 'mock test deprecated message 0.0.1'
},
'0.0.2': {
deprecated: 'mock test deprecated message 0.0.2'
it('should deprecate version@<1.0.0', function* () {
yield request(app.listen())
.put('/' + pkgname)
.set('authorization', utils.adminAuth)
.send({
name: pkgname,
versions: {
'1.0.0': {
version: '1.0.0'
},
'0.0.1': {
deprecated: 'mock test deprecated message 0.0.1'
},
'0.0.2': {
deprecated: 'mock test deprecated message 0.0.2'
}
}
}
})
.expect({
ok: true
})
.expect(201, function (err) {
should.not.exist(err);
done = pedding(3, done);
})
.expect({
ok: true
})
.expect(201);
request(app.listen())
yield request(app.listen())
.get('/' + pkgname + '/0.0.1')
.expect(200, function (err, res) {
should.not.exist(err);
.expect(200)
.expect(res => {
res.body.deprecated.should.equal('mock test deprecated message 0.0.1');
done();
});
request(app.listen())
yield request(app.listen())
.get('/' + pkgname + '/0.0.2')
.expect(200, function (err, res) {
should.not.exist(err);
.expect(200)
.expect(res => {
res.body.deprecated.should.equal('mock test deprecated message 0.0.2');
done();
});
// not change 1.0.0
request(app.listen())
// not change 1.0.0
yield request(app.listen())
.get('/' + pkgname + '/1.0.0')
.expect(200, function (err, res) {
should.not.exist(err);
res.body.deprecated.should.equal('');
done();
.expect(200)
.expect(res => {
assert(!res.body.deprecated);
});
// show deprecated info on abbreviatedMeta request
yield request(app.listen())
.get('/' + pkgname)
.set('accept', 'application/vnd.npm.install-v1+json')
.expect(200)
.expect(res => {
assert(res.body.versions['0.0.2'].deprecated === 'mock test deprecated message 0.0.2');
assert(res.body.versions['0.0.1'].deprecated === 'mock test deprecated message 0.0.1');
assert(!res.body.versions['1.0.0'].deprecated);
});
});
});
it('should 404 deprecate not exists version', function (done) {

View File

@@ -1,39 +1,46 @@
/**!
* cnpmjs.org - test/controllers/registry/package/list_shorts.test.js
*
* Copyright(c) cnpmjs.org and other contributors.
* MIT Licensed
*
* Authors:
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
*/
'use strict';
/**
* Module dependencies.
*/
const pedding = require('pedding');
const should = require('should');
const request = require('supertest');
const mm = require('mm');
const config = require('../../../../config');
const app = require('../../../../servers/registry');
const utils = require('../../../utils');
var should = require('should');
var request = require('supertest');
var mm = require('mm');
var config = require('../../../../config');
var app = require('../../../../servers/registry');
var utils = require('../../../utils');
describe('controllers/registry/package/list_shorts.test.js', function () {
describe('test/controllers/registry/package/list_shorts.test.js', () => {
afterEach(mm.restore);
before(function (done) {
before(done => {
done = pedding(2, done);
const pkg = utils.getPackage('@cnpmtest/testmodule-list-shorts1', '1.0.0', utils.admin);
pkg.versions['1.0.0'].dependencies = {
'@cnpmtest/testmodule-list-shorts2': '~1.0.0',
};
request(app.listen())
.put('/' + pkg.name)
.set('authorization', utils.adminAuth)
.send(pkg)
.expect(201, done);
const pkg2 = utils.getPackage('@cnpmtest/testmodule-list-shorts2', '1.0.0', utils.admin);
request(app.listen())
.put('/' + pkg2.name)
.set('authorization', utils.adminAuth)
.send(pkg2)
.expect(201, done);
});
before(done => {
mm(config, 'syncModel', 'all');
utils.sync('pedding', done);
});
describe('GET /-/short', function () {
it('should get 200', function (done) {
describe('GET /-/short', () => {
it('should get 200', done => {
request(app)
.get('/-/short')
.expect(200, function (err, res) {
.expect(200, (err, res) => {
should.not.exist(err);
res.body.should.be.an.Array;
res.body.length.should.above(0);
@@ -41,5 +48,17 @@ describe('controllers/registry/package/list_shorts.test.js', function () {
done();
});
});
it('should list private packages only', done => {
request(app)
.get('/-/short?private_only=true')
.expect(200, (err, res) => {
should.not.exist(err);
res.body.should.be.an.Array;
res.body.length.should.above(0);
res.body.indexOf('@cnpmtest/testmodule-list-shorts1').should.above(-1);
done();
});
});
});
});

View File

@@ -56,6 +56,11 @@ describe('test/controllers/sync_module_worker.test.js', () => {
it('should sync public scoped package', function* () {
mm(config, 'registryHost', '');
mm(config, 'sourceNpmRegistry', 'https://registry.npmjs.org');
let envelope;
mm(config, 'globalHook', function* (e) {
envelope = e;
});
var worker = new SyncModuleWorker({
name: '@sindresorhus/df',
username: 'fengmk2',
@@ -64,6 +69,10 @@ describe('test/controllers/sync_module_worker.test.js', () => {
worker.start();
var end = thunkify.event(worker, 'end');
yield end();
assert(envelope);
assert(envelope.event === 'package:sync');
assert(envelope.name === '@sindresorhus/df');
assert(envelope.payload.changedVersions.length > 0);
// sync again
var worker = new SyncModuleWorker({
@@ -73,6 +82,10 @@ describe('test/controllers/sync_module_worker.test.js', () => {
worker.start();
var end = thunkify.event(worker, 'end');
yield end();
assert(envelope);
assert(envelope.event === 'package:sync');
assert(envelope.name === '@sindresorhus/df');
assert(envelope.payload.changedVersions.length === 0);
var tgzUrl;
function checkResult() {
@@ -129,7 +142,7 @@ describe('test/controllers/sync_module_worker.test.js', () => {
it('should sync upstream first', function* () {
mm(config, 'sourceNpmRegistryIsCNpm', true);
var log = yield* logService.create({
var log = yield logService.create({
name: 'mk2testmodule',
username: 'fengmk2',
});
@@ -172,12 +185,12 @@ describe('test/controllers/sync_module_worker.test.js', () => {
});
it('should sync unpublished module by name', function* () {
var result = yield* SyncModuleWorker.sync('tnpm', 'fengmk2');
var result = yield SyncModuleWorker.sync('tnpm', 'fengmk2');
result.should.be.Number;
});
it('should sync not exists module', function* () {
var result = yield* SyncModuleWorker.sync('tnpm-not-exists', 'fengmk2');
var result = yield SyncModuleWorker.sync('tnpm-not-exists', 'fengmk2');
result.should.be.Number;
});
@@ -199,7 +212,7 @@ describe('test/controllers/sync_module_worker.test.js', () => {
it('should sync missing description, readme', function* () {
var listModulesByName = packageService.listModulesByName;
mm(packageService, 'listModulesByName', function* (name) {
var mods = yield* listModulesByName.call(packageService, name);
var mods = yield listModulesByName.call(packageService, name);
mods.forEach(function (mod) {
mod.description = null;
mod.package.readme = '';
@@ -207,13 +220,23 @@ describe('test/controllers/sync_module_worker.test.js', () => {
return mods;
});
let envelope;
mm(config, 'globalHook', function* (e) {
envelope = e;
// console.log(envelope);
});
var worker = new SyncModuleWorker({
name: 'byte',
name: 'pedding',
username: 'fengmk2',
noDep: true,
});
worker.start();
var end = thunkify.event(worker, 'end');
yield end();
assert(envelope);
assert(envelope.name === 'pedding');
assert(envelope.event === 'package:sync');
assert(envelope.payload.changedVersions.length > 0);
});
it('should delete not exists version', function* () {
@@ -324,6 +347,7 @@ describe('test/controllers/sync_module_worker.test.js', () => {
const worker = new SyncModuleWorker({
name: 'ms',
username: 'fengmk2',
noDep: true,
});
worker.start();
const end = thunkify.event(worker, 'end');
@@ -343,6 +367,7 @@ describe('test/controllers/sync_module_worker.test.js', () => {
var worker = new SyncModuleWorker({
name: 'ms',
username: 'fengmk2',
noDep: true,
});
worker.start();
const end = thunkify.event(worker, 'end');