diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21c24bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +# Ignore node_module +**/node_modules/ diff --git a/.gitlab/.gitlab-ci.yml b/.gitlab/.gitlab-ci.yml index beaa3cc..eb4b15f 100644 --- a/.gitlab/.gitlab-ci.yml +++ b/.gitlab/.gitlab-ci.yml @@ -10,22 +10,29 @@ variables: RELEASE_VERSION: v0.$CI_PIPELINE_IID PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${RELEASE_VERSION}" -# TODO: to reenable later # Jobs from here run on Merge Requests as prerequisite for merging. .manifest-job: &manifest stage: Manifest + image: node:latest rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - # TODO: refacto this (as Reference or something else) - ${ENTRY_FOLDER}/${PACKAGE_NAME}/* script: - - echo generating manifest for ${ENTRY_FOLDER}/${PACKAGE_NAME} + - cd src/build_job + - npm install + - npm run start + - cat ../../${ENTRY_FOLDER}/${PACKAGE_NAME}/theme.json + artifacts: + paths: + - ${ENTRY_FOLDER}/${PACKAGE_NAME}/theme.json + when: on_success + expire_in: "1 hour" -# manifest-job/valid_set: -# variables: -# PACKAGE_NAME: "valid_set" -# <<: *gen-manifest +manifest-job/valid_set: + variables: + PACKAGE_NAME: "valid_set" + <<: *manifest .test-images-job: &test-images stage: Test diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7ac5fa6 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,30 @@ +{ + // Utilisez IntelliSense pour en savoir plus sur les attributs possibles. + // Pointez pour afficher la description des attributs existants. + // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Tester avec Valid_set", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/src/test_manifest_job/node_modules/mocha/bin/_mocha", + "args": [ + "${workspaceFolder}/src/test_manifest_job/wpp_checker.js", + "--require mocha-steps", + "--colors", + ], + "env": { + "ENTRY_FOLDER": "test", + "PACKAGE_NAME": "valid_set" + }, + "internalConsoleOptions": "openOnSessionStart", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", + "autoAttachChildProcesses": true, + } + ] +} \ No newline at end of file diff --git a/src/build_job/package-lock.json b/src/build_job/package-lock.json new file mode 100644 index 0000000..e268d95 --- /dev/null +++ b/src/build_job/package-lock.json @@ -0,0 +1,21 @@ +{ + "name": "build_job", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "build_job", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "node-iptc": "^1.0.5" + } + }, + "node_modules/node-iptc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-iptc/-/node-iptc-1.0.5.tgz", + "integrity": "sha512-+e9aVETp/X8iFX2qBw2GnABkq/jGs7dJdxGURZysOdn4ZdOdArPW2a3xQpSq6GX2CcgEzUklDfaC/cg4sLv35g==" + } + } +} diff --git a/src/build_job/package.json b/src/build_job/package.json new file mode 100644 index 0000000..40eeb97 --- /dev/null +++ b/src/build_job/package.json @@ -0,0 +1,14 @@ +{ + "name": "build_job", + "version": "1.0.0", + "description": "Generate a theme.json file from the images' metadata of the working folder.", + "main": "themeset_builder.js", + "scripts": { + "start": "node themeset_builder.js" + }, + "author": "Simon", + "license": "ISC", + "dependencies": { + "node-iptc": "^1.0.5" + } +} \ No newline at end of file diff --git a/src/build_job/themeset_builder.js b/src/build_job/themeset_builder.js index e69de29..862f8cd 100644 --- a/src/build_job/themeset_builder.js +++ b/src/build_job/themeset_builder.js @@ -0,0 +1,74 @@ +const fs = require("fs"); +const path = require("path"); +const iptc = require("node-iptc"); + + +// find all images +const slug = process.env["PACKAGE_NAME"]; +const root = process.env["ENTRY_FOLDER"]; +let workingDirectory = path.join("../..", root, slug); + +// extract metadata from them +fs.readdir(workingDirectory, (err, files) => { + if (err) { throw err }; + + // construct a JSON file + let theme = new Object(); + theme.dayImageList = []; + theme.nightImageList = []; + theme.sunsetImageList = []; + theme.sunriseImageList = []; + + // iterate each files + files.filter(file => path.extname(file) == '.jpg').forEach(image => { + buffer = fs.readFileSync(path.join(workingDirectory, image)); + //if (err) { throw err }; + // extract metadata + let metadata = iptc(buffer); + // fill object + theme.imageFilename ||= metadata.special_instructions + "_*" + path.extname(image); + theme.imageCredits ||= metadata.copyright_notice; + theme.displayName ||= metadata.headline; + // explore categories to find if image is dayHighlight or nightHighlight + metadata.supplemental_categories?.forEach(cat => { + switch (cat) { + case "dayHighlight": + theme.dayHighlight ||= parseInt(metadata.original_transmission_reference); + break; + case "nightHighlight": + theme.nightHighlight ||= parseInt(metadata.original_transmission_reference); + break; + default: + break; + } + }); + + switch (metadata.category) { + case "day": + theme.dayImageList.push(parseInt(metadata.original_transmission_reference)); + break; + case "night": + case "nig": + theme.nightImageList.push(parseInt(metadata.original_transmission_reference)); + break; + case "sunset": + case "twilight": + case "twi": + theme.sunsetImageList.push(parseInt(metadata.original_transmission_reference)); + break; + case "sunrise": + case "dawn": + case "daw": + theme.sunriseImageList.push(parseInt(metadata.original_transmission_reference)); + break; + default: + break; + } + }); + + fs.writeFileSync(path.join(workingDirectory, 'theme.json'), JSON.stringify(theme)); +}); + + + + diff --git a/src/test_manifest_job/package-lock.json b/src/test_manifest_job/package-lock.json index 8a49224..b800ae0 100644 --- a/src/test_manifest_job/package-lock.json +++ b/src/test_manifest_job/package-lock.json @@ -1,18 +1,20 @@ { - "name": "wppchecker", + "name": "wpp-checker", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "wppchecker", + "name": "wpp-checker", "version": "1.0.0", "license": "ISC", "dependencies": { - "ajv": "^8.5.0", + "ajv": "^8.12.0", "ajv-errors": "^3.0.0", - "chai": "^4.3.4", - "mocha": "^8.4.0", + "chai": "^4.3.7", + "mocha": "^8.4.0" + }, + "devDependencies": { "mocha-steps": "^1.3.0" } }, @@ -22,9 +24,9 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "node_modules/ajv": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", - "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -149,14 +151,15 @@ } }, "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" }, @@ -322,14 +325,14 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/diff": { @@ -605,6 +608,14 @@ "node": ">=10" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -662,7 +673,8 @@ "node_modules/mocha-steps": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz", - "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==" + "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==", + "dev": true }, "node_modules/ms": { "version": "2.1.3", @@ -1098,9 +1110,9 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "ajv": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", - "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1189,14 +1201,15 @@ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } @@ -1319,9 +1332,9 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "requires": { "type-detect": "^4.0.0" } @@ -1514,6 +1527,14 @@ "chalk": "^4.0.0" } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "requires": { + "get-func-name": "^2.0.0" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1557,7 +1578,8 @@ "mocha-steps": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz", - "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==" + "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==", + "dev": true }, "ms": { "version": "2.1.3", diff --git a/src/test_manifest_job/package.json b/src/test_manifest_job/package.json index b250d76..86af811 100644 --- a/src/test_manifest_job/package.json +++ b/src/test_manifest_job/package.json @@ -1,12 +1,12 @@ { - "name": "wppchecker", + "name": "wpp-checker", "version": "1.0.0", "description": "", - "main": "wppChecker.js", + "main": "wpp_checker.js", "scripts": { - "test": "mocha wppChecker.js --require mocha-step --colors" + "test": "src/test_manifest_job/node_modules/mocha/bin/_mocha --require mocha-steps --colors src/test_manifest_job/wpp_checker.js" }, - "author": "PtiSimon", + "author": "Simon", "license": "ISC", "dependencies": { "ajv": "^8.5.0", @@ -15,4 +15,4 @@ "mocha": "^8.4.0", "mocha-steps": "^1.3.0" } -} +} \ No newline at end of file diff --git a/src/test_manifest_job/wpp_checker.js b/src/test_manifest_job/wpp_checker.js index 7421385..a026224 100644 --- a/src/test_manifest_job/wpp_checker.js +++ b/src/test_manifest_job/wpp_checker.js @@ -1,6 +1,5 @@ const fs = require("fs"); const path = require("path"); -const { env, exit } = require("process"); const expect = require("chai").expect; const Ajv = require("ajv").default; const ajv = new Ajv({ allErrors: true }); @@ -14,6 +13,7 @@ const themeSchemaFile = "src/test_manifest_job/json_theme_schema.jsonc"; let wppManifest; let validator; let files; +let workingDirectory; function leftOuterJoin(leftArray, rightArray) { return leftArray.filter(function (el) { @@ -37,9 +37,9 @@ function flatReferences(wppManifest) { describe('Mandatory Checks', function () { before(function () { - slug = env.PACKAGE_NAME; + const slug = process.env["PACKAGE_NAME"]; expect(slug).to.be.a("string").that.is.not.empty; - root = env.ENTRY_FOLDER; + const root = process.env["ENTRY_FOLDER"]; expect(root).to.be.a("string").that.is.not.empty; workingDirectory = path.join(root, slug); files = fs.readdirSync(workingDirectory); @@ -59,7 +59,7 @@ describe('Mandatory Checks', function () { step('There are no missing files', function () { let references = flatReferences(wppManifest); references.push("theme.json"); - missings = leftOuterJoin(references, files); + let missings = leftOuterJoin(references, files); expect(missings, `The following reference${(missings.length > 1) ? "s" : ""} from theme.json ${(missings.length > 1) ? "are" : "is"} missing in the pack. Consider adding ${(missings.length > 1) ? "them" : " it"} to the pack or removing the reference${(missings.length > 1) ? "s" : ""} from the theme.json:\n\t• ${missings.join('\n\t• ')}\n` ).to.be.lengthOf(0,); @@ -67,7 +67,7 @@ describe('Mandatory Checks', function () { step('There are no orphan files', function () { let references = flatReferences(wppManifest); - orphans = leftOuterJoin(files.filter(x => x !== "theme.json"), references); + let orphans = leftOuterJoin(files.filter(x => x !== "theme.json"), references); expect(orphans, `The following orphan file${(orphans.length > 1) ? "s are" : " is"} not referenced in this theme.json. Consider removing the file${(orphans.length > 1) ? "s" : ""} or referencing ${(orphans.length > 1) ? "them" : "it"} in the theme.json:\n\t• ${orphans.join('\n\t• ')}\n` ).to.be.lengthOf(0); diff --git a/test/valid_set/description.md b/test/valid_set/description.md deleted file mode 100644 index 40cd5d7..0000000 --- a/test/valid_set/description.md +++ /dev/null @@ -1,4 +0,0 @@ -# some descriptions - -Introducting change for testing. -Pipeline still won't trigger. diff --git a/test/valid_set/theme.json b/test/valid_set/theme.json index 24eadf2..4653a60 100644 --- a/test/valid_set/theme.json +++ b/test/valid_set/theme.json @@ -1,19 +1,19 @@ { - "imageFilename": "bl2_eridum_badlands_*.jpg", - "imageCredits": "Gearbox", - "displayName": "", - "dayHighlight": 1, - "nightHighlight": 3, - "sunriseImageList": [ - 4 - ], - "dayImageList": [ - 1 - ], - "sunsetImageList": [ - 2 - ], - "nightImageList": [ - 3 - ] + "dayImageList": [ + 1 + ], + "nightImageList": [ + 3 + ], + "sunsetImageList": [ + 2 + ], + "sunriseImageList": [ + 4 + ], + "imageFilename": "bl2_eridum_badlands_*.jpg", + "imageCredits": "© Thoscellen, © 2K Games, © Gearbox Software", + "displayName": "Eridum Badlands", + "dayHighlight": 1, + "nightHighlight": 3 } \ No newline at end of file