Skip to content

Commit

Permalink
config: take a wgScriptPath parameter
Browse files Browse the repository at this point in the history
addressing #69
  • Loading branch information
maxlath committed May 31, 2021
1 parent d42636f commit 6d46985
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 11 deletions.
3 changes: 3 additions & 0 deletions docs/how_to.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ const generalConfig = {
// A Wikibase instance is required
instance: 'https://www.wikidata.org',

// The instance script path, used to find the API endpoint is usually `/w`, as with https://www.wikidata.org/w/api.php for instance
wgScriptPath: '/w',

// One authorization mean is required (unless in anonymous mode, see below)
credentials: {
// either a username and password
Expand Down
8 changes: 6 additions & 2 deletions lib/parse_instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@ module.exports = config => {

if (!instance) throw error_.new('missing config parameter: instance', { config })

let { wgScriptPath = 'w' } = config

wgScriptPath = wgScriptPath.replace(/^\//, '')

config.instance = instance
.replace(/\/$/, '')
.replace('/w/api.php', '')
.replace(`/${wgScriptPath}/api.php`, '')

config.instanceApiEndpoint = `${config.instance}/w/api.php`
config.instanceApiEndpoint = `${config.instance}/${wgScriptPath}/api.php`
}
4 changes: 2 additions & 2 deletions lib/request/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module.exports = (action, data, config) => {
}

const actionPost = (action, data, config) => authData => {
const { instance, userAgent, bot, summary, baserevid, tags, maxlag, anonymous, autoRetry } = config
const { instanceApiEndpoint, userAgent, bot, summary, baserevid, tags, maxlag, anonymous, autoRetry } = config

const query = { action, format: 'json' }

Expand All @@ -37,7 +37,7 @@ const actionPost = (action, data, config) => authData => {
}

const params = {
url: buildUrl(`${instance}/w/api.php`, query),
url: buildUrl(instanceApiEndpoint, query),
headers: {
'User-Agent': userAgent
},
Expand Down
2 changes: 1 addition & 1 deletion lib/request_wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ module.exports = (fn, generalConfig) => async (params, reqConfig) => {

if (!data.title) return post(action, data, config)

const title = await resolveTitle(data.title, config.instance)
const title = await resolveTitle(data.title, config.instanceApiEndpoint)
data.title = title
return post(action, data, config)
}
8 changes: 4 additions & 4 deletions lib/resolve_title.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ const { isEntityId } = require('wikibase-sdk')
const getJson = require('./request/get_json')
let prefixesMapPromise

module.exports = async (title, instance) => {
module.exports = async (title, instanceApiEndpoint) => {
if (!isEntityId(title)) return
prefixesMapPromise = prefixesMapPromise || getPrefixesMap(instance)
prefixesMapPromise = prefixesMapPromise || getPrefixesMap(instanceApiEndpoint)
const prefixesMap = await prefixesMapPromise
const idFirstLetter = title[0]
const prefix = prefixesMap[idFirstLetter]
return prefix === '' ? title : `${prefix}:${title}`
}

const getPrefixesMap = instance => {
const infoUrl = `${instance}/w/api.php?action=query&meta=siteinfo&siprop=namespaces&format=json`
const getPrefixesMap = instanceApiEndpoint => {
const infoUrl = `${instanceApiEndpoint}?action=query&meta=siteinfo&siprop=namespaces&format=json`
return getJson(infoUrl)
.then(parsePrefixesMap)
}
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/utils/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const resolveTitle = require('lib/resolve_title')

const getRevisions = async ({ id, customInstance, limit, props }) => {
customInstance = customInstance || instance
const title = await resolveTitle(id, customInstance)
const title = await resolveTitle(id, `${customInstance}/w/api.php`)
const customWbk = WBK({ instance: customInstance })
const url = customWbk.getRevisions(title, { limit, props })
const { query } = await fetch(url).then(res => res.json())
Expand Down
11 changes: 10 additions & 1 deletion tests/unit/parse_instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,21 @@ describe('parseInstance', () => {
parseInstance.bind(null, {}).should.throw('missing config parameter: instance')
})

it('return an instance and sparql endpoint', () => {
it('should return an instance and sparql endpoint', () => {
const configA = { instance }
const configB = { instance: apiEndpoint }
parseInstance(configA)
parseInstance(configB)
configA.instance.should.equal(instance)
configB.instance.should.equal(instance)
})

it('should allow to customize the script path', () => {
const configA = { instance, wgScriptPath: 'foo' }
const configB = { instance, wgScriptPath: '/foo' }
parseInstance(configA)
configA.instanceApiEndpoint.should.equal(`${instance}/foo/api.php`)
parseInstance(configB)
configB.instanceApiEndpoint.should.equal(`${instance}/foo/api.php`)
})
})

0 comments on commit 6d46985

Please sign in to comment.