Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions packages/client/src/tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,32 @@ export default class Tools {
return Array.from(conflicts);
}

/**
* Check if a profile meets the minimum requirements specified by a venue.
* Supported keys in minRequirements:
* - 'history': profile must have at least 1 history entry
* - 'relations': profile must have at least 1 relations entry
* - 'expertise': profile must have at least 1 expertise entry
* - 'publications': profile must have at least 1 publication
* - 'active': profile must be active
*
* @param {object} profile - Profile to check against requirements.
* @param {object} minRequirements - An object mapping requirement name to true/false.
* @returns {boolean} - Returns true if profile meets all requirements, false otherwise.
*/
checkProfileMinimumRequirements(profile, minRequirements) {
for (const [field, required] of Object.entries(minRequirements)) {
if (!required) continue;

if (field === 'relations' || field === 'expertise' || field === 'history' || field === 'publications') {
if (!profile.content?.[field]?.length) return false;
} else if (field === 'active') {
if (!profile.state?.toLowerCase().includes('active')) return false;
}
} // else: unsupported field, ignore
return true;
}

/**
* Find publications after the cut off year.
*
Expand Down
89 changes: 89 additions & 0 deletions packages/client/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1933,5 +1933,94 @@ describe('OpenReview Client', function () {

});

it('should check profile minimum requirements', async function () {
const tools = this.superClient.tools;

const profile = {
id: '~User1',
state: 'Active',
content: {
history: [{ position: 'PhD Student', institution: { name: 'MIT' } }],
relations: [{ name: 'Jane Doe', relation: 'Advisor' }],
expertise: [{ keywords: ['machine learning'] }],
publications: [
{ id: 'note1', readers: ['everyone'] },
{ id: 'note2', readers: ['ICLR.cc/2023/Conference'] }
]
}
};

// Required field set to false is skipped → true
const profileNoContent = { id: '~User2', state: 'Blocked', content: {} };
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { relations: false }), true);

// history: has entries → true
assert.equal(tools.checkProfileMinimumRequirements(profile, { history: true }), true);

// history: missing → false
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { history: true }), false);

// history: empty array → false
const profileEmptyHistory = { id: '~User2', content: { history: [] } };
assert.equal(tools.checkProfileMinimumRequirements(profileEmptyHistory, { history: true }), false);

// relations: missing → false
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { relations: true }), false);

// relations: has entries → true
assert.equal(tools.checkProfileMinimumRequirements(profile, { relations: true }), true);

// relations: empty array → false
const profileEmptyRelations = { id: '~User2', content: { relations: [] } };
assert.equal(tools.checkProfileMinimumRequirements(profileEmptyRelations, { relations: true }), false);

// expertise: has entries → true
assert.equal(tools.checkProfileMinimumRequirements(profile, { expertise: true }), true);

// expertise: missing → false
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { expertise: true }), false);

// publications: has at least one public entry → true
assert.equal(tools.checkProfileMinimumRequirements(profile, { publications: true }), true);

// publications: empty array → false
const profileNoPubs = { id: '~User2', content: { publications: [] } };
assert.equal(tools.checkProfileMinimumRequirements(profileNoPubs, { publications: true }), false);

// publications: missing from content → false
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { publications: true }), false);

// active: state is active → true
assert.equal(tools.checkProfileMinimumRequirements(profile, { active: true }), true);

// active: state is not active → false
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { active: true }), false);

// Multiple requirements: all met → true
assert.equal(
tools.checkProfileMinimumRequirements(profile, { relations: true, expertise: true, publications: true }),
true
);

// Multiple requirements: one fails → false
const profileMissingOnlyPubs = {
id: '~User2',
state: 'Active',
content: {
history: [{ position: 'PhD Student', institution: { name: 'MIT' } }],
relations: [{ name: 'Jane Doe', relation: 'Advisor' }],
expertise: [{ keywords: ['nlp'] }],
publications: []
}
};
assert.equal(
tools.checkProfileMinimumRequirements(profileMissingOnlyPubs, { history: true, relations: true, expertise: true, publications: true, active: true }),
false
);

// Unknown key is ignored → true regardless of whether it exists in profile.content
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { foo: true }), true);
assert.equal(tools.checkProfileMinimumRequirements(profileNoContent, { foo: false }), true);
});
}
);
Loading