Skip to content

Commit

Permalink
feat(getLastRelease): Move getLastRelease to plugin. Remove npm tag
Browse files Browse the repository at this point in the history
Move getLastRelease into it's very own plugin (@semantic-release/last-release-npm),
which this project now depends on.

BREAKING CHANGE: Remove npmTag from output of getLastRelease. It wasn't used anywhere.
Refs semantic-release#56, semantic-release#51
  • Loading branch information
ariporad committed Aug 17, 2015
1 parent 77349fc commit a051c6f
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 92 deletions.
27 changes: 3 additions & 24 deletions src/lib/last-release.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,5 @@
const SemanticReleaseError = require('@semantic-release/error')
module.exports = function (config, cb) {
const {plugins} = config

const npmlog = require('npmlog')
const RegClient = require('npm-registry-client')

module.exports = function ({pkg, npm}, cb) {
npmlog.level = npm.loglevel || 'error'
const client = new RegClient({log: npmlog})

client.get(`${npm.registry}${pkg.name.replace('/', '%2F')}`, {
auth: npm.auth
}, (err, data) => {
if (err && err.statusCode === 404) return cb(null, {})
if (err) return cb(err)

const version = data['dist-tags'][npm.tag]

if (!version) return cb(new SemanticReleaseError(`There is no release with the dist-tag "${npm.tag}" yet. Tag a version first.`, 'ENODISTTAG'))

cb(null, {
version,
gitHead: data.versions[version].gitHead,
tag: npm.tag
})
})
plugins.getLastRelease(config, cb)
}
3 changes: 2 additions & 1 deletion src/lib/plugins.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ let exports = module.exports = function (options) {
analyzeCommits: exports.normalize(options.analyzeCommits, '@semantic-release/commit-analyzer'),
generateNotes: exports.normalize(options.generateNotes, '@semantic-release/release-notes-generator'),
verifyConditions: exports.normalize(options.verifyConditions, '@semantic-release/condition-travis'),
verifyRelease: exports.normalize(options.verifyRelease, './plugin-noop')
verifyRelease: exports.normalize(options.verifyRelease, './plugin-noop'),
getLastRelease: exports.normalize(options.getLastRelease, '@semantic-release/last-release-npm')
}
}

Expand Down
87 changes: 21 additions & 66 deletions test/specs/last-release.js
Original file line number Diff line number Diff line change
@@ -1,77 +1,32 @@
const { defaults } = require('lodash')
const test = require('tap').test

require('../mocks/registry')
const lastRelease = require('../../dist/lib/last-release')

const npm = {
registry: 'http://registry.npmjs.org/',
tag: 'latest'
}

test('last release from registry', (t) => {
t.plan(5)
test('last release from plugin', (t) => {
t.plan(1)

t.test('get release from package name', (tt) => {
lastRelease({
const config = {
pkg: {name: 'available'},
npm
}, (err, release) => {
tt.error(err)
tt.is(release.version, '1.33.7', 'version')
tt.is(release.gitHead, 'HEAD', 'gitHead')
tt.is(release.tag, 'latest', 'dist-tag')

tt.end()
})
})

t.test('get release from a tagged package\'s name', (tt) => {
lastRelease({
pkg: {name: 'tagged'},
npm: defaults({tag: 'foo'}, npm)
}, (err, release) => {
tt.error(err)
tt.is(release.version, '0.8.15', 'version')
tt.is(release.gitHead, 'bar', 'gitHead')
tt.is(release.tag, 'foo', 'dist-tag')

tt.end()
})
})

t.test('get error from an untagged package\'s name', (tt) => {
lastRelease({
pkg: {name: 'untagged'},
npm: defaults({tag: 'bar'}, npm)
}, (err) => {
tt.is(err.code, 'ENODISTTAG', 'error')

tt.end()
})
})

t.test('get release from scoped package name', (tt) => {
lastRelease({
pkg: {name: '@scoped/available'},
npm
}, (err, release) => {
tt.error(err)
tt.is(release.version, '1.33.7', 'version')
npm: {
registry: 'http://registry.npmjs.org/',
tag: 'latest'
},
something: 'else',
foo: 'bar',
plugins: {
getLastRelease: (config, cb) => {
tt.is(config.something, 'else', 'config')
tt.is(config.foo, 'bar', 'config')
cb('pizza', { version: '1.0.0', gitHead: 'HEAD' })
}
}
}

lastRelease(config, (err, release) => {
tt.is(err, 'pizza', 'error')
tt.is(release.version, '1.0.0', 'version')
tt.is(release.gitHead, 'HEAD', 'gitHead')
tt.is(release.tag, 'latest', 'dist-tag')

tt.end()
})
})

t.test('get nothing from not yet published package name', (tt) => {
lastRelease({
pkg: {name: 'unavailable'},
npm
}, (err, release) => {
tt.error(err)
tt.is(release.version, undefined, 'no version')

tt.end()
})
Expand Down
9 changes: 8 additions & 1 deletion test/specs/pre.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,16 @@ const pre = proxyquire('../../dist/pre', {
'child_process': require('../mocks/child-process')
})

const versions = {
available: '1.0.0'
}

const plugins = {
verifyRelease: (release, cb) => cb(null, release),
analyzeCommits: (commits, cb) => cb(null, 'major')
analyzeCommits: (commits, cb) => cb(null, 'major'),
getLastRelease: ({ pkg }, cb) => {
cb(null, { version: versions[pkg.name] || null, gitHead: 'HEAD' })
}
}

const npm = {
Expand Down

0 comments on commit a051c6f

Please sign in to comment.