diff --git a/.clang-format b/.clang-format index 2035f39..fc8d375 100644 --- a/.clang-format +++ b/.clang-format @@ -1,6 +1,6 @@ -AccessModifierOffset: -4 -AlignAfterOpenBracket: AlwaysBreak -AlignArrayOfStructures: Left +AccessModifierOffset: -4 +AlignAfterOpenBracket: AlwaysBreak +AlignArrayOfStructures: Left AlignConsecutiveAssignments: Enabled: true AcrossEmptyLines: false @@ -14,70 +14,71 @@ AlignConsecutiveBitFields: AlignConsecutiveDeclarations: Enabled: false AcrossEmptyLines: false - AcrossComments: false + AcrossComments: false AlignConsecutiveMacros: Enabled: true AcrossEmptyLines: false - AcrossComments: false -AlignEscapedNewlines: Left -AlignOperands: Align + AcrossComments: false +AlignEscapedNewlines: Left +AlignOperands: Align AlignTrailingComments: Kind: Never # OverEmptyLines - Unused # MaxEmptyLinesToKeep - Unused -AllowAllArgumentsOnNextLine: false -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: Never -AllowShortCaseLabelsOnASingleLine: false -AllowShortEnumsOnASingleLine: false -AllowShortFunctionsOnASingleLine: None -AllowShortIfStatementsOnASingleLine: Never -AllowShortLambdasOnASingleLine: None -AllowShortLoopsOnASingleLine: false -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: Yes -AttributeMacros: [] -BinPackArguments: false -BinPackParameters: false +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +# AlignConsecutiveShortCaseStatements - Unused +AllowShortEnumsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: None +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: [] +BinPackArguments: false +BinPackParameters: false BitFieldColonSpacing: Both # BraceWrapping - Ignored because of 'BreakBeforeBraces' # BracedInitializerIndentWidth - Ignored, prioritizing 'ContinuationIndentWidth' BreakAfterAttributes: Never BreakAfterJavaFieldAnnotations: true BreakArrays: true -BreakBeforeBinaryOperators: None -BreakBeforeBraces: Allman +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Allman BreakBeforeConceptDeclarations: Always BreakBeforeInlineASMColon: Always -BreakBeforeTernaryOperators: false -BreakConstructorInitializers: AfterColon -BreakInheritanceList: AfterColon -BreakStringLiterals: true +BreakBeforeTernaryOperators: false +BreakConstructorInitializers: AfterColon +BreakInheritanceList: AfterColon +BreakStringLiterals: true ColumnLimit: 120 # CommentPragmas - Unused -CompactNamespaces: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DerivePointerAlignment: false -DisableFormat: false -EmptyLineAfterAccessModifier: Never -EmptyLineBeforeAccessModifier: Always -FixNamespaceComments: false -ForEachMacros: [] -IfMacros: [] +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: Always +FixNamespaceComments: false +ForEachMacros: [] +IfMacros: [] IncludeBlocks: Regroup # IncludeCategories - Unused # IncludeIsMainRegex - Unused # IncludeIsMainSourceRegex - Unused -IndentAccessModifiers: false -IndentCaseBlocks: false -IndentCaseLabels: true -IndentExternBlock: Indent -IndentGotoLabels: false -IndentPPDirectives: AfterHash -IndentRequiresClause: true +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: true +IndentExternBlock: Indent +IndentGotoLabels: false +IndentPPDirectives: AfterHash +IndentRequiresClause: true IndentWidth: 4 IndentWrappedFunctionNames: true InsertBraces: true @@ -85,7 +86,7 @@ InsertNewlineAtEOF: true InsertTrailingCommas: None IntegerLiteralSeparator: Binary: -1 -# BinaryMinDigits - Unused + # BinaryMinDigits - Unused Decimal: 3 DecimalMinDigits: 5 Hex: 2 @@ -93,22 +94,23 @@ IntegerLiteralSeparator: # JavaImportGroups - Unused # JavaScriptQuotes - Unused # JavaScriptWrapImports - Unused -KeepEmptyLinesAtTheStartOfBlocks: false -LambdaBodyIndentation: Signature +# KeepEmptyLinesAtEOF: false - Unsupported Clang 17 +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature Language: Cpp LineEnding: LF # MacroBlockBegin - Unused # MacroBlockEnd - Unused # Macros - Unused -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: All +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All NamespaceMacros: [] # ObjCBinPackProtocolList - Unused # ObjCBlockIndentWidth - Unused # ObjCBreakBeforeNestedBlockParam - Unused # ObjCSpaceAfterProperty - Unused # ObjCSpaceBeforeProtocolList - Unused -PPIndentWidth: -1 +PPIndentWidth: -1 PackConstructorInitializers: Never # PenaltyBreakAssignment - Unused # PenaltyBreakBeforeFirstCallParameter - Unused @@ -120,13 +122,14 @@ PackConstructorInitializers: Never # PenaltyExcessCharacter - Unused # PenaltyIndentedWhitespace - Unused # PenaltyReturnTypeOnItsOwnLine - Unused -PointerAlignment: Left +PointerAlignment: Left QualifierAlignment: Left # QualifierOrder: ['inline', 'friend', 'static', 'constexpr', 'restrict', 'type', 'const', 'volatile' ] - Not supported # RawStringFormats - Unused -ReferenceAlignment: Left -ReflowComments: true +ReferenceAlignment: Left +ReflowComments: true RemoveBracesLLVM: false +# RemoveParentheses: ReturnStatement - Unsupported Clang 17 RemoveSemicolon: true RequiresClausePosition: OwnLine RequiresExpressionIndentation: OuterScope @@ -134,17 +137,17 @@ SeparateDefinitionBlocks: Always ShortNamespaceLines: 0 SortIncludes: CaseSensitive # SortJavaStaticImport - Unused -SortUsingDeclarations: LexicographicNumeric -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: false -SpaceAroundPointerQualifiers: Before -SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: true -SpaceBeforeCpp11BracedList: true -SpaceBeforeCtorInitializerColon: true +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceAroundPointerQualifiers: Before +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: true +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true -# SpaceBeforeJsonColon: false - Requires clang-format 17 +# SpaceBeforeJsonColon: false - Unsupported Clang 17 SpaceBeforeParens: Custom SpaceBeforeParensOptions: AfterControlStatements: true @@ -156,25 +159,26 @@ SpaceBeforeParensOptions: AfterRequiresInClause: false AfterRequiresInExpression: false BeforeNonEmptyParentheses: false -SpaceBeforeRangeBasedForLoopColon: false -SpaceBeforeSquareBrackets: false -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 2 -SpacesInAngles: Never -SpacesInCStyleCastParentheses: false -SpacesInConditionalStatement: false -SpacesInContainerLiterals: false +SpaceBeforeRangeBasedForLoopColon: false +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: Never +SpacesInCStyleCastParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false SpacesInLineCommentPrefix: Minimum: 1 Maximum: -1 -SpacesInParentheses: false -SpacesInSquareBrackets: false -Standard: Latest -StatementAttributeLikeMacros: [] -StatementMacros: [] -TabWidth: 4 -TypenameMacros: [] +# SpacesInParentheses: Never - Unsupported Clang 17 +# SpacesInParensOptions: - Unused +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: [] +StatementMacros: [] +TabWidth: 4 +TypenameMacros: [] UseTab: Always # VerilogBreakBetweenInstancePorts - Unused WhitespaceSensitiveMacros: [] diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..75b823a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.ixx": "cpp" + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index db5fbb0..4675706 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,29 +6,49 @@ project(honesty LANGUAGES CXX ) -# Enable CTest for the project -include(CTest) +option(BUILD_TESTING "Build the tests verifying Honesty functionality" ON) -# Provide a namespaced alias +# Provide the library definition add_library(honesty STATIC) add_library(synodic::honesty ALIAS honesty) -set_target_properties(honesty +# Provide a convenience variant with a main function +add_library(honesty_main STATIC) +add_library(synodic::honesty::main ALIAS honesty_main) + +set_target_properties(honesty honesty_main PROPERTIES LINKER_LANGUAGE CXX CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS NO + FOLDER "honesty" +) + +# Link the library to the convenience variant +target_link_libraries(honesty_main +PUBLIC + synodic::honesty ) +# Gather all the project files add_subdirectory( - "library" + src ) +# Glob all files to add a source group tree. Includes all files +file(GLOB_RECURSE file_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*) + +# Must be called from the target definition directory. Only matched against target source files (No nested CMakeList.txt, docs, etc). +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/src FILES ${file_list}) + if(BUILD_TESTING) + # Do not include CTest because it adds targets and integrations we do not want to support + enable_testing() + add_subdirectory( - "tests" + tests ) endif() \ No newline at end of file diff --git a/CMakePresets.json b/CMakePresets.json index dae1256..6c308eb 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,13 +1,13 @@ { - "version": 6, - "cmakeMinimumRequired": { - "major": 3, - "minor": 28, - "patch": 0 - }, - "include": [ - "tool/cmake/presets/linux.json", - "tool/cmake/presets/macos.json", - "tool/cmake/presets/windows.json" - ] + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 28, + "patch": 0 + }, + "include": [ + "tool/cmake/presets/linux.json", + "tool/cmake/presets/macos.json", + "tool/cmake/presets/windows.json" + ] } \ No newline at end of file diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 0000000..54b929d --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,4 @@ +name: honesty +title: Honesty Documentation +nav: + - modules/ROOT/nav.adoc diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc new file mode 100644 index 0000000..f74eadc --- /dev/null +++ b/docs/modules/ROOT/nav.adoc @@ -0,0 +1 @@ +* xref:index.adoc[] \ No newline at end of file diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 0000000..cff7e73 --- /dev/null +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,4 @@ += Honesty Documentation +:navtitle: Honesty Documentation + +== Honesty \ No newline at end of file diff --git a/pdm.lock b/pdm.lock new file mode 100644 index 0000000..5847ea7 --- /dev/null +++ b/pdm.lock @@ -0,0 +1,953 @@ +# This file is @generated by PDM. +# It is not intended for manual editing. + +[metadata] +groups = ["default", "dev", "lint", "test"] +cross_platform = true +static_urls = false +lock_version = "4.3" +content_hash = "sha256:296d9115d220a5bb1e5e8bb0278dcb71d51ed803096eeeda41b5663fc37f735e" + +[[package]] +name = "annotated-types" +version = "0.6.0" +requires_python = ">=3.8" +summary = "Reusable constraint types to use with typing.Annotated" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "astroid" +version = "3.0.0" +requires_python = ">=3.8.0" +summary = "An abstract syntax tree for Python with inference support." +files = [ + {file = "astroid-3.0.0-py3-none-any.whl", hash = "sha256:f2510e7fdcd6cfda4ec50014726d4857abf79acfc010084ce8c26091913f1b25"}, + {file = "astroid-3.0.0.tar.gz", hash = "sha256:1defdbca052635dd29657ea674edfc45e4b5be9cd53630c5b084fcfed94344a8"}, +] + +[[package]] +name = "black" +version = "23.9.1" +requires_python = ">=3.8" +summary = "The uncompromising code formatter." +dependencies = [ + "click>=8.0.0", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", +] +files = [ + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, +] + +[[package]] +name = "blinker" +version = "1.6.3" +requires_python = ">=3.7" +summary = "Fast, simple object-to-object and broadcast signaling" +files = [ + {file = "blinker-1.6.3-py3-none-any.whl", hash = "sha256:296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"}, + {file = "blinker-1.6.3.tar.gz", hash = "sha256:152090d27c1c5c722ee7e48504b02d76502811ce02e1523553b4cf8c8b3d3a8d"}, +] + +[[package]] +name = "cachecontrol" +version = "0.13.1" +requires_python = ">=3.7" +summary = "httplib2 caching for requests" +dependencies = [ + "msgpack>=0.5.2", + "requests>=2.16.0", +] +files = [ + {file = "cachecontrol-0.13.1-py3-none-any.whl", hash = "sha256:95dedbec849f46dda3137866dc28b9d133fc9af55f5b805ab1291833e4457aa4"}, + {file = "cachecontrol-0.13.1.tar.gz", hash = "sha256:f012366b79d2243a6118309ce73151bf52a38d4a5dac8ea57f09bd29087e506b"}, +] + +[[package]] +name = "cachecontrol" +version = "0.13.1" +extras = ["filecache"] +requires_python = ">=3.7" +summary = "httplib2 caching for requests" +dependencies = [ + "cachecontrol==0.13.1", + "filelock>=3.8.0", +] +files = [ + {file = "cachecontrol-0.13.1-py3-none-any.whl", hash = "sha256:95dedbec849f46dda3137866dc28b9d133fc9af55f5b805ab1291833e4457aa4"}, + {file = "cachecontrol-0.13.1.tar.gz", hash = "sha256:f012366b79d2243a6118309ce73151bf52a38d4a5dac8ea57f09bd29087e506b"}, +] + +[[package]] +name = "certifi" +version = "2023.7.22" +requires_python = ">=3.6" +summary = "Python package for providing Mozilla's CA Bundle." +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +requires_python = ">=3.7.0" +summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "8.1.7" +requires_python = ">=3.7" +summary = "Composable command line interface toolkit" +dependencies = [ + "colorama; platform_system == \"Windows\"", +] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[[package]] +name = "cmake" +version = "3.27.7" +summary = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" +files = [ + {file = "cmake-3.27.7-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:d582ef3e9ff0bd113581c1a32e881d1c2f9a34d2de76c93324a28593a76433db"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:8056c99e371ff57229df2068364d7c32fea716cb53b4675f639edfb62663decf"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:68983b09de633fc1ce6ab6bce9a25bfa181e41598e7c6bc0a6c0108773ee01cb"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bd1e1fa4fc8de7605c663d9408dceb649112f855aab05cca31fdb72e4d78364"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c981aafcca2cd7210bd210ec75710c0f34e1fde1998cdcab812e4133e3ab615d"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1b9067ce0251cba3d4c018f2e1577ba9078e9c1eff6ad607ad5ce867843d4571"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b8a2fcb619b89d1cce7b52828316de9a1f27f0c90c2e39d1eae886428c8ee8c6"}, + {file = "cmake-3.27.7-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:499b38c77d52fb1964dbb38d0228fed246263a181939a8e753fde8ca227c8e1e"}, + {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:2fb48c780f1a6a3d19e785ebbb754be79d369e25a1cb81043fab049e709564da"}, + {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7bf96237ba11ce2437dc5e071d96b510120a1be4708c631a64b2f38fb46bbd77"}, + {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:009058bdf4f488709f38eaa5dd0ef0f89c6b9c6b6edd9d5b475a308ef75f80bb"}, + {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:591f6b056527aefec009bc61a388776b2fc62444deb0038112a471031f61aeca"}, + {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:bd40d46dbad3555d5b3ce054bef24b85f256b19139493773751ab6f2b71c1219"}, + {file = "cmake-3.27.7-py2.py3-none-win32.whl", hash = "sha256:bdbf0256f554f68c7b1d9740f5d059daf875b685c81a479cbe69038e84eb2fb9"}, + {file = "cmake-3.27.7-py2.py3-none-win_amd64.whl", hash = "sha256:810e592b606d05a3080a9c19ea839b13226f62cae447a22485b2365782f6b926"}, + {file = "cmake-3.27.7-py2.py3-none-win_arm64.whl", hash = "sha256:72289361866314f73be2ae63ddee224ff70223dcef9feb66d0072bf17e245564"}, + {file = "cmake-3.27.7.tar.gz", hash = "sha256:9f4a7c7be2a25de5901f045618f41b833ea6c0f647115201d38e4fdf7e2815bc"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +summary = "Cross-platform colored terminal text." +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "conan" +version = "2.0.13" +requires_python = ">=3.6" +summary = "Conan C/C++ package manager" +dependencies = [ + "Jinja2<4.0.0,>=3.0", + "PyYAML<7.0,>=6.0", + "colorama<0.5.0,>=0.4.3", + "distro<=1.8.0,>=1.4.0; sys_platform == \"linux\" or sys_platform == \"linux2\"", + "fasteners>=0.15", + "patch-ng<1.18,>=1.17.4", + "python-dateutil<3,>=2.8.0", + "requests<3.0.0,>=2.25", + "urllib3<1.27,>=1.26.6", +] +files = [ + {file = "conan-2.0.13.tar.gz", hash = "sha256:695f3ffc512107818dc81e1dd3bab8cb7c4588cd5eced92147ed23de0e7c3b0a"}, +] + +[[package]] +name = "coverage" +version = "7.3.2" +requires_python = ">=3.8" +summary = "Code coverage measurement for Python" +files = [ + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[[package]] +name = "coverage" +version = "7.3.2" +extras = ["toml"] +requires_python = ">=3.8" +summary = "Code coverage measurement for Python" +dependencies = [ + "coverage==7.3.2", +] +files = [ + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[[package]] +name = "cppython" +version = "0.7.1.dev34" +requires_python = ">=3.11" +summary = "A Python management solution for C++ dependencies" +dependencies = [ + "click>=8.1.3", + "cppython-core>=0.4.1.dev19", + "packaging>=21.3", + "pydantic>=2.0a4", + "tomlkit>=0.11.4", +] +files = [ + {file = "cppython-0.7.1.dev34-py3-none-any.whl", hash = "sha256:c82e074e6bc733197b4a7bba3b673b749ed4dc61f270eb754927f832d7b44c0a"}, + {file = "cppython-0.7.1.dev34.tar.gz", hash = "sha256:1aeec513f82b7628abbe9b43763c40caa261f90d00c6e16a02e99a2a43d265a1"}, +] + +[[package]] +name = "cppython-conan" +version = "0.0.2.dev2" +requires_python = ">=3.11" +summary = "Conan provider for CPPython" +dependencies = [ + "conan>=2.0.0-beta4", + "cppython-core>=0.3.3.dev0", +] +files = [ + {file = "cppython-conan-0.0.2.dev2.tar.gz", hash = "sha256:b84fd1dfde6466656d5db906d72c641d258257974c8f3a61c52a6a1fb49858a8"}, + {file = "cppython_conan-0.0.2.dev2-py3-none-any.whl", hash = "sha256:346c502eaa5f2cdd0a6de219c17ce20e4360a3388622353fa434aceef908890e"}, +] + +[[package]] +name = "cppython-core" +version = "0.7.1.dev2" +requires_python = ">=3.11" +summary = "Data definitions for CPPython" +dependencies = [ + "pydantic>=2.0", + "synodic-utilities>=0.1.1.dev3", +] +files = [ + {file = "cppython_core-0.7.1.dev2-py3-none-any.whl", hash = "sha256:de4e1043fc8a4286f2476985160388d8c9e4ddcda93525770311bc881159ac0d"}, + {file = "cppython_core-0.7.1.dev2.tar.gz", hash = "sha256:c0198551fdf9129f3e9022aafc58118b5e5504457f060e54176621e16619ef83"}, +] + +[[package]] +name = "cppython-pdm" +version = "0.3.1.dev14" +requires_python = ">=3.11" +summary = "Interface plugin for CPPython that hooks into PDM" +dependencies = [ + "cppython>=0.7.1.dev20", + "pdm>=2.1.5", +] +files = [ + {file = "cppython-pdm-0.3.1.dev14.tar.gz", hash = "sha256:06b53f89be9b68c46bbe0d26bfc6edd75cc4df71f4a02383dfbc61316100dd89"}, + {file = "cppython_pdm-0.3.1.dev14-py3-none-any.whl", hash = "sha256:896af5a30be8549dd80a67dcc81a01fae2e3160c793b8c285cd5e1c5c82ffb49"}, +] + +[[package]] +name = "dill" +version = "0.3.7" +requires_python = ">=3.7" +summary = "serialize all of Python" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[[package]] +name = "distlib" +version = "0.3.7" +summary = "Distribution utilities" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] + +[[package]] +name = "distro" +version = "1.8.0" +requires_python = ">=3.6" +summary = "Distro - an OS platform information API" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + +[[package]] +name = "fasteners" +version = "0.19" +requires_python = ">=3.6" +summary = "A python package that provides useful locks" +files = [ + {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, + {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, +] + +[[package]] +name = "filelock" +version = "3.12.4" +requires_python = ">=3.8" +summary = "A platform independent file lock." +files = [ + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, +] + +[[package]] +name = "findpython" +version = "0.4.0" +requires_python = ">=3.7" +summary = "A utility to find python versions on your system" +dependencies = [ + "packaging>=20", +] +files = [ + {file = "findpython-0.4.0-py3-none-any.whl", hash = "sha256:087148ac5935f9be458f36a05f3fa479efdf2c629f5d386c73ea481cfecff15e"}, + {file = "findpython-0.4.0.tar.gz", hash = "sha256:18b14d115678da18ae92ee22d7001cc30915ea531053f77010ee05a39680f438"}, +] + +[[package]] +name = "idna" +version = "3.4" +requires_python = ">=3.5" +summary = "Internationalized Domain Names in Applications (IDNA)" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +requires_python = ">=3.7" +summary = "brain-dead simple config-ini parsing" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +requires_python = ">=3.7" +summary = "A library for installing Python wheels." +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +requires_python = ">=3.8.0" +summary = "A Python utility / library to sort Python imports." +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +dependencies = [ + "MarkupSafe>=2.0", +] +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Python port of markdown-it. Markdown parsing, done right!" +dependencies = [ + "mdurl~=0.1", +] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[[package]] +name = "markupsafe" +version = "2.1.3" +requires_python = ">=3.7" +summary = "Safely add untrusted strings to HTML/XML markup." +files = [ + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +requires_python = ">=3.6" +summary = "McCabe checker, plugin for flake8" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +requires_python = ">=3.7" +summary = "Markdown URL utilities" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "msgpack" +version = "1.0.7" +requires_python = ">=3.8" +summary = "MessagePack serializer" +files = [ + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, + {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, + {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, + {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, +] + +[[package]] +name = "mypy" +version = "1.6.0" +requires_python = ">=3.8" +summary = "Optional static typing for Python" +dependencies = [ + "mypy-extensions>=1.0.0", + "typing-extensions>=4.1.0", +] +files = [ + {file = "mypy-1.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:971104bcb180e4fed0d7bd85504c9036346ab44b7416c75dd93b5c8c6bb7e28f"}, + {file = "mypy-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab98b8f6fdf669711f3abe83a745f67f50e3cbaea3998b90e8608d2b459fd566"}, + {file = "mypy-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a69db3018b87b3e6e9dd28970f983ea6c933800c9edf8c503c3135b3274d5ad"}, + {file = "mypy-1.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dccd850a2e3863891871c9e16c54c742dba5470f5120ffed8152956e9e0a5e13"}, + {file = "mypy-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8598307150b5722854f035d2e70a1ad9cc3c72d392c34fffd8c66d888c90f17"}, + {file = "mypy-1.6.0-py3-none-any.whl", hash = "sha256:9e1589ca150a51d9d00bb839bfeca2f7a04f32cd62fad87a847bc0818e15d7dc"}, + {file = "mypy-1.6.0.tar.gz", hash = "sha256:4f3d27537abde1be6d5f2c96c29a454da333a2a271ae7d5bc7110e6d4b7beb3f"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +requires_python = ">=3.5" +summary = "Type system extensions for programs checked with the mypy type checker." +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.2" +requires_python = ">=3.7" +summary = "Core utilities for Python packages" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "patch-ng" +version = "1.17.4" +summary = "Library to parse and apply unified diffs." +files = [ + {file = "patch-ng-1.17.4.tar.gz", hash = "sha256:627abc5bd723c8b481e96849b9734b10065426224d4d22cd44137004ac0d4ace"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +requires_python = ">=3.7" +summary = "Utility library for gitignore style pattern matching of file paths." +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pdm" +version = "2.9.3" +requires_python = ">=3.7" +summary = "A modern Python package and dependency manager supporting the latest PEP standards" +dependencies = [ + "blinker", + "cachecontrol[filecache]>=0.13.0", + "certifi", + "findpython<1.0.0a0,>=0.4.0", + "installer<0.8,>=0.7", + "packaging!=22.0,>=20.9", + "platformdirs", + "pyproject-hooks", + "python-dotenv>=0.15", + "requests-toolbelt", + "resolvelib>=1.0.1", + "rich>=12.3.0", + "shellingham>=1.3.2", + "tomlkit<1,>=0.11.1", + "truststore; python_version >= \"3.10\"", + "unearth>=0.10.0", + "virtualenv>=20", +] +files = [ + {file = "pdm-2.9.3-py3-none-any.whl", hash = "sha256:0b55fcaa61ed70b9dacd03c4a937f15e908c8c031b621523890de9cdf04325fd"}, + {file = "pdm-2.9.3.tar.gz", hash = "sha256:0b1195b51e9630b5a0b063f27dfcb0120cb6ea284f1a4cd975a3a26f0856d253"}, +] + +[[package]] +name = "platformdirs" +version = "3.11.0" +requires_python = ">=3.7" +summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[[package]] +name = "pluggy" +version = "1.3.0" +requires_python = ">=3.8" +summary = "plugin and hook calling mechanisms for python" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[[package]] +name = "pydantic" +version = "2.4.2" +requires_python = ">=3.7" +summary = "Data validation using Python type hints" +dependencies = [ + "annotated-types>=0.4.0", + "pydantic-core==2.10.1", + "typing-extensions>=4.6.1", +] +files = [ + {file = "pydantic-2.4.2-py3-none-any.whl", hash = "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"}, + {file = "pydantic-2.4.2.tar.gz", hash = "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7"}, +] + +[[package]] +name = "pydantic-core" +version = "2.10.1" +requires_python = ">=3.7" +summary = "" +dependencies = [ + "typing-extensions!=4.7.0,>=4.6.0", +] +files = [ + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c"}, + {file = "pydantic_core-2.10.1-cp312-none-win32.whl", hash = "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f"}, + {file = "pydantic_core-2.10.1-cp312-none-win_amd64.whl", hash = "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430"}, + {file = "pydantic_core-2.10.1-cp312-none-win_arm64.whl", hash = "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776"}, + {file = "pydantic_core-2.10.1.tar.gz", hash = "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82"}, +] + +[[package]] +name = "pygments" +version = "2.16.1" +requires_python = ">=3.7" +summary = "Pygments is a syntax highlighting package written in Python." +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[[package]] +name = "pylint" +version = "3.0.1" +requires_python = ">=3.8.0" +summary = "python code static checker" +dependencies = [ + "astroid<=3.1.0-dev0,>=3.0.0", + "colorama>=0.4.5; sys_platform == \"win32\"", + "dill>=0.3.6; python_version >= \"3.11\"", + "dill>=0.3.7; python_version >= \"3.12\"", + "isort<6,>=4.2.5", + "mccabe<0.8,>=0.6", + "platformdirs>=2.2.0", + "tomlkit>=0.10.1", +] +files = [ + {file = "pylint-3.0.1-py3-none-any.whl", hash = "sha256:9c90b89e2af7809a1697f6f5f93f1d0e518ac566e2ac4d2af881a69c13ad01ea"}, + {file = "pylint-3.0.1.tar.gz", hash = "sha256:81c6125637be216b4652ae50cc42b9f8208dfb725cdc7e04c48f6902f4dbdf40"}, +] + +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +requires_python = ">=3.7" +summary = "Wrappers to call pyproject.toml-based build backend hooks." +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[[package]] +name = "pytest" +version = "7.4.2" +requires_python = ">=3.7" +summary = "pytest: simple powerful testing with Python" +dependencies = [ + "colorama; sys_platform == \"win32\"", + "iniconfig", + "packaging", + "pluggy<2.0,>=0.12", +] +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[[package]] +name = "pytest-click" +version = "1.1.0" +summary = "Pytest plugin for Click" +dependencies = [ + "click>=6.0", + "pytest>=5.0", +] +files = [ + {file = "pytest_click-1.1.0-py3-none-any.whl", hash = "sha256:eade4742c2f02c345e78a32534a43e8db04acf98d415090539dacc880b7cd0e9"}, + {file = "pytest_click-1.1.0.tar.gz", hash = "sha256:fdd9f6721f877dda021e7c5dc73e70aecd37e5ed23ec6820f8a7b3fd7b4f8d30"}, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +requires_python = ">=3.7" +summary = "Pytest plugin for measuring coverage." +dependencies = [ + "coverage[toml]>=5.2.1", + "pytest>=4.6", +] +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[[package]] +name = "pytest-cppython" +version = "0.3.1.dev46" +requires_python = ">=3.11" +summary = "A pytest plugin that imports CPPython testing types" +dependencies = [ + "cppython-core>=0.4.1.dev13", + "pydantic>=2.3", +] +files = [ + {file = "pytest_cppython-0.3.1.dev46-py3-none-any.whl", hash = "sha256:cfe20978f64e68ae80ffdbad3aeca402292c71ecca9d608c869cd16b1ef59d08"}, + {file = "pytest_cppython-0.3.1.dev46.tar.gz", hash = "sha256:88f1f47188fdadf5512ede74363d54cb95be010cd6b3a8002d5197335b9687e0"}, +] + +[[package]] +name = "pytest-mock" +version = "3.11.1" +requires_python = ">=3.7" +summary = "Thin-wrapper around the mock package for easier use with pytest" +dependencies = [ + "pytest>=5.0", +] +files = [ + {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, + {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +dependencies = [ + "six>=1.5", +] +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[[package]] +name = "python-dotenv" +version = "1.0.0" +requires_python = ">=3.8" +summary = "Read key-value pairs from a .env file and set them as environment variables" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +requires_python = ">=3.6" +summary = "YAML parser and emitter for Python" +files = [ + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +requires_python = ">=3.7" +summary = "Python HTTP for Humans." +dependencies = [ + "certifi>=2017.4.17", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1", +] +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "A utility belt for advanced users of python-requests" +dependencies = [ + "requests<3.0.0,>=2.0.1", +] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[[package]] +name = "resolvelib" +version = "1.0.1" +summary = "Resolve abstract dependencies into concrete ones" +files = [ + {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, + {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, +] + +[[package]] +name = "rich" +version = "13.6.0" +requires_python = ">=3.7.0" +summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +dependencies = [ + "markdown-it-py>=2.2.0", + "pygments<3.0.0,>=2.13.0", +] +files = [ + {file = "rich-13.6.0-py3-none-any.whl", hash = "sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"}, + {file = "rich-13.6.0.tar.gz", hash = "sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef"}, +] + +[[package]] +name = "shellingham" +version = "1.5.3" +requires_python = ">=3.7" +summary = "Tool to Detect Surrounding Shell" +files = [ + {file = "shellingham-1.5.3-py2.py3-none-any.whl", hash = "sha256:419c6a164770c9c7cfcaeddfacb3d31ac7a8db0b0f3e9c1287679359734107e9"}, + {file = "shellingham-1.5.3.tar.gz", hash = "sha256:cb4a6fec583535bc6da17b647dd2330cf7ef30239e05d547d99ae3705fd0f7f8"}, +] + +[[package]] +name = "six" +version = "1.16.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +summary = "Python 2 and 3 compatibility utilities" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "synodic-utilities" +version = "0.1.1.dev6" +requires_python = ">=3.11" +summary = "Synodic python utility library" +files = [ + {file = "synodic_utilities-0.1.1.dev6-py3-none-any.whl", hash = "sha256:3811c1b808bb6c9953f15b62f171fcc8d62fe4eba91a09718cfd4c081f9033f2"}, + {file = "synodic_utilities-0.1.1.dev6.tar.gz", hash = "sha256:d5f246c1a064054a2de05a427cc1ba935ff56134aac6c7d3f7d947eb2ed21f5e"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.1" +requires_python = ">=3.7" +summary = "Style preserving TOML library" +files = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] + +[[package]] +name = "truststore" +version = "0.8.0" +requires_python = ">= 3.10" +summary = "Verify certificates using native system trust stores" +files = [ + {file = "truststore-0.8.0-py3-none-any.whl", hash = "sha256:e37a5642ae9fc48caa8f120b6283d77225d600d224965a672c9e8ef49ce4bb4c"}, + {file = "truststore-0.8.0.tar.gz", hash = "sha256:dc70da89634944a579bfeec70a7a4523c53ffdb3cf52d1bb4a431fda278ddb96"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +requires_python = ">=3.8" +summary = "Backported and Experimental Type Hints for Python 3.8+" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "unearth" +version = "0.11.1" +requires_python = ">=3.7" +summary = "A utility to fetch and download python packages" +dependencies = [ + "packaging>=20", + "requests>=2.25", +] +files = [ + {file = "unearth-0.11.1-py3-none-any.whl", hash = "sha256:b136c9938ba1a99c13f1ff880691ba51fdd8509eb12f85e20d66b87356912005"}, + {file = "unearth-0.11.1.tar.gz", hash = "sha256:69b9d4d86173f6fbe8cf685c829c31a60d0c82e1bcd6c5b59af8fd564bf0dc1a"}, +] + +[[package]] +name = "urllib3" +version = "1.26.17" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +summary = "HTTP library with thread-safe connection pooling, file post, and more." +files = [ + {file = "urllib3-1.26.17-py2.py3-none-any.whl", hash = "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b"}, + {file = "urllib3-1.26.17.tar.gz", hash = "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21"}, +] + +[[package]] +name = "virtualenv" +version = "20.24.5" +requires_python = ">=3.7" +summary = "Virtual Python Environment builder" +dependencies = [ + "distlib<1,>=0.3.7", + "filelock<4,>=3.12.2", + "platformdirs<4,>=3.9.1", +] +files = [ + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, +] diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..0321f82 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,26 @@ + +# Create the file sets that will be found in this directory and subdirectories + +target_sources(honesty + PUBLIC + FILE_SET interfaces + TYPE CXX_MODULES + FILES + "honesty.ixx" +) + +target_sources(honesty + PRIVATE + FILE_SET implementations + TYPE CXX_MODULES +) + +target_sources(honesty_main + PUBLIC + FILE_SET interfaces + TYPE CXX_MODULES +) + +add_subdirectory( + honesty +) diff --git a/src/honesty.ixx b/src/honesty.ixx new file mode 100644 index 0000000..6561c3c --- /dev/null +++ b/src/honesty.ixx @@ -0,0 +1,5 @@ +export module synodic.honesty; + +export import synodic.honesty.benchmark; +export import synodic.honesty.profile; +export import synodic.honesty.test; diff --git a/src/honesty/CMakeLists.txt b/src/honesty/CMakeLists.txt new file mode 100644 index 0000000..9f78a75 --- /dev/null +++ b/src/honesty/CMakeLists.txt @@ -0,0 +1,20 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + "benchmark.ixx" + "profile.ixx" + "test.ixx" +) + +add_subdirectory( + benchmark +) + +add_subdirectory( + profile +) + +add_subdirectory( + test +) \ No newline at end of file diff --git a/src/honesty/benchmark.ixx b/src/honesty/benchmark.ixx new file mode 100644 index 0000000..2649a46 --- /dev/null +++ b/src/honesty/benchmark.ixx @@ -0,0 +1 @@ +export module synodic.honesty.benchmark; \ No newline at end of file diff --git a/src/honesty/benchmark/CMakeLists.txt b/src/honesty/benchmark/CMakeLists.txt new file mode 100644 index 0000000..4ac49ea --- /dev/null +++ b/src/honesty/benchmark/CMakeLists.txt @@ -0,0 +1,8 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + PRIVATE + FILE_SET implementations + FILES +) diff --git a/src/honesty/profile.ixx b/src/honesty/profile.ixx new file mode 100644 index 0000000..f73f829 --- /dev/null +++ b/src/honesty/profile.ixx @@ -0,0 +1 @@ +export module synodic.honesty.profile; diff --git a/src/honesty/profile/CMakeLists.txt b/src/honesty/profile/CMakeLists.txt new file mode 100644 index 0000000..4ac49ea --- /dev/null +++ b/src/honesty/profile/CMakeLists.txt @@ -0,0 +1,8 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + PRIVATE + FILE_SET implementations + FILES +) diff --git a/src/honesty/test.ixx b/src/honesty/test.ixx new file mode 100644 index 0000000..dc950fb --- /dev/null +++ b/src/honesty/test.ixx @@ -0,0 +1,10 @@ +export module synodic.honesty.test; + +export import :suite; +export import :entry; +export import :test; +export import :literals; +export import :expression; +export import :generator; +export import synodic.honesty.test.reporter; +export import synodic.honesty.test.logger; diff --git a/src/honesty/test/CMakeLists.txt b/src/honesty/test/CMakeLists.txt new file mode 100644 index 0000000..b2682b8 --- /dev/null +++ b/src/honesty/test/CMakeLists.txt @@ -0,0 +1,42 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + "suite.ixx" + "test.ixx" + "entry.ixx" + "runner.ixx" + "expression.ixx" + "literals.ixx" + "reporter.ixx" + "logger.ixx" + "generator.ixx" + "implementation.ixx" + "test.cpp" + PRIVATE + FILE_SET implementations + FILES + "runner.cpp" + "suite.cpp" + "implementation.cpp" + +) + +target_sources(honesty_main + PUBLIC + FILE_SET interfaces + FILES + "main.cpp" +) + +add_subdirectory( + expression +) + +add_subdirectory( + reporter +) + +add_subdirectory( + logger +) \ No newline at end of file diff --git a/src/honesty/test/entry.ixx b/src/honesty/test/entry.ixx new file mode 100644 index 0000000..607bbc7 --- /dev/null +++ b/src/honesty/test/entry.ixx @@ -0,0 +1,29 @@ + +export module synodic.honesty.test:entry; + +import std; + +import :runner; + +import synodic.honesty.test.logger; +import synodic.honesty.test.reporter; + +export namespace synodic::honesty +{ + enum class TestResultCode + { + FAIL + }; + + template + std::expected entry(Logger& logger, Reporter& reporter) + { + Runner runner; + + runner.Run(); + + //return std::unexpected(TestResultCode::FAIL); + + return {}; + } +} diff --git a/src/honesty/test/expression.ixx b/src/honesty/test/expression.ixx new file mode 100644 index 0000000..abcf2a4 --- /dev/null +++ b/src/honesty/test/expression.ixx @@ -0,0 +1,11 @@ + +export module synodic.honesty.test:expression; + +export namespace synodic::honesty +{ + template + constexpr auto expect(const T& expression) + { + return expression; + } +} diff --git a/src/honesty/test/expression/CMakeLists.txt b/src/honesty/test/expression/CMakeLists.txt new file mode 100644 index 0000000..4ac49ea --- /dev/null +++ b/src/honesty/test/expression/CMakeLists.txt @@ -0,0 +1,8 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + PRIVATE + FILE_SET implementations + FILES +) diff --git a/src/honesty/test/generator.ixx b/src/honesty/test/generator.ixx new file mode 100644 index 0000000..0630ae7 --- /dev/null +++ b/src/honesty/test/generator.ixx @@ -0,0 +1,188 @@ + +export module synodic.honesty.test:generator; + +import std; +import :implementation; + +export namespace synodic::honesty +{ + + class [[nodiscard]] TestGenerator + { + class promise + { + public: + using reference = std::add_lvalue_reference_t; + using pointer = std::add_pointer_t; + + auto get_return_object() noexcept + { + return TestGenerator(std::coroutine_handle::from_promise(*this)); + } + + static std::suspend_always initial_suspend() noexcept + { + return {}; + } + + static std::suspend_always final_suspend() noexcept + { + return {}; + } + + std::suspend_always yield_value(std::remove_reference_t& value) noexcept + { + m_value = std::addressof(value); + return {}; + } + + std::suspend_always yield_value(std::remove_reference_t&& value) noexcept + { + m_value = std::addressof(value); + return {}; + } + + std::suspend_always yield_value(TestGenerator& value) noexcept + { + // m_value = std::addressof(value); + return {}; + } + + reference value() const noexcept + { + return *m_value; + } + + // Don't allow any use of 'co_await' inside the TestGenerator coroutine. + template + std::suspend_never await_transform(U&& value) = delete; + + static void return_void() noexcept + { + } + + static void unhandled_exception() + { + throw; + } + + private: + pointer m_value; + friend TestGenerator; + }; + + struct sentinel + { + }; + + class iterator + { + using coroutine_handle = std::coroutine_handle; + + public: + using iterator_category = std::input_iterator_tag; + using difference_type = std::ptrdiff_t; + using reference = promise::reference; + + iterator() noexcept = default; + iterator(const iterator&) = delete; + + iterator(iterator&& o) noexcept + { + std::swap(m_coroutine, o.m_coroutine); + } + + iterator& operator=(iterator&& o) noexcept + { + std::swap(m_coroutine, o.m_coroutine); + return *this; + } + + explicit iterator(coroutine_handle coroutine) noexcept : + m_coroutine(coroutine) + { + } + + ~iterator() + { + if (m_coroutine) + { + m_coroutine.destroy(); + } + } + + bool operator==(sentinel) const noexcept + { + return !m_coroutine || m_coroutine.done(); + } + + iterator& operator++() + { + m_coroutine.resume(); + return *this; + } + + void operator++(int) + { + (void)operator++(); + } + + reference operator*() const noexcept + { + return m_coroutine.promise().value(); + } + + private: + coroutine_handle m_coroutine = nullptr; + }; + + public: + using promise_type = promise; + + TestGenerator(TestGenerator&& other) noexcept : + m_coroutine(exchange(other.m_coroutine, nullptr)) + { + } + + TestGenerator(const TestGenerator& other) = delete; + + ~TestGenerator() + { + if (m_coroutine) + { + m_coroutine.destroy(); + } + } + + TestGenerator& operator=(TestGenerator&& other) noexcept + { + swap(other); + return *this; + } + + auto begin() + { + m_coroutine.resume(); + return iterator {std::exchange(m_coroutine, nullptr)}; + } + + static auto end() noexcept + { + return sentinel {}; + } + + void swap(TestGenerator& other) noexcept + { + std::swap(m_coroutine, other.m_coroutine); + } + + private: + explicit TestGenerator(std::coroutine_handle coroutine) noexcept : + m_coroutine(coroutine) + { + } + + std::coroutine_handle m_coroutine = nullptr; + }; + +} diff --git a/src/honesty/test/honesty.ixx b/src/honesty/test/honesty.ixx new file mode 100644 index 0000000..5583cb0 --- /dev/null +++ b/src/honesty/test/honesty.ixx @@ -0,0 +1,5 @@ +export module synodic.honesty; + +export import :set; +export import :entry; +export import :test; diff --git a/src/honesty/test/implementation.cpp b/src/honesty/test/implementation.cpp new file mode 100644 index 0000000..664a7e0 --- /dev/null +++ b/src/honesty/test/implementation.cpp @@ -0,0 +1,11 @@ +module synodic.honesty.test:implementation; + +import :implementation; +import std; + +namespace synodic::honesty +{ + BaseTest::BaseTest(std::string_view name) + { + } +} diff --git a/src/honesty/test/implementation.ixx b/src/honesty/test/implementation.ixx new file mode 100644 index 0000000..c8c48a7 --- /dev/null +++ b/src/honesty/test/implementation.ixx @@ -0,0 +1,23 @@ +export module synodic.honesty.test:implementation; + +import std; + +export namespace synodic::honesty +{ + class BaseTest + { + public: + BaseTest() = delete; + virtual ~BaseTest() = default; + + protected: + BaseTest(std::string_view name); + + friend class Runner; + + virtual void Run() = 0; + + std::string_view name_; + }; + +} diff --git a/src/honesty/test/literals.ixx b/src/honesty/test/literals.ixx new file mode 100644 index 0000000..b8d6f18 --- /dev/null +++ b/src/honesty/test/literals.ixx @@ -0,0 +1,23 @@ +export module synodic.honesty.test:literals; + +import :test; +import :suite; +import :generator; + +export namespace synodic::honesty::literals +{ + //[[nodiscard]] consteval TestGenerator operator""_test(const char* const name, const std::size_t size) + //{ + // auto callable = [] + // { + // throw std::invalid_argument("The test must be assigned a function to execute"); + // }; + + // co_yield Test(std::string_view(name, size), callable); + //} + + [[nodiscard]] consteval auto operator""_suite(const char* const name, const std::size_t size) + { + return Suite(std::string_view(name, size)); + } +} diff --git a/src/honesty/test/logger.ixx b/src/honesty/test/logger.ixx new file mode 100644 index 0000000..4eb7204 --- /dev/null +++ b/src/honesty/test/logger.ixx @@ -0,0 +1,9 @@ +export module synodic.honesty.test.logger; + +export import :stdout; + +export namespace synodic::honesty +{ + template + concept is_logger = true; +} \ No newline at end of file diff --git a/src/honesty/test/logger/CMakeLists.txt b/src/honesty/test/logger/CMakeLists.txt new file mode 100644 index 0000000..5d0cff9 --- /dev/null +++ b/src/honesty/test/logger/CMakeLists.txt @@ -0,0 +1,10 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + stdout.ixx + PRIVATE + FILE_SET implementations + FILES + stdout.cpp +) diff --git a/src/honesty/test/logger/stdout.cpp b/src/honesty/test/logger/stdout.cpp new file mode 100644 index 0000000..6004ca3 --- /dev/null +++ b/src/honesty/test/logger/stdout.cpp @@ -0,0 +1 @@ +module synodic.honesty.test.logger:stdout; diff --git a/src/honesty/test/logger/stdout.ixx b/src/honesty/test/logger/stdout.ixx new file mode 100644 index 0000000..98b218d --- /dev/null +++ b/src/honesty/test/logger/stdout.ixx @@ -0,0 +1,9 @@ +export module synodic.honesty.test.logger:stdout; + +export namespace synodic::honesty::logger +{ + class StandardOut + { + + }; +} \ No newline at end of file diff --git a/src/honesty/test/main.cpp b/src/honesty/test/main.cpp new file mode 100644 index 0000000..4584a6a --- /dev/null +++ b/src/honesty/test/main.cpp @@ -0,0 +1,44 @@ +import synodic.honesty.test; + +import std; + +namespace synodic::honesty +{ + enum class Mode + { + EXECUTE + }; +} + +int main(int argc, char* argv[]) +{ + // TODO: Parse inputs + + constexpr synodic::honesty::Mode mode = synodic::honesty::Mode::EXECUTE; + + try + { + switch (mode) + { + case synodic::honesty::Mode::EXECUTE: + { + synodic::honesty::logger::StandardOut logger; + synodic::honesty::reporter::StandardOut reporter; + auto result = synodic::honesty::entry(logger, reporter); + break; + } + default: + { + std::terminate(); + } + } + + return 0; + } + catch (const std::invalid_argument& exception) + { + std::println("Error: {0}", exception.what()); + + return 1; + } +} diff --git a/src/honesty/test/reporter.ixx b/src/honesty/test/reporter.ixx new file mode 100644 index 0000000..a726172 --- /dev/null +++ b/src/honesty/test/reporter.ixx @@ -0,0 +1,9 @@ +export module synodic.honesty.test.reporter; + +export import :stdout; + +export namespace synodic::honesty +{ + template + concept is_reporter = true; +} \ No newline at end of file diff --git a/src/honesty/test/reporter/CMakeLists.txt b/src/honesty/test/reporter/CMakeLists.txt new file mode 100644 index 0000000..5d0cff9 --- /dev/null +++ b/src/honesty/test/reporter/CMakeLists.txt @@ -0,0 +1,10 @@ +target_sources(honesty + PUBLIC + FILE_SET interfaces + FILES + stdout.ixx + PRIVATE + FILE_SET implementations + FILES + stdout.cpp +) diff --git a/src/honesty/test/reporter/stdout.cpp b/src/honesty/test/reporter/stdout.cpp new file mode 100644 index 0000000..b9ec1d5 --- /dev/null +++ b/src/honesty/test/reporter/stdout.cpp @@ -0,0 +1 @@ +module synodic.honesty.test.reporter:stdout; \ No newline at end of file diff --git a/src/honesty/test/reporter/stdout.ixx b/src/honesty/test/reporter/stdout.ixx new file mode 100644 index 0000000..75aba5f --- /dev/null +++ b/src/honesty/test/reporter/stdout.ixx @@ -0,0 +1,9 @@ +export module synodic.honesty.test.reporter:stdout; + +export namespace synodic::honesty::reporter +{ + class StandardOut + { + + }; +} \ No newline at end of file diff --git a/src/honesty/test/runner.cpp b/src/honesty/test/runner.cpp new file mode 100644 index 0000000..6473343 --- /dev/null +++ b/src/honesty/test/runner.cpp @@ -0,0 +1,36 @@ +module synodic.honesty.test:runner; +import :runner; +import std; + +namespace synodic::honesty +{ + //Runner::Suite::Suite(honesty::Suite&& other) noexcept : + // honesty::Suite(std::move(other)) + //{ + //} + + //TestGenerator Runner::Suite::Generate() const + //{ + // return generator_(); + //} + + void Runner::Run() + { + //const auto& suites = Suites(); + //for (const Suite& suite: suites) + //{ + // auto generator = suite.Generate(); + // for (auto& test: generator) + // { + // test.Run(); + // } + //} + } + + //std::vector& Runner::Suites() + //{ + // //static std::vector suites; + + // return suites; + //} +} diff --git a/src/honesty/test/runner.ixx b/src/honesty/test/runner.ixx new file mode 100644 index 0000000..0d814a7 --- /dev/null +++ b/src/honesty/test/runner.ixx @@ -0,0 +1,15 @@ + +export module synodic.honesty.test:runner; +import std; +import :suite; +import :test; + +export namespace synodic::honesty +{ + class Runner + { + public: + + void Run(); + }; +} diff --git a/src/honesty/test/suite.cpp b/src/honesty/test/suite.cpp new file mode 100644 index 0000000..051640b --- /dev/null +++ b/src/honesty/test/suite.cpp @@ -0,0 +1,10 @@ +module synodic.honesty.test:suite; + +import std; + +import :suite; +import :runner; + +namespace synodic::honesty +{ +} diff --git a/src/honesty/test/suite.ixx b/src/honesty/test/suite.ixx new file mode 100644 index 0000000..6b1a1f4 --- /dev/null +++ b/src/honesty/test/suite.ixx @@ -0,0 +1,47 @@ +export module synodic.honesty.test:suite; + +import std; + +import :generator; +import :test; + +export namespace synodic::honesty +{ + class Suite + { + public: + consteval Suite(std::string_view name); + + template + consteval Suite(std::string_view name, Fn&& generator); + + Suite(const Suite& other) = delete; + Suite(Suite&& other) noexcept = default; + + Suite& operator=(const Suite& other) = delete; + Suite& operator=(Suite&& other) noexcept = default; + + template + consteval Suite& operator=(Fn&& generator) noexcept; + + protected: + std::string_view name_; + }; + + consteval Suite::Suite(std::string_view name) : + name_(name) + { + } + + template + consteval Suite::Suite(std::string_view name, Fn&& generator) : + name_(name) + { + } + + template + consteval Suite& Suite::operator=(Fn&& generator) noexcept + { + return *this; + } +} diff --git a/src/honesty/test/test.cpp b/src/honesty/test/test.cpp new file mode 100644 index 0000000..abf10ab --- /dev/null +++ b/src/honesty/test/test.cpp @@ -0,0 +1,22 @@ +module synodic.honesty.test:test; + +import :test; + +namespace synodic::honesty +{ + Test::Test(std::string_view name, std::move_only_function runner): + BaseTest(name), + runner_(std::move(runner)) + { + } + + Test& Test::operator=(std::move_only_function runner) + { + runner_ = std::move(runner); + return *this; + } + + void Test::Run() + { + } +} diff --git a/src/honesty/test/test.ixx b/src/honesty/test/test.ixx new file mode 100644 index 0000000..7b1a15c --- /dev/null +++ b/src/honesty/test/test.ixx @@ -0,0 +1,93 @@ + +export module synodic.honesty.test:test; + +import std; +import :generator; +import :implementation; + +namespace synodic::honesty +{ + + class TestStub + { + }; + +} + +export namespace synodic::honesty +{ + + template + class Test final : public BaseTest + { + public: + Test(std::string_view name, std::move_only_function runner); + + Test& operator=(std::move_only_function runner); + + protected: + void Run() override; + + std::move_only_function runner_; + }; + + template<> + class Test final : public BaseTest + { + public: + Test(std::string_view name, std::move_only_function runner); + + Test& operator=(std::move_only_function generator); + + protected: + void Run() override; + + private: + std::move_only_function runner_; + }; + + template + Test::Test(std::string_view name, std::move_only_function runner) : + BaseTest(name), + runner_(std::move(runner)) + { + } + + template + Test& Test::operator=(std::move_only_function runner) + { + runner_ = std::move(runner); + return *this; + } + + template + void Test::Run() + { + } + + // Template Deductions + + Test(std::string_view, std::move_only_function) -> Test; + + template + Test(std::string_view, std::move_only_function) -> Test; + + // Operators + + template Fn> + [[nodiscard]] constexpr TestGenerator operator|(const Fn&& test, const std::ranges::range auto& range) + { + for (const auto& value: range) + { + co_yield Test("", test); + } + } + + template + requires(std::invocable && ...) + [[nodiscard]] constexpr TestGenerator operator|(const Fn&& test, std::tuple&& tuple) + { + co_yield Test("", test); + } + +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e298d44..41a93ec 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,12 +1,10 @@ cmake_minimum_required(VERSION 3.28 FATAL_ERROR) project(tests - DESCRIPTION "Test project for Synodic Template Library" + DESCRIPTION "Tests for the honesty project" LANGUAGES CXX ) -find_package(GTest REQUIRED) - add_executable(tests) set_target_properties(tests @@ -19,13 +17,23 @@ set_target_properties(tests target_link_libraries(tests PRIVATE - ${CMAKE_PROJECT_NAME} - GTest::gtest_main + synodic::honesty::main ) add_subdirectory( - "unit" + unit ) -include(GoogleTest) -gtest_discover_tests(tests) \ No newline at end of file +# Glob all files to add a source group tree +file(GLOB_RECURSE file_list ${CMAKE_CURRENT_SOURCE_DIR}/*) + +# Must be called from the target definition directory. Only matched against target source files (No nested CMakeList.txt, docs, etc). +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${file_list}) + +# Make the 'tests' project the default startup +set_property( + DIRECTORY + ${CMAKE_CURRENT_SOURCE_DIR} + PROPERTY + VS_STARTUP_PROJECT tests +) \ No newline at end of file diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 0325772..1385772 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -1,15 +1,10 @@ -add_subdirectory( - container +target_sources(tests +PRIVATE + test_expect.cpp + test_generator.cpp + test_suite.cpp + test_test.cpp + test_entry.cpp ) -add_subdirectory( - functional -) - -add_subdirectory( - structure -) - -add_subdirectory( - types -) +add_test(NAME tests COMMAND tests) diff --git a/tests/unit/test_entry.cpp b/tests/unit/test_entry.cpp new file mode 100644 index 0000000..b3cd38e --- /dev/null +++ b/tests/unit/test_entry.cpp @@ -0,0 +1,2 @@ +import std; +import synodic.honesty.test; diff --git a/tests/unit/test_expect.cpp b/tests/unit/test_expect.cpp new file mode 100644 index 0000000..402d3bd --- /dev/null +++ b/tests/unit/test_expect.cpp @@ -0,0 +1,4 @@ +import synodic.honesty.test; + +static_assert(synodic::honesty::expect(true)); +static_assert(not synodic::honesty::expect(false)); diff --git a/tests/unit/test_generator.cpp b/tests/unit/test_generator.cpp new file mode 100644 index 0000000..4d3670d --- /dev/null +++ b/tests/unit/test_generator.cpp @@ -0,0 +1,4 @@ +import std; +import synodic.honesty.test; + +using namespace synodic::honesty; diff --git a/tests/unit/test_suite.cpp b/tests/unit/test_suite.cpp new file mode 100644 index 0000000..c112d10 --- /dev/null +++ b/tests/unit/test_suite.cpp @@ -0,0 +1,55 @@ +import std; +import synodic.honesty.test; + +using namespace synodic::honesty; +using namespace synodic::honesty::literals; + +auto innerSuiteGenerator = []() -> TestGenerator +{ + co_return; +}; + +auto suiteGenerator = []() -> TestGenerator +{ + // Tests that creation via literal works + "inner"_suite = []() -> TestGenerator + { + // int count = 0; + // co_yield Test( + // "test", + // [&count] + // { + // ++count; + // }); + + // co_yield "yes"_test = [&count]() + //{ + // ++count; + // }; + + // co_yield "array"_test = [&count](const auto& parameter) + //{ + // ++count; + // } | std::tuple {3u, 4.0f}; + + // co_yield "array"_test = [&count](const T& parameter) + //{ + // ++count; + // } | std::array {3, 4}; + + co_return; + }; + + // Tests that nested suite via static creation work + constexpr Suite suite("inner", innerSuiteGenerator); + // co_yield suite; + + co_return; +}; + +// Static creation +Suite suite("outer", suiteGenerator); +auto suite2 = Suite("outer", suiteGenerator); + +// NOTE: Nested suites in generators is a requirement to enable parameterization and lambda capture. +// Therefore, since the lambda is required to be a coroutine, nested suites can't be consteval diff --git a/tests/unit/test_test.cpp b/tests/unit/test_test.cpp new file mode 100644 index 0000000..b19291c --- /dev/null +++ b/tests/unit/test_test.cpp @@ -0,0 +1,33 @@ +// These tests are not executed, so they exist to test the compilation of tests + +import std; +import synodic.honesty.test; + +using namespace synodic::honesty; +using namespace synodic::honesty::literals; + +//auto defaultTest = Test( +// "default", +// [] +// { +// }); +// +//auto callable = [] +//{ +//}; +// +//auto referenceTest = Test("reference", callable); +// +//auto helperScope = [] +//{ +// "literal"_test = [] +// { +// }; +// +// for (auto i: std::vector{1, 2, 3}) +// { +// "parameterized"_test = [i] +// { +// }; +// } +//}; diff --git a/tests/unit/types/CMakeLists.txt b/tests/unit/types/CMakeLists.txt deleted file mode 100644 index e23af53..0000000 --- a/tests/unit/types/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -target_sources(tests -PRIVATE - test_concepts.cpp - test_type_traits.cpp - test_utility.cpp -) \ No newline at end of file diff --git a/tests/unit/types/test_main.cpp b/tests/unit/types/test_main.cpp deleted file mode 100644 index dbbb8eb..0000000 --- a/tests/unit/types/test_main.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Verifies that the container concepts work for all standard containers - -#include - -import synodic.library.type.concepts; -import std; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Types -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -using Array = std::array; -using Deque = std::deque; -using ForwardList = std::forward_list; -using List = std::list; -using Map = std::map; -using MultiMap = std::multimap; -using Set = std::set; -using MultiSet = std::multiset; -using String = std::basic_string; -using UnorderedMap = std::unordered_map; -using UnorderedMultiMap = std::unordered_multimap; -using UnorderedSet = std::unordered_set; -using UnorderedMultiSet = std::unordered_multiset; -using Vector = std::vector; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Tests -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -TEST(container, clearable) -{ - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - static_assert(synodic::clearable_container); - - static_assert(not synodic::clearable_container); -} \ No newline at end of file diff --git a/tool/cmake/presets/platform.json b/tool/cmake/presets/platform.json index 1324ea9..7a603d1 100644 --- a/tool/cmake/presets/platform.json +++ b/tool/cmake/presets/platform.json @@ -6,18 +6,7 @@ "hidden": true, "description": "Base preset for configurations", "generator": "Ninja Multi-Config", - "binaryDir": "${sourceDir}/build/${presetName}", - "installDir": "${sourceDir}/install/${presetName}", - "cacheVariables": { - "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": { - "type": "FILEPATH", - "value": "${sourceDir}/tool/conan/conan_provider.cmake" - }, - "CMAKE_CONFIGURATION_TYPES": { - "type": "STRING", - "value": "Debug;Release" - } - } + "binaryDir": "${sourceDir}/build/${presetName}" }, { "name": "windows-default", @@ -94,13 +83,8 @@ ], "testPresets": [ { - "name": "windows-default", + "name": "default", "hidden": true, - "condition": { - "type": "equals", - "lhs": "${hostSystemName}", - "rhs": "Windows" - }, "output": { "outputOnFailure": true, "shortProgress": true @@ -110,6 +94,18 @@ "stopOnFailure": true } }, + { + "name": "windows-default", + "hidden": true, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + }, + "inherits": [ + "default" + ] + }, { "name": "macos-default", "hidden": true, @@ -117,15 +113,9 @@ "outputOnFailure": true, "shortProgress": true }, - "execution": { - "noTestsAction": "error", - "stopOnFailure": true - }, - "condition": { - "type": "equals", - "lhs": "${hostSystemName}", - "rhs": "Darwin" - } + "inherits": [ + "default" + ] }, { "name": "linux-default", @@ -134,15 +124,9 @@ "outputOnFailure": true, "shortProgress": true }, - "execution": { - "noTestsAction": "error", - "stopOnFailure": true - }, - "condition": { - "type": "equals", - "lhs": "${hostSystemName}", - "rhs": "Linux" - } + "inherits": [ + "default" + ] } ] } \ No newline at end of file diff --git a/tool/cmake/presets/windows.json b/tool/cmake/presets/windows.json index d37bcb2..08e6fb0 100644 --- a/tool/cmake/presets/windows.json +++ b/tool/cmake/presets/windows.json @@ -74,5 +74,13 @@ } ], "testPresets": [ + { + "name": "windows-msbuild-msvc-test", + "displayName": "Test", + "configurePreset": "windows-msbuild-msvc", + "inherits": [ + "windows-default" + ] + } ] } \ No newline at end of file