Skip to content

Commit

Permalink
add excludes option
Browse files Browse the repository at this point in the history
  • Loading branch information
haarg committed Sep 14, 2024
1 parent aac0148 commit cd83653
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 10 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ List of files to search for prerequisites. Supported formats are:

Defaults to `MYMETA.json MYMETA.yml META.json META.yml Makefile cpanfile`.

### `excludes`

A list of regular expressions of prerequisites to exclude. One pattern per line.

## Outputs

### `perl`
Expand Down
3 changes: 3 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ inputs:
description: 'Source files to check for prerequisites'
required: false
default: 'MYMETA.json MYMETA.yml META.json META.yml Makefile cpanfile'
exclude:
description: 'Patterns to exclude from returned prerequisites'
required: false

outputs:
perl:
Expand Down
24 changes: 18 additions & 6 deletions dist/action.js
Original file line number Diff line number Diff line change
Expand Up @@ -25324,9 +25324,15 @@ var parseMetaYAML = async (content) => {
};

// src/get-prereqs.mjs
var filterPrereqs = ({ prereqs, phases, relationships, features }) => {
var filterPrereqs = ({
prereqs,
phases,
relationships,
features,
excludes
}) => {
return prereqs.filter(
(prereq) => phases.has(prereq.phase) && relationships.has(prereq.relationship) && (!prereq.feature || features.includes(prereq.feature))
(prereq) => phases.has(prereq.phase) && relationships.has(prereq.relationship) && (!prereq.feature || features.includes(prereq.feature)) && !excludes.filter((ex) => ex.exec(prereq.prereq)).length
);
};
var parsers = [
Expand Down Expand Up @@ -25358,7 +25364,8 @@ var getPrereqs = async ({
phases = ["build", "test", "runtime"],
relationships = ["requires"],
features = [],
sources
sources,
excludes = []
}) => {
for (const source of sources) {
const parser = parserFor(source);
Expand All @@ -25373,11 +25380,13 @@ var getPrereqs = async ({
}
}
const content = fh.readFile({ encoding: "utf8" });
const allPrereqs = await parser(content);
const filteredPrereqs = filterPrereqs({
prereqs: await parser(content),
prereqs: allPrereqs,
phases: new Set(phases),
relationships: new Set(relationships),
features: new Set(features)
features: new Set(features),
excludes
}).toSorted(sortByPrereq);
const prereqs = {};
for (const { prereq, version: version2 } of filteredPrereqs) {
Expand All @@ -25398,15 +25407,18 @@ var run = async () => {
const relationshipsInput = import_core.default.getInput("relationships");
const featuresInput = import_core.default.getInput("features");
const sourcesInput = import_core.default.getInput("sources");
const excludeInput = import_core.default.getMultilineInput("exclude");
const phases = new Set(phasesInput.split(/\s+/));
const relationships = new Set(relationshipsInput.split(/\s+/));
const features = new Set(featuresInput.split(/\s+/));
const sources = sourcesInput.split(/\s+/);
const excludes = excludeInput.filter((p) => p.length).map((p) => new RegExp(p));
const { perl, ...prereqs } = await getPrereqs({
phases,
relationships,
features,
sources
sources,
excludes
});
if (perl) {
import_core.default.setOutput("perl", dottedVersion(perl));
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "get-prereqs",
"version": "1.1.0",
"version": "1.2.0",
"description": "Get prereqs for local dist",
"main": "src/get-prereqs.mjs",
"scripts": {
Expand Down
17 changes: 14 additions & 3 deletions src/get-prereqs.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,19 @@ import {
} from './parser/meta.mjs';
import { mergeVersions } from './cpan-versions.mjs';

const filterPrereqs = ({ prereqs, phases, relationships, features }) => {
const filterPrereqs = ({
prereqs,
phases,
relationships,
features,
excludes,
}) => {
return prereqs.filter(
prereq =>
phases.has(prereq.phase)
&& relationships.has(prereq.relationship)
&& (!prereq.feature || features.includes(prereq.feature)),
&& (!prereq.feature || features.includes(prereq.feature))
&& !excludes.filter(ex => ex.exec(prereq.prereq)).length,
);
};

Expand Down Expand Up @@ -53,6 +60,7 @@ export const getPrereqs = async ({
relationships = ['requires'],
features = [],
sources,
excludes = [],
}) => {
for (const source of sources) {
const parser = parserFor(source);
Expand All @@ -72,11 +80,14 @@ export const getPrereqs = async ({

const content = fh.readFile({ encoding: 'utf8' });

const allPrereqs = await parser(content);

const filteredPrereqs = filterPrereqs({
prereqs: await parser(content),
prereqs: allPrereqs,
phases: new Set(phases),
relationships: new Set(relationships),
features: new Set(features),
excludes,
}).toSorted(sortByPrereq);

const prereqs = {};
Expand Down
3 changes: 3 additions & 0 deletions src/main.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,20 @@ export const run = async () => {
const relationshipsInput = core.getInput('relationships');
const featuresInput = core.getInput('features');
const sourcesInput = core.getInput('sources');
const excludeInput = core.getMultilineInput('exclude');

const phases = new Set(phasesInput.split(/\s+/));
const relationships = new Set(relationshipsInput.split(/\s+/));
const features = new Set(featuresInput.split(/\s+/));
const sources = sourcesInput.split(/\s+/);
const excludes = excludeInput.filter(p => p.length).map(p => new RegExp(p));

const { perl, ...prereqs } = await getPrereqs({
phases,
relationships,
features,
sources,
excludes,
});

if (perl) {
Expand Down
1 change: 1 addition & 0 deletions test/action.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ describe('GitHub action', function () {
phases: 'test',
relationships: 'recommends',
features: '',
excludes: '',
});
expect(outputs).to.be.deep.equal({
'prereqs': 'CPAN::Meta~2.120900\n',
Expand Down
22 changes: 22 additions & 0 deletions test/get-prereqs.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,26 @@ describe('getPrereqs', function () {
'inc::bootstrap': '>=0',
});
});

it('excludes applies correctly', async function () {
const filename = joinPath(__dirname, 'corpus', 'dist.ini');
const prereqs = await getPrereqs({
sources: [filename],
phases: ['author'],
excludes: [/^inc::/],
});
expect(prereqs).to.be.deep.equal({
'Dist::Zilla': '>=5.0',
'Dist::Zilla::Plugin::GatherFile': '>=0',
'Dist::Zilla::Plugin::Git::GatherDir': '>=5',
'Dist::Zilla::Plugin::PodWeaver': '>=0',
'Dist::Zilla::PluginBundle::Basic': '>=0,>=6',
'Dist::Zilla::PluginBundle::ConfigSlicer': '>=0',
'Dist::Zilla::PluginBundle::Filter': '>=2',
'Dist::Zilla::PluginBundle::Git::VersionManager': '>=0',
'Pod::Weaver::Plugin::StopWords': '>=0',
'Pod::Weaver::Section::Contributors': '>=0',
'Software::License::Perl_5': '>=0',
});
});
});

0 comments on commit cd83653

Please sign in to comment.