Fusionnne les jobs node en un
This commit is contained in:
@@ -6,7 +6,7 @@ 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);
|
||||
let workingDirectory = path.join(root, slug);
|
||||
|
||||
// extract metadata from them
|
||||
fs.readdir(workingDirectory, (err, files) => {
|
||||
@@ -22,10 +22,8 @@ fs.readdir(workingDirectory, (err, files) => {
|
||||
// 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;
|
21
src/build_job/package-lock.json
generated
21
src/build_job/package-lock.json
generated
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"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=="
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
86
src/json_theme_schema.jsonc
Normal file
86
src/json_theme_schema.jsonc
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"imageFilename",
|
||||
"imageCredits",
|
||||
"displayName",
|
||||
"dayImageList",
|
||||
"nightImageList"
|
||||
],
|
||||
"properties": {
|
||||
"imageFilename": {
|
||||
"type": "string"
|
||||
},
|
||||
"imageCredits": {
|
||||
"type": "string"
|
||||
},
|
||||
"displayName": {
|
||||
"type": "string"
|
||||
},
|
||||
"dayHighlight": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"nightHighlight": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"sunriseImageList": {
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"dayImageList": {
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"sunsetImageList": {
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"nightImageList": {
|
||||
"type": "array",
|
||||
"minItems": 0,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"errorMessage": {
|
||||
"required": {
|
||||
"imageFilename": "The ‘imageFilename’ property is missing.",
|
||||
"imageCredits": "The ‘imageCredits’ property is missing.",
|
||||
"displayName": "The ‘displayName’ property is missing.",
|
||||
"dayImageList": "The ‘dayImageList’ property is missing.",
|
||||
"nightImageList": "The ‘nightImageList’ property is missing."
|
||||
},
|
||||
"properties": {
|
||||
"imageFilename": "The ‘imageFilename’ property must be of type ‘string’.",
|
||||
"imageCredits": "The ‘imageCredits’ property must be of type ‘string’.",
|
||||
"displayName": "The ‘displayName’ property must be of type ‘string’.",
|
||||
"dayHighlight": "The ‘dayHighlight’ property must be a counting number.",
|
||||
"nightHighlight": "The ‘nightHighlight’ property must be a counting number.",
|
||||
"sunriseImageList": "The ‘sunriseImageList’ property must be a list of counting numbers.",
|
||||
"dayImageList": "The ‘dayImageList’ property must be a list of counting numbers.",
|
||||
"sunsetImageList": "The ‘sunsetImageList’ property must be a list of counting numbers.",
|
||||
"nightImageList": "The ‘nightImageList’ property must be a list of counting numbers."
|
||||
}
|
||||
}
|
||||
}
|
@@ -5,12 +5,8 @@ const Ajv = require("ajv").default;
|
||||
const ajv = new Ajv({ allErrors: true });
|
||||
require("ajv-errors")(ajv);
|
||||
|
||||
//let root, slug;
|
||||
//let workingDirectory = path.join(root, slug);
|
||||
//console.log(`👷♂️ Working with ‘${slug}’ slug.`);
|
||||
|
||||
const themeSchemaFile = "src/test_manifest_job/json_theme_schema.jsonc";
|
||||
let wppManifest;
|
||||
const themeSchemaFile = "json_theme_schema.jsonc";
|
||||
let manifest;
|
||||
let validator;
|
||||
let files;
|
||||
let workingDirectory;
|
||||
@@ -21,17 +17,17 @@ function leftOuterJoin(leftArray, rightArray) {
|
||||
}, rightArray);
|
||||
}
|
||||
|
||||
function flatReferences(wppManifest) {
|
||||
function flatReferences(manifest) {
|
||||
allImageIds = [
|
||||
wppManifest.dayHighlight,
|
||||
wppManifest.nightHighlight,
|
||||
...wppManifest.dayImageList,
|
||||
...wppManifest.nightImageList,
|
||||
...(wppManifest.sunsetImageList || []),
|
||||
...(wppManifest.sunriseImageList || [])
|
||||
manifest.dayHighlight,
|
||||
manifest.nightHighlight,
|
||||
...manifest.dayImageList,
|
||||
...manifest.nightImageList,
|
||||
...(manifest.sunsetImageList || []),
|
||||
...(manifest.sunriseImageList || [])
|
||||
];
|
||||
return allImageIds.filter(el => el !== undefined).map(el => {
|
||||
return wppManifest.imageFilename.replace("*", el);
|
||||
return manifest.imageFilename.replace("*", el);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -48,16 +44,16 @@ describe('Mandatory Checks', function () {
|
||||
});
|
||||
|
||||
step('Manifest is an existing json file', function () {
|
||||
wppManifest = JSON.parse(fs.readFileSync(path.join(workingDirectory, "theme.json"), "utf8"));
|
||||
manifest = JSON.parse(fs.readFileSync(path.join(workingDirectory, "theme.json"), "utf8"));
|
||||
});
|
||||
|
||||
step('Manifest passes the schema', function () {
|
||||
const isValid = validator(wppManifest);
|
||||
const isValid = validator(manifest);
|
||||
if (!isValid) expect.fail(`\n\t• ${validator.errors.map(el => { return el.message; }).join('\n\t• ')}`);
|
||||
});
|
||||
|
||||
step('There are no missing files', function () {
|
||||
let references = flatReferences(wppManifest);
|
||||
let references = flatReferences(manifest);
|
||||
references.push("theme.json");
|
||||
let missings = leftOuterJoin(references, files);
|
||||
expect(missings,
|
||||
@@ -66,7 +62,7 @@ describe('Mandatory Checks', function () {
|
||||
});
|
||||
|
||||
step('There are no orphan files', function () {
|
||||
let references = flatReferences(wppManifest);
|
||||
let references = flatReferences(manifest);
|
||||
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`
|
1066
src/package-lock.json
generated
Normal file
1066
src/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
src/package.json
Normal file
20
src/package.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "build-manifest",
|
||||
"version": "1.0.0",
|
||||
"description": "Generate the manifest file of the project, based on metadata contained in the pictures.",
|
||||
"main": "build-manifest.js",
|
||||
"scripts": {
|
||||
"start": "node build-manifest.js",
|
||||
"test": "mocha --require mocha-steps --timeout 0 --colors manifest.spec.js"
|
||||
},
|
||||
"author": "Simon",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"ajv": "^8.5.0",
|
||||
"ajv-errors": "^3.0.0",
|
||||
"chai": "^4.3.4",
|
||||
"mocha": "^10.2.0",
|
||||
"mocha-steps": "^1.3.0",
|
||||
"node-iptc": "^1.0.5"
|
||||
}
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
import glob
|
||||
from PIL import Image, ImageStat
|
||||
# from _pytest.outcomes import skip
|
||||
from iteration_utilities import duplicates
|
||||
from pathlib import Path
|
||||
import json
|
||||
@@ -9,12 +8,8 @@ import pytest
|
||||
|
||||
|
||||
def validate_brightness_image(working_path, theme_config, high_light, image_list, brightness_way):
|
||||
# get a dict<filename:string, mean:int> of all images to scan them
|
||||
image_pattern = theme_config.get("imageFilename")
|
||||
|
||||
# if image_filenames is None:
|
||||
image_filenames = {}.fromkeys(glob.glob(str(Path(working_path, image_pattern))))
|
||||
|
||||
# generate an image statistics for each images
|
||||
for an_imagefile in image_filenames:
|
||||
this_image = Image.open(an_imagefile).convert("L")
|
||||
@@ -32,7 +27,6 @@ def validate_brightness_image(working_path, theme_config, high_light, image_list
|
||||
an_image = image_pattern.replace("*", str(theme_config.get(high_light)))
|
||||
ref_est_file = str(Path(working_path, an_image))
|
||||
assert actual_est_image == ref_est_file, f"✖ {brightness_way} image is {actual_est_image}, but the {high_light} image is {ref_est_file}."
|
||||
|
||||
else:
|
||||
# if not highlight is given in theme.json, we suppose that brightest images are in the daylist
|
||||
ref_est_files = []
|
||||
@@ -40,7 +34,6 @@ def validate_brightness_image(working_path, theme_config, high_light, image_list
|
||||
an_image = image_pattern.replace('*', str(an_id))
|
||||
ref_est_files.append(str(Path(working_path, an_image)))
|
||||
assert actual_est_image in ref_est_files, f"✖ {brightness_way} image {actual_est_image} was not found in the '{image_list}' attribute."
|
||||
# print(f"✔ {brightness_way} image is {actual_est_image}, as expected.")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -70,11 +63,9 @@ def test_darkest_image(working_path, manifest):
|
||||
|
||||
def test_image_size(working_path, manifest):
|
||||
image_filename = manifest["imageFilename"].replace("*", str(manifest["dayImageList"][0]))
|
||||
img = Image.open(Path(working_path, image_filename))
|
||||
w, h = img.size
|
||||
w, h = Image.open(Path(working_path, image_filename)).size
|
||||
assert w >= 1920 and h >= 1080, f"✖ Image size is too small (must be at least 1920×1080, is {w}×{h})"
|
||||
assert w >= h, "✖ Image orientation is portrait (must be landscape or square)"
|
||||
# print(f"✔ Images are big enough ({w}×{h}) and landscape.")
|
||||
|
||||
def test_overlapping_images(manifest):
|
||||
jointed_lists = manifest.get("dayImageList")
|
||||
@@ -86,5 +77,4 @@ def test_overlapping_images(manifest):
|
||||
str_dup_refs = [manifest["imageFilename"].replace("*", str(int)) for int in dup_refs]
|
||||
separator = ", "
|
||||
|
||||
assert not dup_refs, f"✖ Some images are referenced twice or more times: {separator.join(str_dup_refs)}."
|
||||
# print("✔ There is no overlapping references of images in the theme.json.")
|
||||
assert not dup_refs, f"✖ Some images are referenced twice or more: {separator.join(str_dup_refs)}."
|
@@ -1,56 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"required": ["imageFilename","imageCredits","displayName","dayImageList","nightImageList"],
|
||||
"properties": {
|
||||
"imageFilename": {"type": "string"},
|
||||
"imageCredits": {"type": "string"},
|
||||
"displayName": {"type": "string"},
|
||||
"dayHighlight": {"type": "integer", "minimum": 0},
|
||||
"nightHighlight": {"type": "integer", "minimum": 0},
|
||||
"sunriseImageList": {
|
||||
"type": "array",
|
||||
"minItems" : 0,
|
||||
"uniqueItems" : true,
|
||||
"items": {"type": "integer", "minimum": 0}
|
||||
},
|
||||
"dayImageList": {
|
||||
"type": "array",
|
||||
"minItems" : 0,
|
||||
"uniqueItems" : true,
|
||||
"items": {"type": "integer", "minimum": 0}
|
||||
},
|
||||
"sunsetImageList": {
|
||||
"type": "array",
|
||||
"minItems" : 0,
|
||||
"uniqueItems" : true,
|
||||
"items": {"type": "integer", "minimum": 0}
|
||||
},
|
||||
"nightImageList": {
|
||||
"type": "array",
|
||||
"minItems" : 0,
|
||||
"uniqueItems" : true,
|
||||
"items": {"type": "integer", "minimum": 0}
|
||||
}
|
||||
},
|
||||
"errorMessage": {
|
||||
"required": {
|
||||
"imageFilename":"The ‘imageFilename’ property is missing. Consider adding it.",
|
||||
"imageCredits":"The ‘imageCredits’ property is missing. Consider adding it.",
|
||||
"displayName":"The ‘displayName’ property is missing. Consider adding it.",
|
||||
"dayImageList":"The ‘dayImageList’ property is missing. Consider adding it.",
|
||||
"nightImageList":"The ‘nightImageList’ property is missing. Consider adding it."
|
||||
},
|
||||
"properties": {
|
||||
"imageFilename": "The ‘imageFilename’ property must be of type ‘string’ and reflect a glob of an image, i.e.: ‘myWallpaper_*.jpg’.",
|
||||
"imageCredits": "The ‘imageCredits’ property must be of type ‘string’.",
|
||||
"displayName": "The ‘displayName’ property must be of type ‘string’.",
|
||||
"dayHighlight": "The ‘dayHighlight’ property must be a counting number referencing an image, i.e.: ‘5’ in ‘myWallpaper_5.jpg’.",
|
||||
"nightHighlight": "The ‘nightHighlight’ property must be a counting number referencing an image, i.e.: ‘13’ in ‘myWallpaper_13.jpg’.",
|
||||
"sunriseImageList": "The ‘sunriseImageList’ property must be a list of counting numbers referencing images, i.e.: ‘[1, 2, 3, 4].’",
|
||||
"dayImageList": "The ‘dayImageList’ property must be a list of counting numbers referencing images, i.e.: ‘[1, 2, 3, 4]’.",
|
||||
"sunsetImageList": "The ‘sunsetImageList’ property must be a list of counting numbers referencing images, i.e.: ‘[1, 2, 3, 4]’.",
|
||||
"nightImageList": "The ‘nightImageList’ property must be a list of counting numbers referencing images, i.e.: ‘[1, 2, 3, 4]’."
|
||||
}
|
||||
}
|
||||
}
|
1875
src/test_manifest_job/package-lock.json
generated
1875
src/test_manifest_job/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "wpp-checker",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "wpp_checker.js",
|
||||
"scripts": {
|
||||
"test": "src/test_manifest_job/node_modules/mocha/bin/_mocha --require mocha-steps --colors src/test_manifest_job/wpp_checker.js"
|
||||
},
|
||||
"author": "Simon",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"ajv": "^8.5.0",
|
||||
"ajv-errors": "^3.0.0",
|
||||
"chai": "^4.3.4",
|
||||
"mocha": "^8.4.0",
|
||||
"mocha-steps": "^1.3.0"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user