Compare commits
8 Commits
BL2_frozen
...
valid_set.
Author | SHA1 | Date | |
---|---|---|---|
|
fc377e3a44 | ||
|
2b1714ed9b | ||
|
5c4b1e769c | ||
|
3487e5da0b | ||
|
0f093d4359 | ||
|
84b696b411 | ||
9941fa7bac | |||
|
5d4770dfe1 |
7
.gitignore
vendored
@@ -1,10 +1,3 @@
|
|||||||
|
|
||||||
# Ignore node_module
|
# Ignore node_module
|
||||||
**/node_modules/
|
**/node_modules/
|
||||||
|
|
||||||
# Ignore python stuff
|
|
||||||
**/__pycache__
|
|
||||||
**/.pytest_cache
|
|
||||||
|
|
||||||
# Ignore les fichiers système de MacOS
|
|
||||||
**/.DS_Store
|
|
101
.gitlab-ci.yml
@@ -1,101 +0,0 @@
|
|||||||
include:
|
|
||||||
- .gitlab/*.yml
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- Manifest
|
|
||||||
- Test
|
|
||||||
- Bundle
|
|
||||||
- Distribute
|
|
||||||
- Release
|
|
||||||
|
|
||||||
variables:
|
|
||||||
ENTRY_FOLDER: assets
|
|
||||||
RELEASE_VERSION: v$CI_PIPELINE_IID
|
|
||||||
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${RELEASE_VERSION}"
|
|
||||||
|
|
||||||
# Jobs from here run on Merge Requests as prerequisite for merging.
|
|
||||||
.manifest-job:
|
|
||||||
stage: Manifest
|
|
||||||
image: node:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_TAG
|
|
||||||
when: never
|
|
||||||
- changes:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
script:
|
|
||||||
- cd src/
|
|
||||||
- npm install
|
|
||||||
- npm run start
|
|
||||||
- cat ../${ENTRY_FOLDER}/${PACKAGE_NAME}/theme.json
|
|
||||||
- npm run test
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/theme.json
|
|
||||||
when: on_success
|
|
||||||
expire_in: "1 hour"
|
|
||||||
|
|
||||||
.test-job:
|
|
||||||
stage: Test
|
|
||||||
image: python:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
||||||
changes:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
script:
|
|
||||||
- pip install -U pytest pillow iteration_utilities
|
|
||||||
- python -m pytest src/test_images.py --tb=line -rA --color=yes
|
|
||||||
allow_failure: true
|
|
||||||
|
|
||||||
# Jobs from here run Merged_results or Push/Merge Commits to the main branch. Tag is created on release so no run with tag creation
|
|
||||||
.bundle-job:
|
|
||||||
stage: Bundle
|
|
||||||
image: javieraviles/zip:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_TAG
|
|
||||||
when: never
|
|
||||||
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
||||||
changes:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
script:
|
|
||||||
- zip -j ${PACKAGE_NAME}.zip ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- ${PACKAGE_NAME}.zip
|
|
||||||
when: on_success
|
|
||||||
expire_in: "1 hour"
|
|
||||||
|
|
||||||
.upload-job:
|
|
||||||
stage: Distribute
|
|
||||||
image: curlimages/curl:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_TAG
|
|
||||||
when: never
|
|
||||||
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
||||||
changes:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
script:
|
|
||||||
- |
|
|
||||||
curl --fail \
|
|
||||||
--header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
|
||||||
--upload-file ${PACKAGE_NAME}.zip "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip?select=package_file"
|
|
||||||
|
|
||||||
.release-job:
|
|
||||||
stage: Release
|
|
||||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_TAG
|
|
||||||
when: never
|
|
||||||
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
||||||
changes:
|
|
||||||
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
|
||||||
script:
|
|
||||||
- echo "Releasing assets for $PACKAGE_NAME"
|
|
||||||
release:
|
|
||||||
name: "Release $PACKAGE_NAME $RELEASE_VERSION"
|
|
||||||
tag_name: "$PACKAGE_NAME.$RELEASE_VERSION"
|
|
||||||
description: "Version $RELEASE_VERSION"
|
|
||||||
ref: "$CI_COMMIT_SHA"
|
|
||||||
assets:
|
|
||||||
links:
|
|
||||||
- name: ${PACKAGE_NAME}
|
|
||||||
url: "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip"
|
|
172
.gitlab/.gitlab-ci.yml
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
stages:
|
||||||
|
- Manifest
|
||||||
|
- Test
|
||||||
|
- Bundle
|
||||||
|
- Distribute
|
||||||
|
- Release
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ENTRY_FOLDER: "test" # test directory for testing CI/CD, or assets directory for normal operations
|
||||||
|
RELEASE_VERSION: v0.$CI_PIPELINE_IID
|
||||||
|
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${RELEASE_VERSION}"
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- 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"
|
||||||
|
<<: *manifest
|
||||||
|
|
||||||
|
.test-images-job: &test-images
|
||||||
|
stage: Test
|
||||||
|
image: python:latest
|
||||||
|
rules:
|
||||||
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
|
changes:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- pip install -U pytest pillow iteration_utilities
|
||||||
|
- python -m pytest src/test_images_job/test_wpp.py --tb=line -rA --color=yes --code-highlight=yes -q
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
test-images-job/valid_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "valid_set"
|
||||||
|
<<: *test-images
|
||||||
|
|
||||||
|
test-images-job/missing_tag_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "missing_tag_set"
|
||||||
|
<<: *test-images
|
||||||
|
|
||||||
|
.test-manifest-job: &test-manifest
|
||||||
|
stage: Test
|
||||||
|
image: node:latest
|
||||||
|
rules:
|
||||||
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
|
changes:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- cd src/test_manifest_job
|
||||||
|
- npm install ajv ajv-errors mocha mocha-steps chai
|
||||||
|
- cd ../..
|
||||||
|
- node src/test_manifest_job/node_modules/mocha/bin/_mocha --require mocha-steps --colors src/test_manifest_job/wpp_checker.js
|
||||||
|
|
||||||
|
test-manifest-job/valid_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "valid_set"
|
||||||
|
<<: *test-manifest
|
||||||
|
|
||||||
|
test-manifest-job/missing_tag_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "missing_tag_set"
|
||||||
|
<<: *test-manifest
|
||||||
|
|
||||||
|
# Jobs from here run Merged_results or Push/Merge Commits to the main branch. Tag is created on release so no run with tag creation
|
||||||
|
.bundle-job: &bundle
|
||||||
|
stage: Bundle
|
||||||
|
image: javieraviles/zip:latest
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
when: never # Do not run this job when a tag is created manually
|
||||||
|
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
||||||
|
changes:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- zip -j ${PACKAGE_NAME}.zip ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ${PACKAGE_NAME}.zip
|
||||||
|
when: on_success
|
||||||
|
expire_in: "1 hour"
|
||||||
|
|
||||||
|
bundle-job/valid_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "valid_set"
|
||||||
|
<<: *bundle
|
||||||
|
|
||||||
|
bundle-job/missing_tag_set:
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "missing_tag_set"
|
||||||
|
<<: *bundle
|
||||||
|
|
||||||
|
.upload-job: &upload
|
||||||
|
stage: Distribute
|
||||||
|
image: curlimages/curl:latest
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
when: never # Do not run this job when a tag is created manually
|
||||||
|
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
||||||
|
changes:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
curl --fail \
|
||||||
|
--header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
||||||
|
--upload-file ${PACKAGE_NAME}.zip "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip?select=package_file"
|
||||||
|
|
||||||
|
upload-job/valid_set:
|
||||||
|
needs:
|
||||||
|
- bundle-job/valid_set
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "valid_set"
|
||||||
|
<<: *upload
|
||||||
|
|
||||||
|
upload-job/missing_tag_set:
|
||||||
|
needs:
|
||||||
|
- bundle-job/missing_tag_set
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "missing_tag_set"
|
||||||
|
<<: *upload
|
||||||
|
|
||||||
|
.release-job: &release
|
||||||
|
stage: Release
|
||||||
|
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_TAG
|
||||||
|
when: never # Do not run this job when a tag is created manually
|
||||||
|
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
||||||
|
changes:
|
||||||
|
- ${ENTRY_FOLDER}/${PACKAGE_NAME}/*
|
||||||
|
script:
|
||||||
|
- echo "Releasing assets for $PACKAGE_NAME"
|
||||||
|
release:
|
||||||
|
name: "Release $PACKAGE_NAME $RELEASE_VERSION"
|
||||||
|
tag_name: "$PACKAGE_NAME.$RELEASE_VERSION"
|
||||||
|
description: "Version $RELEASE_VERSION"
|
||||||
|
ref: "$CI_COMMIT_SHA"
|
||||||
|
assets:
|
||||||
|
links:
|
||||||
|
- name: ${PACKAGE_NAME}
|
||||||
|
url: "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip"
|
||||||
|
|
||||||
|
release-job/valid_set:
|
||||||
|
needs:
|
||||||
|
- upload-job/valid_set
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "valid_set"
|
||||||
|
<<: *release
|
||||||
|
|
||||||
|
release-job/missing_tag_set:
|
||||||
|
needs:
|
||||||
|
- upload-job/missing_tag_set
|
||||||
|
variables:
|
||||||
|
PACKAGE_NAME: "missing_tag_set"
|
||||||
|
<<: *release
|
@@ -1,32 +0,0 @@
|
|||||||
manifest-job/BL2_frozen_wastelands:
|
|
||||||
variables:
|
|
||||||
PACKAGE_NAME: "BL2_frozen_wastelands"
|
|
||||||
extends: .manifest-job
|
|
||||||
|
|
||||||
test-images-job/BL2_frozen_wastelands:
|
|
||||||
needs:
|
|
||||||
- manifest-job/BL2_frozen_wastelands
|
|
||||||
variables:
|
|
||||||
PACKAGE_NAME: "BL2_frozen_wastelands"
|
|
||||||
extends: .test-job
|
|
||||||
|
|
||||||
bundle-job/BL2_frozen_wastelands:
|
|
||||||
needs:
|
|
||||||
- manifest-job/BL2_frozen_wastelands
|
|
||||||
variables:
|
|
||||||
PACKAGE_NAME: "BL2_frozen_wastelands"
|
|
||||||
extends: .bundle-job
|
|
||||||
|
|
||||||
upload-job/BL2_frozen_wastelands:
|
|
||||||
needs:
|
|
||||||
- bundle-job/BL2_frozen_wastelands
|
|
||||||
variables:
|
|
||||||
PACKAGE_NAME: "BL2_frozen_wastelands"
|
|
||||||
extends: .upload-job
|
|
||||||
|
|
||||||
release-job/BL2_frozen_wastelands:
|
|
||||||
needs:
|
|
||||||
- upload-job/BL2_frozen_wastelands
|
|
||||||
variables:
|
|
||||||
PACKAGE_NAME: "BL2_frozen_wastelands"
|
|
||||||
extends: .release-job
|
|
117
.vscode/launch.json
vendored
@@ -1,121 +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",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "Gen-Manifest Valid_set",
|
|
||||||
"cwd": "${workspaceFolder}/src",
|
|
||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"runtimeExecutable": "npm",
|
"name": "Tester avec Valid_set",
|
||||||
"runtimeArgs": [
|
|
||||||
"run",
|
|
||||||
"start"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
|
||||||
"PACKAGE_NAME": "valid_set"
|
|
||||||
},
|
|
||||||
"skipFiles": [
|
"skipFiles": [
|
||||||
"<node_internals>/**"
|
"<node_internals>/**"
|
||||||
],
|
],
|
||||||
},
|
"program": "${workspaceFolder}/src/test_manifest_job/node_modules/mocha/bin/_mocha",
|
||||||
{
|
|
||||||
"name": "Test-Manifest Valid_set",
|
|
||||||
"cwd": "${workspaceFolder}/src",
|
|
||||||
"type": "node",
|
|
||||||
"request": "launch",
|
|
||||||
"runtimeExecutable": "npm",
|
|
||||||
"runtimeArgs": [
|
|
||||||
"run",
|
|
||||||
"test"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
|
||||||
"PACKAGE_NAME": "valid_set"
|
|
||||||
},
|
|
||||||
"skipFiles": [
|
|
||||||
"<node_internals>/**"
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test-Images Valid_set",
|
|
||||||
"cwd": "${workspaceFolder}/src",
|
|
||||||
"console": "internalConsole",
|
|
||||||
"type": "python",
|
|
||||||
"request": "launch",
|
|
||||||
"module": "pytest",
|
|
||||||
"args": [
|
"args": [
|
||||||
"test_images.py",
|
"${workspaceFolder}/src/test_manifest_job/wpp_checker.js",
|
||||||
"-rA",
|
"--require mocha-steps",
|
||||||
"--tb=line",
|
"--colors",
|
||||||
"--color=yes"
|
|
||||||
],
|
],
|
||||||
"env": {
|
"env": {
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
"ENTRY_FOLDER": "test",
|
||||||
"PACKAGE_NAME": "valid_set"
|
"PACKAGE_NAME": "valid_set"
|
||||||
},
|
},
|
||||||
"justMyCode": true
|
"internalConsoleOptions": "openOnSessionStart",
|
||||||
},
|
"console": "integratedTerminal",
|
||||||
{
|
"cwd": "${workspaceFolder}",
|
||||||
"name": "Gen-Manifest existing_valid_theme_set",
|
"autoAttachChildProcesses": true,
|
||||||
"cwd": "${workspaceFolder}/src",
|
}
|
||||||
"type": "node",
|
|
||||||
"request": "launch",
|
|
||||||
"runtimeExecutable": "npm",
|
|
||||||
"runtimeArgs": [
|
|
||||||
"run",
|
|
||||||
"start"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
|
||||||
"PACKAGE_NAME": "existing_valid_theme_set"
|
|
||||||
},
|
|
||||||
"skipFiles": [
|
|
||||||
"<node_internals>/**"
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test-Manifest existing_valid_theme_set",
|
|
||||||
"cwd": "${workspaceFolder}/src",
|
|
||||||
"type": "node",
|
|
||||||
"request": "launch",
|
|
||||||
"runtimeExecutable": "npm",
|
|
||||||
"runtimeArgs": [
|
|
||||||
"run",
|
|
||||||
"test"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
|
||||||
"PACKAGE_NAME": "existing_valid_theme_set"
|
|
||||||
},
|
|
||||||
"skipFiles": [
|
|
||||||
"<node_internals>/**"
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test-Images existing_valid_theme_set",
|
|
||||||
"cwd": "${workspaceFolder}/src",
|
|
||||||
"console": "internalConsole",
|
|
||||||
"type": "python",
|
|
||||||
"request": "launch",
|
|
||||||
"module": "pytest",
|
|
||||||
"args": [
|
|
||||||
"test_images.py",
|
|
||||||
"-rA",
|
|
||||||
"--tb=line",
|
|
||||||
"--color=yes"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"CI_PROJECT_DIR": "${workspaceFolder}",
|
|
||||||
"ENTRY_FOLDER": "test",
|
|
||||||
"PACKAGE_NAME": "existing_valid_theme_set"
|
|
||||||
},
|
|
||||||
"justMyCode": true
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
Before Width: | Height: | Size: 909 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 977 KiB |
Before Width: | Height: | Size: 968 KiB |
Before Width: | Height: | Size: 928 KiB |
Before Width: | Height: | Size: 944 KiB |
Before Width: | Height: | Size: 952 KiB |
Before Width: | Height: | Size: 1002 KiB |
Before Width: | Height: | Size: 892 KiB |
Before Width: | Height: | Size: 876 KiB |
Before Width: | Height: | Size: 935 KiB |
Before Width: | Height: | Size: 942 KiB |
Before Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 996 KiB |
Before Width: | Height: | Size: 878 KiB |
Before Width: | Height: | Size: 947 KiB |
Before Width: | Height: | Size: 980 KiB |
Before Width: | Height: | Size: 954 KiB |
Before Width: | Height: | Size: 1009 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 1.1 MiB |
21
src/build_job/package-lock.json
generated
Normal file
@@ -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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
src/build_job/package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
@@ -1,24 +1,18 @@
|
|||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const iptc = require("node-iptc");
|
const iptc = require("node-iptc");
|
||||||
const { exit } = require("process");
|
|
||||||
|
|
||||||
|
|
||||||
// Fetch envs to target the right folder
|
// find all images
|
||||||
const workDir = process.env["CI_PROJECT_DIR"];
|
|
||||||
const root = process.env["ENTRY_FOLDER"];
|
|
||||||
const slug = process.env["PACKAGE_NAME"];
|
const slug = process.env["PACKAGE_NAME"];
|
||||||
if (!workDir || !slug || !root) exit(1);
|
const root = process.env["ENTRY_FOLDER"];
|
||||||
let workingDirectory = path.join(workDir, root, slug);
|
let workingDirectory = path.join("../..", root, slug);
|
||||||
|
|
||||||
// extract metadata from them
|
// extract metadata from them
|
||||||
fs.readdir(workingDirectory, (err, files) => {
|
fs.readdir(workingDirectory, (err, files) => {
|
||||||
if (err) { throw err }; // If IO error, exit with an error message
|
if (err) { throw err };
|
||||||
|
|
||||||
// If there is already a theme.json silentely exit and let mocha running afterwards
|
// construct a JSON file
|
||||||
if (files.find(file => path.extname(file) == '.json')) exit(0);
|
|
||||||
|
|
||||||
// construct a JSON object
|
|
||||||
let theme = new Object();
|
let theme = new Object();
|
||||||
theme.dayImageList = [];
|
theme.dayImageList = [];
|
||||||
theme.nightImageList = [];
|
theme.nightImageList = [];
|
||||||
@@ -28,8 +22,10 @@ fs.readdir(workingDirectory, (err, files) => {
|
|||||||
// iterate each files
|
// iterate each files
|
||||||
files.filter(file => path.extname(file) == '.jpg').forEach(image => {
|
files.filter(file => path.extname(file) == '.jpg').forEach(image => {
|
||||||
buffer = fs.readFileSync(path.join(workingDirectory, image));
|
buffer = fs.readFileSync(path.join(workingDirectory, image));
|
||||||
|
//if (err) { throw err };
|
||||||
// extract metadata
|
// extract metadata
|
||||||
let metadata = iptc(buffer);
|
let metadata = iptc(buffer);
|
||||||
|
// fill object
|
||||||
theme.imageFilename ||= metadata.special_instructions + "_*" + path.extname(image);
|
theme.imageFilename ||= metadata.special_instructions + "_*" + path.extname(image);
|
||||||
theme.imageCredits ||= metadata.copyright_notice;
|
theme.imageCredits ||= metadata.copyright_notice;
|
||||||
theme.displayName ||= metadata.headline;
|
theme.displayName ||= metadata.headline;
|
||||||
@@ -69,7 +65,7 @@ fs.readdir(workingDirectory, (err, files) => {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// make it the theme.json
|
|
||||||
fs.writeFileSync(path.join(workingDirectory, 'theme.json'), JSON.stringify(theme));
|
fs.writeFileSync(path.join(workingDirectory, 'theme.json'), JSON.stringify(theme));
|
||||||
});
|
});
|
||||||
|
|
@@ -1,86 +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.",
|
|
||||||
"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."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
1066
src/package-lock.json
generated
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"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,5 +1,6 @@
|
|||||||
import glob
|
import glob
|
||||||
from PIL import Image, ImageStat
|
from PIL import Image, ImageStat
|
||||||
|
# from _pytest.outcomes import skip
|
||||||
from iteration_utilities import duplicates
|
from iteration_utilities import duplicates
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import json
|
import json
|
||||||
@@ -7,15 +8,18 @@ import os
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
def _validate_brightness_image(working_path, theme_config, high_light, image_list, brightness_way):
|
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")
|
image_pattern = theme_config.get("imageFilename")
|
||||||
|
|
||||||
|
# if image_filenames is None:
|
||||||
image_filenames = {}.fromkeys(glob.glob(str(Path(working_path, image_pattern))))
|
image_filenames = {}.fromkeys(glob.glob(str(Path(working_path, image_pattern))))
|
||||||
|
|
||||||
# generate an image statistics for each images
|
# generate an image statistics for each images
|
||||||
for an_imagefile in image_filenames:
|
for an_imagefile in image_filenames:
|
||||||
this_image = Image.open(an_imagefile).convert("L")
|
this_image = Image.open(an_imagefile).convert("L")
|
||||||
this_image_stats = ImageStat.Stat(this_image)
|
this_image_stats = ImageStat.Stat(this_image)
|
||||||
image_filenames[an_imagefile] = this_image_stats.mean[0]
|
image_filenames[an_imagefile] = this_image_stats.mean[0]
|
||||||
#print(f'{an_imagefile} : {image_filenames[an_imagefile]}')
|
|
||||||
|
|
||||||
# get the brightest observed image from the list
|
# get the brightest observed image from the list
|
||||||
if high_light == "dayHighlight":
|
if high_light == "dayHighlight":
|
||||||
@@ -28,6 +32,7 @@ def _validate_brightness_image(working_path, theme_config, high_light, image_lis
|
|||||||
an_image = image_pattern.replace("*", str(theme_config.get(high_light)))
|
an_image = image_pattern.replace("*", str(theme_config.get(high_light)))
|
||||||
ref_est_file = str(Path(working_path, an_image))
|
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}."
|
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:
|
else:
|
||||||
# if not highlight is given in theme.json, we suppose that brightest images are in the daylist
|
# if not highlight is given in theme.json, we suppose that brightest images are in the daylist
|
||||||
ref_est_files = []
|
ref_est_files = []
|
||||||
@@ -35,15 +40,15 @@ def _validate_brightness_image(working_path, theme_config, high_light, image_lis
|
|||||||
an_image = image_pattern.replace('*', str(an_id))
|
an_image = image_pattern.replace('*', str(an_id))
|
||||||
ref_est_files.append(str(Path(working_path, an_image)))
|
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."
|
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
|
@pytest.fixture
|
||||||
def working_path():
|
def working_path():
|
||||||
# get the global variables containing gitlab-given project slug.
|
# get the global variables containing gitlab-given project slug.
|
||||||
work_directory = os.environ["CI_PROJECT_DIR"]
|
|
||||||
entry_folder = os.environ["ENTRY_FOLDER"]
|
|
||||||
project_slug = os.environ["PACKAGE_NAME"]
|
project_slug = os.environ["PACKAGE_NAME"]
|
||||||
working_path = Path(work_directory, entry_folder, project_slug)
|
root_folder = os.environ["ENTRY_FOLDER"]
|
||||||
|
working_path = Path(root_folder, project_slug)
|
||||||
if not working_path.is_dir():
|
if not working_path.is_dir():
|
||||||
raise FileNotFoundError(f"No project found for the given {working_path}.")
|
raise FileNotFoundError(f"No project found for the given {working_path}.")
|
||||||
return working_path
|
return working_path
|
||||||
@@ -56,18 +61,20 @@ def manifest(working_path):
|
|||||||
|
|
||||||
|
|
||||||
def test_brightest_image(working_path, manifest):
|
def test_brightest_image(working_path, manifest):
|
||||||
_validate_brightness_image(working_path, manifest, "dayHighlight", "dayImageList", "Brightest")
|
validate_brightness_image(working_path, manifest, "dayHighlight", "dayImageList", "Brightest")
|
||||||
|
|
||||||
|
|
||||||
def test_darkest_image(working_path, manifest):
|
def test_darkest_image(working_path, manifest):
|
||||||
_validate_brightness_image(working_path, manifest, "nightHighlight", "nightImageList", "Darkest")
|
validate_brightness_image(working_path, manifest, "nightHighlight", "nightImageList", "Darkest")
|
||||||
|
|
||||||
|
|
||||||
def test_image_size(working_path, manifest):
|
def test_image_size(working_path, manifest):
|
||||||
image_filename = manifest["imageFilename"].replace("*", str(manifest["dayImageList"][0]))
|
image_filename = manifest["imageFilename"].replace("*", str(manifest["dayImageList"][0]))
|
||||||
w, h = Image.open(Path(working_path, image_filename)).size
|
img = Image.open(Path(working_path, image_filename))
|
||||||
|
w, h = img.size
|
||||||
assert w >= 1920 and h >= 1080, f"✖ Image size is too small (must be at least 1920×1080, is {w}×{h})"
|
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)"
|
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):
|
def test_overlapping_images(manifest):
|
||||||
jointed_lists = manifest.get("dayImageList")
|
jointed_lists = manifest.get("dayImageList")
|
||||||
@@ -79,4 +86,5 @@ def test_overlapping_images(manifest):
|
|||||||
str_dup_refs = [manifest["imageFilename"].replace("*", str(int)) for int in dup_refs]
|
str_dup_refs = [manifest["imageFilename"].replace("*", str(int)) for int in dup_refs]
|
||||||
separator = ", "
|
separator = ", "
|
||||||
|
|
||||||
assert not dup_refs, f"✖ Some images are referenced twice or more: {separator.join(str_dup_refs)}."
|
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.")
|
56
src/test_manifest_job/json_theme_schema.jsonc
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"$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
Normal file
18
src/test_manifest_job/package.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
@@ -5,8 +5,12 @@ const Ajv = require("ajv").default;
|
|||||||
const ajv = new Ajv({ allErrors: true });
|
const ajv = new Ajv({ allErrors: true });
|
||||||
require("ajv-errors")(ajv);
|
require("ajv-errors")(ajv);
|
||||||
|
|
||||||
const themeSchemaFile = "json_theme_schema.jsonc";
|
//let root, slug;
|
||||||
let manifest;
|
//let workingDirectory = path.join(root, slug);
|
||||||
|
//console.log(`👷♂️ Working with ‘${slug}’ slug.`);
|
||||||
|
|
||||||
|
const themeSchemaFile = "src/test_manifest_job/json_theme_schema.jsonc";
|
||||||
|
let wppManifest;
|
||||||
let validator;
|
let validator;
|
||||||
let files;
|
let files;
|
||||||
let workingDirectory;
|
let workingDirectory;
|
||||||
@@ -17,45 +21,43 @@ function leftOuterJoin(leftArray, rightArray) {
|
|||||||
}, rightArray);
|
}, rightArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
function flatReferences(manifest) {
|
function flatReferences(wppManifest) {
|
||||||
allImageIds = [
|
allImageIds = [
|
||||||
manifest.dayHighlight,
|
wppManifest.dayHighlight,
|
||||||
manifest.nightHighlight,
|
wppManifest.nightHighlight,
|
||||||
...manifest.dayImageList,
|
...wppManifest.dayImageList,
|
||||||
...manifest.nightImageList,
|
...wppManifest.nightImageList,
|
||||||
...(manifest.sunsetImageList || []),
|
...(wppManifest.sunsetImageList || []),
|
||||||
...(manifest.sunriseImageList || [])
|
...(wppManifest.sunriseImageList || [])
|
||||||
];
|
];
|
||||||
return allImageIds.filter(el => el !== undefined).map(el => {
|
return allImageIds.filter(el => el !== undefined).map(el => {
|
||||||
return manifest.imageFilename.replace("*", el);
|
return wppManifest.imageFilename.replace("*", el);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Mandatory Checks', function () {
|
describe('Mandatory Checks', function () {
|
||||||
before(function () {
|
before(function () {
|
||||||
const workDir = process.env["CI_PROJECT_DIR"];
|
|
||||||
expect(workDir).to.be.a("string").that.is.not.empty;
|
|
||||||
const slug = process.env["PACKAGE_NAME"];
|
const slug = process.env["PACKAGE_NAME"];
|
||||||
expect(slug).to.be.a("string").that.is.not.empty;
|
expect(slug).to.be.a("string").that.is.not.empty;
|
||||||
const root = process.env["ENTRY_FOLDER"];
|
const root = process.env["ENTRY_FOLDER"];
|
||||||
expect(root).to.be.a("string").that.is.not.empty;
|
expect(root).to.be.a("string").that.is.not.empty;
|
||||||
workingDirectory = path.join(workDir, root, slug);
|
workingDirectory = path.join(root, slug);
|
||||||
files = fs.readdirSync(workingDirectory);
|
files = fs.readdirSync(workingDirectory);
|
||||||
expect(files).to.be.an('array').that.is.not.empty;
|
expect(files).to.be.an('array').that.is.not.empty;
|
||||||
validator = ajv.compile(JSON.parse(fs.readFileSync(themeSchemaFile, 'utf8')));
|
validator = ajv.compile(JSON.parse(fs.readFileSync(themeSchemaFile, 'utf8')));
|
||||||
});
|
});
|
||||||
|
|
||||||
step('Manifest is an existing json file', function () {
|
step('Manifest is an existing json file', function () {
|
||||||
manifest = JSON.parse(fs.readFileSync(path.join(workingDirectory, "theme.json"), "utf8"));
|
wppManifest = JSON.parse(fs.readFileSync(path.join(workingDirectory, "theme.json"), "utf8"));
|
||||||
});
|
});
|
||||||
|
|
||||||
step('Manifest passes the schema', function () {
|
step('Manifest passes the schema', function () {
|
||||||
const isValid = validator(manifest);
|
const isValid = validator(wppManifest);
|
||||||
if (!isValid) expect.fail(`\n\t• ${validator.errors.map(el => { return el.message; }).join('\n\t• ')}`);
|
if (!isValid) expect.fail(`\n\t• ${validator.errors.map(el => { return el.message; }).join('\n\t• ')}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
step('There are no missing files', function () {
|
step('There are no missing files', function () {
|
||||||
let references = flatReferences(manifest);
|
let references = flatReferences(wppManifest);
|
||||||
references.push("theme.json");
|
references.push("theme.json");
|
||||||
let missings = leftOuterJoin(references, files);
|
let missings = leftOuterJoin(references, files);
|
||||||
expect(missings,
|
expect(missings,
|
||||||
@@ -64,7 +66,7 @@ describe('Mandatory Checks', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
step('There are no orphan files', function () {
|
step('There are no orphan files', function () {
|
||||||
let references = flatReferences(manifest);
|
let references = flatReferences(wppManifest);
|
||||||
let orphans = leftOuterJoin(files.filter(x => x !== "theme.json"), references);
|
let orphans = leftOuterJoin(files.filter(x => x !== "theme.json"), references);
|
||||||
expect(orphans,
|
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`
|
`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`
|
Before Width: | Height: | Size: 346 KiB |
Before Width: | Height: | Size: 422 KiB |
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"dayImageList": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"imageFilename": "stray__*.jpg",
|
|
||||||
"nightImageList": [
|
|
||||||
2
|
|
||||||
],
|
|
||||||
"imageCredits": "©Thoscellen, ©BlueTwelve",
|
|
||||||
"sunriseImageList": [],
|
|
||||||
"displayName": "Stray",
|
|
||||||
"sunsetImageList": []
|
|
||||||
}
|
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"imageFilename": "bl3_landscape_*.jpg",
|
"imageFilename": "bl3_landscape_*.jpg",
|
||||||
"displayName": "BL3",
|
|
||||||
"imageCredits": "© Gearbox",
|
"imageCredits": "© Gearbox",
|
||||||
|
"displayName": "",
|
||||||
"dayImageList": [
|
"dayImageList": [
|
||||||
2
|
2
|
||||||
],
|
],
|
||||||
|
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 158 KiB |
19
test/valid_set/theme.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"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
|
||||||
|
}
|