2017-06-05 16:02:39 +03:00
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
2015-11-18 17:16:17 +02:00
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
2015-02-20 21:02:10 +02:00
2019-10-17 23:40:30 +03:00
import os
2019-10-18 22:00:28 +03:00
import re
2019-10-17 23:40:30 +03:00
2019-10-17 00:17:16 +03:00
import jsondiff
2015-02-24 20:11:57 +02:00
import pytest
2019-09-30 17:59:06 +03:00
2019-10-15 13:05:56 +03:00
from platformio.compat import WINDOWS
2019-10-17 00:17:16 +03:00
from platformio.package.manifest import parser
from platformio.package.manifest.schema import ManifestSchema , ManifestValidationError
2015-02-24 20:11:57 +02:00
2015-02-20 21:02:10 +02:00
2019-09-30 17:59:06 +03:00
def test_library_json_parser ():
contents = """
{
"name": "TestPackage",
"keywords": "kw1, KW2, kw3",
"platforms": ["atmelavr", "espressif"],
"url": "http://old.url.format",
"exclude": [".gitignore", "tests"],
2019-10-24 13:42:46 +03:00
"include": "mylib",
"build": {
"flags": ["-DHELLO"]
},
"customField": "Custom Value"
2019-09-30 17:59:06 +03:00
}
"""
mp = parser . LibraryJsonManifestParser ( contents )
2019-10-17 00:17:16 +03:00
assert not jsondiff . diff (
mp . as_dict (),
2019-09-30 17:59:06 +03:00
{
"name" : "TestPackage" ,
"platforms" : [ "atmelavr" , "espressif8266" ],
"export" : { "exclude" : [ ".gitignore" , "tests" ], "include" : [ "mylib" ]},
"keywords" : [ "kw1" , "kw2" , "kw3" ],
"homepage" : "http://old.url.format" ,
2019-10-24 13:42:46 +03:00
"build" : { "flags" : [ "-DHELLO" ]},
"customField" : "Custom Value" ,
2019-10-17 00:17:16 +03:00
},
2019-09-30 17:59:06 +03:00
)
2015-02-20 21:02:10 +02:00
2019-10-01 16:13:25 +03:00
contents = """
{
"keywords": ["sound", "audio", "music", "SD", "card", "playback"],
"frameworks": "arduino",
"platforms": "atmelavr",
"export": {
"exclude": "audio_samples"
}
}
"""
mp = parser . LibraryJsonManifestParser ( contents )
2019-10-17 00:17:16 +03:00
assert not jsondiff . diff (
mp . as_dict (),
2019-10-01 16:13:25 +03:00
{
"keywords" : [ "sound" , "audio" , "music" , "sd" , "card" , "playback" ],
"frameworks" : [ "arduino" ],
"export" : { "exclude" : [ "audio_samples" ]},
"platforms" : [ "atmelavr" ],
2019-10-17 00:17:16 +03:00
},
2019-10-01 16:13:25 +03:00
)
2015-02-20 21:02:10 +02:00
2019-09-30 17:59:06 +03:00
def test_module_json_parser ():
contents = """
{
"author": "Name Surname <name@surname.com>",
"description": "This is Yotta library",
"homepage": "https://yottabuild.org",
"keywords": [
"mbed",
"Yotta"
],
"licenses": [
{
"type": "Apache-2.0",
"url": "https://spdx.org/licenses/Apache-2.0"
}
],
"name": "YottaLibrary",
"repository": {
"type": "git",
"url": "git@github.com:username/repo.git"
},
2019-10-24 13:42:46 +03:00
"version": "1.2.3",
"customField": "Custom Value"
2019-09-30 17:59:06 +03:00
}
"""
2019-10-24 13:42:46 +03:00
2019-09-30 17:59:06 +03:00
mp = parser . ModuleJsonManifestParser ( contents )
2019-10-17 00:17:16 +03:00
assert not jsondiff . diff (
mp . as_dict (),
2019-09-30 17:59:06 +03:00
{
"name" : "YottaLibrary" ,
"description" : "This is Yotta library" ,
"homepage" : "https://yottabuild.org" ,
"keywords" : [ "mbed" , "Yotta" ],
"license" : "Apache-2.0" ,
"platforms" : [ "*" ],
"frameworks" : [ "mbed" ],
"export" : { "exclude" : [ "tests" , "test" , "*.doxyfile" , "*.pdf" ]},
2019-10-17 00:17:16 +03:00
"authors" : [{ "email" : "name@surname.com" , "name" : "Name Surname" }],
2019-09-30 17:59:06 +03:00
"version" : "1.2.3" ,
2019-10-24 13:42:46 +03:00
"repository" : { "type" : "git" , "url" : "git@github.com:username/repo.git" },
"customField" : "Custom Value" ,
2019-10-17 00:17:16 +03:00
},
2019-09-30 17:59:06 +03:00
)
2015-05-29 18:34:21 +03:00
2015-02-24 20:11:57 +02:00
2019-09-30 17:59:06 +03:00
def test_library_properties_parser ():
# Base
contents = """
name=TestPackage
version=1.2.3
author=SomeAuthor <info AT author.com>
sentence=This is Arduino library
2019-10-24 13:42:46 +03:00
customField=Custom Value
2019-09-30 17:59:06 +03:00
"""
mp = parser . LibraryPropertiesManifestParser ( contents )
2019-10-17 00:17:16 +03:00
assert not jsondiff . diff (
mp . as_dict (),
2019-09-30 17:59:06 +03:00
{
"name" : "TestPackage" ,
"version" : "1.2.3" ,
"description" : "This is Arduino library" ,
2019-10-24 13:42:46 +03:00
"sentence" : "This is Arduino library" ,
2019-09-30 17:59:06 +03:00
"platforms" : [ "*" ],
"frameworks" : [ "arduino" ],
"export" : {
2019-10-17 00:17:16 +03:00
"exclude" : [ "extras" , "docs" , "tests" , "test" , "*.doxyfile" , "*.pdf" ]
2019-09-30 17:59:06 +03:00
},
2019-10-17 00:17:16 +03:00
"authors" : [{ "email" : "info@author.com" , "name" : "SomeAuthor" }],
2019-09-30 17:59:06 +03:00
"keywords" : [ "uncategorized" ],
2019-10-24 13:42:46 +03:00
"customField" : "Custom Value" ,
2019-10-17 00:17:16 +03:00
},
2019-09-30 17:59:06 +03:00
)
2017-03-08 17:24:58 +02:00
2019-09-30 17:59:06 +03:00
# Platforms ALL
2019-10-04 18:30:48 +03:00
data = parser . LibraryPropertiesManifestParser (
"architectures=* \n " + contents
) . as_dict ()
assert data [ "platforms" ] == [ "*" ]
2019-09-30 17:59:06 +03:00
# Platforms specific
2019-10-04 18:30:48 +03:00
data = parser . LibraryPropertiesManifestParser (
"architectures=avr, esp32 \n " + contents
) . as_dict ()
assert data [ "platforms" ] == [ "atmelavr" , "espressif32" ]
2019-09-30 17:59:06 +03:00
# Remote URL
2019-10-04 18:30:48 +03:00
data = parser . LibraryPropertiesManifestParser (
2019-09-30 17:59:06 +03:00
contents ,
remote_url = (
"https://raw.githubusercontent.com/username/reponame/master/"
"libraries/TestPackage/library.properties"
),
2019-10-04 18:30:48 +03:00
) . as_dict ()
assert data [ "export" ] == {
2019-09-30 17:59:06 +03:00
"exclude" : [ "extras" , "docs" , "tests" , "test" , "*.doxyfile" , "*.pdf" ],
2019-10-17 21:19:04 +03:00
"include" : [ "libraries/TestPackage" ],
2019-09-30 17:59:06 +03:00
}
2019-10-04 18:30:48 +03:00
assert data [ "repository" ] == {
"url" : "https://github.com/username/reponame" ,
"type" : "git" ,
}
2019-09-30 17:59:06 +03:00
# Hope page
2019-10-04 18:30:48 +03:00
data = parser . LibraryPropertiesManifestParser (
2019-09-30 17:59:06 +03:00
"url=https://github.com/username/reponame.git \n " + contents
2019-10-04 18:30:48 +03:00
) . as_dict ()
assert data [ "repository" ] == {
2019-09-30 17:59:06 +03:00
"type" : "git" ,
"url" : "https://github.com/username/reponame.git" ,
}
2019-10-17 12:38:35 +03:00
def test_library_json_schema ():
2019-09-30 17:59:06 +03:00
contents = """
{
"name": "ArduinoJson",
"keywords": "JSON, rest, http, web",
"description": "An elegant and efficient JSON library for embedded systems",
"homepage": "https://arduinojson.org",
"repository": {
"type": "git",
"url": "https://github.com/bblanchon/ArduinoJson.git"
},
"version": "6.12.0",
"authors": {
"name": "Benoit Blanchon",
"url": "https://blog.benoitblanchon.fr"
},
"exclude": [
"fuzzing",
"scripts",
"test",
"third-party"
],
"frameworks": "arduino",
"platforms": "*",
2019-10-01 17:37:11 +03:00
"license": "MIT",
2019-10-02 11:04:29 +03:00
"examples": [
{
"name": "JsonConfigFile",
2019-10-01 17:37:11 +03:00
"base": "examples/JsonConfigFile",
"files": ["JsonConfigFile.ino"]
},
2019-10-02 11:04:29 +03:00
{
"name": "JsonHttpClient",
2019-10-01 17:37:11 +03:00
"base": "examples/JsonHttpClient",
"files": ["JsonHttpClient.ino"]
}
2019-10-02 11:04:29 +03:00
]
2019-09-30 17:59:06 +03:00
}
"""
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new (
2019-10-01 00:11:31 +03:00
contents , parser . ManifestFileType . LIBRARY_JSON
2019-10-04 18:30:48 +03:00
) . as_dict ()
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = True ) . load ( raw_data )
assert not errors
assert data [ "repository" ][ "url" ] == "https://github.com/bblanchon/ArduinoJson.git"
assert data [ "examples" ][ 1 ][ "base" ] == "examples/JsonHttpClient"
assert data [ "examples" ][ 1 ][ "files" ] == [ "JsonHttpClient.ino" ]
assert not jsondiff . diff (
data ,
{
2019-09-30 17:59:06 +03:00
"name" : "ArduinoJson" ,
"keywords" : [ "json" , "rest" , "http" , "web" ],
"description" : "An elegant and efficient JSON library for embedded systems" ,
"homepage" : "https://arduinojson.org" ,
"repository" : {
"url" : "https://github.com/bblanchon/ArduinoJson.git" ,
"type" : "git" ,
},
"version" : "6.12.0" ,
2019-09-30 19:44:03 +03:00
"authors" : [
2019-10-17 00:17:16 +03:00
{ "name" : "Benoit Blanchon" , "url" : "https://blog.benoitblanchon.fr" }
2019-09-30 19:44:03 +03:00
],
2019-10-17 00:17:16 +03:00
"export" : { "exclude" : [ "fuzzing" , "scripts" , "test" , "third-party" ]},
2019-09-30 17:59:06 +03:00
"frameworks" : [ "arduino" ],
"platforms" : [ "*" ],
"license" : "MIT" ,
2019-10-02 11:04:29 +03:00
"examples" : [
{
"name" : "JsonConfigFile" ,
2019-10-01 17:37:11 +03:00
"base" : "examples/JsonConfigFile" ,
"files" : [ "JsonConfigFile.ino" ],
},
2019-10-02 11:04:29 +03:00
{
"name" : "JsonHttpClient" ,
2019-10-01 17:37:11 +03:00
"base" : "examples/JsonHttpClient" ,
"files" : [ "JsonHttpClient.ino" ],
},
2019-10-02 11:04:29 +03:00
],
2019-10-17 00:17:16 +03:00
},
2019-09-30 17:59:06 +03:00
)
2019-09-30 23:45:03 +03:00
2019-10-17 12:38:35 +03:00
def test_library_properties_schema ():
2019-09-30 23:45:03 +03:00
contents = """
name=U8glib
version=1.19.1
author=oliver <olikraus@gmail.com>
maintainer=oliver <olikraus@gmail.com>
sentence=A library for monochrome TFTs and OLEDs
paragraph=Supported display controller: SSD1306, SSD1309, SSD1322, SSD1325
category=Display
url=https://github.com/olikraus/u8glib
architectures=avr,sam
"""
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new (
2019-09-30 23:45:03 +03:00
contents , parser . ManifestFileType . LIBRARY_PROPERTIES
2019-10-04 18:30:48 +03:00
) . as_dict ()
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = True ) . load ( raw_data )
assert not errors
assert not jsondiff . diff (
data ,
{
2019-09-30 23:45:03 +03:00
"description" : (
"A library for monochrome TFTs and OLEDs. Supported display "
"controller: SSD1306, SSD1309, SSD1322, SSD1325"
),
2019-10-17 00:17:16 +03:00
"repository" : { "url" : "https://github.com/olikraus/u8glib" , "type" : "git" },
2019-09-30 23:45:03 +03:00
"frameworks" : [ "arduino" ],
"platforms" : [ "atmelavr" , "atmelsam" ],
"version" : "1.19.1" ,
"export" : {
2019-10-17 00:17:16 +03:00
"exclude" : [ "extras" , "docs" , "tests" , "test" , "*.doxyfile" , "*.pdf" ]
2019-09-30 23:45:03 +03:00
},
"authors" : [
2019-10-17 00:17:16 +03:00
{ "maintainer" : True , "email" : "olikraus@gmail.com" , "name" : "oliver" }
2019-09-30 23:45:03 +03:00
],
"keywords" : [ "display" ],
"name" : "U8glib" ,
2019-10-17 00:17:16 +03:00
},
2019-09-30 23:45:03 +03:00
)
2019-10-04 23:52:06 +03:00
# Broken fields
contents = """
name=Mozzi
version=1.0.3
author=Tim Barrass and contributors as documented in source, and at https://github.com/sensorium/Mozzi/graphs/contributors
maintainer=Tim Barrass <faveflave@gmail.com>
sentence=Sound synthesis library for Arduino
paragraph=With Mozzi, you can construct sounds using familiar synthesis units like oscillators, delays, filters and envelopes.
category=Signal Input/Output
url=https://sensorium.github.io/Mozzi/
architectures=*
dot_a_linkage=false
includes=MozziGuts.h
"""
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new (
2019-10-04 23:52:06 +03:00
contents ,
parser . ManifestFileType . LIBRARY_PROPERTIES ,
remote_url = (
"https://raw.githubusercontent.com/sensorium/Mozzi/"
"master/library.properties"
),
) . as_dict ()
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = False ) . load ( raw_data )
assert errors [ "authors" ]
assert not jsondiff . diff (
data ,
{
2019-10-04 23:52:06 +03:00
"name" : "Mozzi" ,
"version" : "1.0.3" ,
"description" : (
"Sound synthesis library for Arduino. With Mozzi, you can construct "
"sounds using familiar synthesis units like oscillators, delays, "
"filters and envelopes."
),
"repository" : { "url" : "https://github.com/sensorium/Mozzi" , "type" : "git" },
"platforms" : [ "*" ],
"frameworks" : [ "arduino" ],
"export" : {
2019-10-17 00:17:16 +03:00
"exclude" : [ "extras" , "docs" , "tests" , "test" , "*.doxyfile" , "*.pdf" ]
2019-10-04 23:52:06 +03:00
},
"authors" : [
{
"maintainer" : True ,
"email" : "faveflave@gmail.com" ,
"name" : "Tim Barrass" ,
}
],
"keywords" : [ "signal" , "input" , "output" ],
"homepage" : "https://sensorium.github.io/Mozzi/" ,
2019-10-17 00:17:16 +03:00
},
2019-10-04 23:52:06 +03:00
)
2019-09-30 23:45:03 +03:00
2019-10-17 12:38:35 +03:00
def test_platform_json_schema ():
2019-10-01 22:03:23 +03:00
contents = """
{
"name": "atmelavr",
"title": "Atmel AVR",
"description": "Atmel AVR 8- and 32-bit MCUs deliver a unique combination of performance, power efficiency and design flexibility. Optimized to speed time to market-and easily adapt to new ones-they are based on the industrys most code-efficient architecture for C and assembly programming.",
"url": "http://www.atmel.com/products/microcontrollers/avr/default.aspx",
"homepage": "http://platformio.org/platforms/atmelavr",
"license": "Apache-2.0",
"engines": {
"platformio": "<5"
},
"repository": {
"type": "git",
"url": "https://github.com/platformio/platform-atmelavr.git"
},
"version": "1.15.0",
"frameworks": {
"arduino": {
"package": "framework-arduinoavr",
"script": "builder/frameworks/arduino.py"
},
"simba": {
"package": "framework-simba",
"script": "builder/frameworks/simba.py"
}
},
"packages": {
"toolchain-atmelavr": {
"type": "toolchain",
"version": "~1.50400.0"
},
"framework-arduinoavr": {
"type": "framework",
"optional": true,
"version": "~4.2.0"
},
"framework-simba": {
"type": "framework",
"optional": true,
"version": ">=7.0.0"
},
"tool-avrdude": {
"type": "uploader",
"optional": true,
"version": "~1.60300.0"
}
}
}
"""
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new (
2019-10-01 22:03:23 +03:00
contents , parser . ManifestFileType . PLATFORM_JSON
2019-10-04 18:30:48 +03:00
) . as_dict ()
2019-10-17 12:38:35 +03:00
raw_data [ "frameworks" ] = sorted ( raw_data [ "frameworks" ])
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = False ) . load ( raw_data )
assert not errors
assert not jsondiff . diff (
data ,
{
2019-10-01 22:03:23 +03:00
"name" : "atmelavr" ,
"title" : "Atmel AVR" ,
"description" : (
"Atmel AVR 8- and 32-bit MCUs deliver a unique combination of "
"performance, power efficiency and design flexibility. Optimized to "
"speed time to market-and easily adapt to new ones-they are based "
"on the industrys most code-efficient architecture for C and "
"assembly programming."
),
"homepage" : "http://platformio.org/platforms/atmelavr" ,
"license" : "Apache-2.0" ,
"repository" : {
"url" : "https://github.com/platformio/platform-atmelavr.git" ,
"type" : "git" ,
},
2019-10-17 12:38:35 +03:00
"frameworks" : sorted ([ "arduino" , "simba" ]),
2019-10-01 22:03:23 +03:00
"version" : "1.15.0" ,
2019-10-17 18:48:59 +03:00
},
2019-10-01 22:03:23 +03:00
)
2019-10-17 12:38:35 +03:00
def test_package_json_schema ():
2019-10-01 22:03:23 +03:00
contents = """
{
"name": "tool-scons",
"description": "SCons software construction tool",
"url": "http://www.scons.org",
"version": "3.30101.0"
}
"""
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new (
2019-10-01 22:03:23 +03:00
contents , parser . ManifestFileType . PACKAGE_JSON
2019-10-04 18:30:48 +03:00
) . as_dict ()
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = False ) . load ( raw_data )
assert not errors
assert not jsondiff . diff (
data ,
{
2019-10-01 22:03:23 +03:00
"name" : "tool-scons" ,
"description" : "SCons software construction tool" ,
"homepage" : "http://www.scons.org" ,
"version" : "3.30101.0" ,
2019-10-17 00:17:16 +03:00
},
2019-10-01 22:03:23 +03:00
)
mp = parser . ManifestParserFactory . new (
'{"system": "*"}' , parser . ManifestFileType . PACKAGE_JSON
)
assert "system" not in mp . as_dict ()
mp = parser . ManifestParserFactory . new (
2019-10-24 15:10:11 +03:00
'{"system": "all"}' , parser . ManifestFileType . PACKAGE_JSON
)
assert "system" not in mp . as_dict ()
mp = parser . ManifestParserFactory . new (
2019-10-01 22:03:23 +03:00
'{"system": "darwin_x86_64"}' , parser . ManifestFileType . PACKAGE_JSON
)
assert mp . as_dict ()[ "system" ] == [ "darwin_x86_64" ]
2019-10-03 16:14:51 +03:00
def test_parser_from_dir ( tmpdir_factory ):
pkg_dir = tmpdir_factory . mktemp ( "package" )
pkg_dir . join ( "library.json" ) . write ( '{"name": "library.json"}' )
pkg_dir . join ( "library.properties" ) . write ( "name=library.properties" )
data = parser . ManifestParserFactory . new_from_dir ( str ( pkg_dir )) . as_dict ()
assert data [ "name" ] == "library.json"
data = parser . ManifestParserFactory . new_from_dir (
str ( pkg_dir ), remote_url = "http://localhost/library.properties"
) . as_dict ()
assert data [ "name" ] == "library.properties"
2019-10-02 17:54:59 +03:00
def test_examples_from_dir ( tmpdir_factory ):
package_dir = tmpdir_factory . mktemp ( "project" )
2019-10-03 14:55:04 +03:00
package_dir . join ( "library.json" ) . write (
'{"name": "pkg", "version": "1.0.0", "examples": ["examples/*/*.pde"]}'
)
2019-10-02 17:54:59 +03:00
examples_dir = package_dir . mkdir ( "examples" )
# PlatformIO project #1
pio_dir = examples_dir . mkdir ( "PlatformIO" ) . mkdir ( "hello" )
2019-10-02 20:42:01 +03:00
pio_dir . join ( ".vimrc" ) . write ( "" )
2019-10-07 20:35:01 +03:00
pio_ini = pio_dir . join ( "platformio.ini" )
pio_ini . write ( "" )
2019-10-15 13:05:56 +03:00
if not WINDOWS :
pio_dir . join ( "platformio.ini.copy" ) . mksymlinkto ( pio_ini )
2019-10-02 17:54:59 +03:00
pio_dir . mkdir ( "include" ) . join ( "main.h" ) . write ( "" )
pio_dir . mkdir ( "src" ) . join ( "main.cpp" ) . write ( "" )
# wiring examples
2019-10-03 12:47:41 +03:00
arduino_dir = examples_dir . mkdir ( "1. General" )
arduino_dir . mkdir ( "SomeSketchIno" ) . join ( "SomeSketchIno.ino" ) . write ( "" )
arduino_dir . mkdir ( "SomeSketchPde" ) . join ( "SomeSketchPde.pde" ) . write ( "" )
2019-10-02 17:54:59 +03:00
# custom examples
demo_dir = examples_dir . mkdir ( "demo" )
demo_dir . join ( "demo.cpp" ) . write ( "" )
demo_dir . join ( "demo.h" ) . write ( "" )
demo_dir . join ( "util.h" ) . write ( "" )
# PlatformIO project #2
pio_dir = examples_dir . mkdir ( "world" )
pio_dir . join ( "platformio.ini" ) . write ( "" )
pio_dir . join ( "README" ) . write ( "" )
pio_dir . join ( "extra.py" ) . write ( "" )
pio_dir . mkdir ( "include" ) . join ( "world.h" ) . write ( "" )
pio_dir . mkdir ( "src" ) . join ( "world.c" ) . write ( "" )
2019-10-03 12:47:41 +03:00
# example files in root
examples_dir . join ( "root.c" ) . write ( "" )
examples_dir . join ( "root.h" ) . write ( "" )
2019-10-02 17:54:59 +03:00
# invalid example
examples_dir . mkdir ( "invalid-example" ) . join ( "hello.json" )
# Do testing
2019-10-17 00:17:16 +03:00
raw_data = parser . ManifestParserFactory . new_from_dir ( str ( package_dir )) . as_dict ()
assert isinstance ( raw_data [ "examples" ], list )
assert len ( raw_data [ "examples" ]) == 6
2019-10-02 17:54:59 +03:00
2019-10-18 22:00:28 +03:00
def _to_unix_path ( path ):
return re . sub ( r "[ \\ /]+" , "/" , path )
2019-10-02 17:54:59 +03:00
def _sort_examples ( items ):
for i , item in enumerate ( items ):
2019-10-18 22:00:28 +03:00
items [ i ][ "base" ] = _to_unix_path ( items [ i ][ "base" ])
items [ i ][ "files" ] = [ _to_unix_path ( f ) for f in sorted ( items [ i ][ "files" ])]
2019-10-02 17:54:59 +03:00
return sorted ( items , key = lambda item : item [ "name" ])
2019-10-17 00:17:16 +03:00
raw_data [ "examples" ] = _sort_examples ( raw_data [ "examples" ])
data , errors = ManifestSchema ( strict = True ) . load ( raw_data )
assert not errors
assert not jsondiff . diff (
data ,
{
2019-10-02 17:54:59 +03:00
"version" : "1.0.0" ,
"name" : "pkg" ,
"examples" : _sort_examples (
[
{
"name" : "PlatformIO/hello" ,
2019-10-17 23:40:30 +03:00
"base" : os . path . join ( "examples" , "PlatformIO" , "hello" ),
"files" : [
"platformio.ini" ,
os . path . join ( "include" , "main.h" ),
os . path . join ( "src" , "main.cpp" ),
],
2019-10-02 17:54:59 +03:00
},
{
2019-10-03 12:47:41 +03:00
"name" : "1_General/SomeSketchIno" ,
2019-10-17 23:40:30 +03:00
"base" : os . path . join ( "examples" , "1. General" , "SomeSketchIno" ),
2019-10-02 17:54:59 +03:00
"files" : [ "SomeSketchIno.ino" ],
},
{
2019-10-03 12:47:41 +03:00
"name" : "1_General/SomeSketchPde" ,
2019-10-17 23:40:30 +03:00
"base" : os . path . join ( "examples" , "1. General" , "SomeSketchPde" ),
2019-10-02 17:54:59 +03:00
"files" : [ "SomeSketchPde.pde" ],
},
{
"name" : "demo" ,
2019-10-17 23:40:30 +03:00
"base" : os . path . join ( "examples" , "demo" ),
2019-10-02 17:54:59 +03:00
"files" : [ "demo.h" , "util.h" , "demo.cpp" ],
},
{
"name" : "world" ,
"base" : "examples/world" ,
"files" : [
"platformio.ini" ,
2019-10-17 23:40:30 +03:00
os . path . join ( "include" , "world.h" ),
os . path . join ( "src" , "world.c" ),
2019-10-02 17:54:59 +03:00
"README" ,
"extra.py" ,
],
},
2019-10-03 12:47:41 +03:00
{
"name" : "Examples" ,
"base" : "examples" ,
"files" : [ "root.c" , "root.h" ],
},
2019-10-02 17:54:59 +03:00
]
),
2019-10-17 00:17:16 +03:00
},
2019-10-02 17:54:59 +03:00
)
2019-10-17 12:38:35 +03:00
def test_broken_schemas ():
2019-10-01 16:13:25 +03:00
# non-strict mode
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = False ) . load ( dict ( name = "MyPackage" ))
assert set ( errors . keys ()) == set ([ "version" ])
assert data . get ( "version" ) is None
2019-10-04 18:30:48 +03:00
# invalid keywords
2019-10-17 00:17:16 +03:00
data , errors = ManifestSchema ( strict = False ) . load ( dict ( keywords = [ "kw1" , "*^[]" ]))
assert errors
assert data [ "keywords" ] == [ "kw1" ]
2019-10-01 16:13:25 +03:00
# strict mode
2019-10-17 00:17:16 +03:00
with pytest . raises (
ManifestValidationError , match = "Missing data for required field"
):
ManifestSchema ( strict = True ) . load ( dict ( name = "MyPackage" ))
2019-09-30 23:45:03 +03:00
# broken SemVer
with pytest . raises (
2019-10-17 00:17:16 +03:00
ManifestValidationError , match = ( "Invalid semantic versioning format" )
2019-09-30 23:45:03 +03:00
):
2019-10-17 00:17:16 +03:00
ManifestSchema ( strict = True ) . load (
dict ( name = "MyPackage" , version = "broken_version" )
2019-10-01 16:13:25 +03:00
)
2019-10-02 12:34:50 +03:00
2019-10-17 00:17:16 +03:00
# broken value for Nested
with pytest . raises ( ManifestValidationError , match = r "authors.*Invalid input type" ):
ManifestSchema ( strict = True ) . load (
dict (
name = "MyPackage" ,
description = "MyDescription" ,
keywords = [ "a" , "b" ],
authors = [ "should be dict here" ],
version = "1.2.3" ,
)
2019-10-02 12:34:50 +03:00
)