From eca78d08be2f9d6e3ddee7103a7447825cf1890c Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Tue, 26 Sep 2023 19:59:39 +0200 Subject: [PATCH 1/7] UART initialization: Red --- TODO.md | 7 ++++++- lib/RoboCaddie/src/RoboCaddie.cpp | 2 ++ lib/RoboCaddie/src/RoboCaddie.h | 1 + lib/RoboCaddie/src/UART.h | 1 + test/Test_RoboCaddie.cpp | 14 ++++++++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index b190e56..aa64e43 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,12 @@ - ~~RoboCaddie sends a STOP message to the motor when it is stopped~~ - ~~RoboCaddie transmits a message to the motor every 30ms~~ - ~~Arduino Nano 33 BLE support~~ - - Go to metal: Integration tests + - Go to metal: + - Main loop + - Arduino UART implementation + - UART baud rate initialization + - Arduino TimeService implementation + - Consecutive messages should increase CI (Continuity counter) and CS (CheckSum) values - RoboCaddie goes forward when it receives a forward command - RoboCaddie goes backward when it receives a backward command - RoboCaddie goes left when it receives a left command diff --git a/lib/RoboCaddie/src/RoboCaddie.cpp b/lib/RoboCaddie/src/RoboCaddie.cpp index 3592145..85e2436 100644 --- a/lib/RoboCaddie/src/RoboCaddie.cpp +++ b/lib/RoboCaddie/src/RoboCaddie.cpp @@ -9,6 +9,8 @@ RoboCaddie::~RoboCaddie() {} int RoboCaddie::getStatus() { return STOP; } +void RoboCaddie::init() {} + void RoboCaddie::transmission() { std::vector stopMsg = {0x04, 0x01, 0x0A, 0x57, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90}; diff --git a/lib/RoboCaddie/src/RoboCaddie.h b/lib/RoboCaddie/src/RoboCaddie.h index a7c4c4f..66161ba 100644 --- a/lib/RoboCaddie/src/RoboCaddie.h +++ b/lib/RoboCaddie/src/RoboCaddie.h @@ -16,6 +16,7 @@ class RoboCaddie { RoboCaddie(RoboCaddieUART::UART &, TimeService &); ~RoboCaddie(); int getStatus(); + void init(); void transmission(); void run(); }; diff --git a/lib/RoboCaddie/src/UART.h b/lib/RoboCaddie/src/UART.h index dd60e85..6adcab2 100644 --- a/lib/RoboCaddie/src/UART.h +++ b/lib/RoboCaddie/src/UART.h @@ -35,6 +35,7 @@ class SpyUART : public RoboCaddieUART::UART { std::vector getLastSentMessage() { return lastSentMessage; } uint8_t getNumbersOfExecutions() { return numberOfExecutions; } + uint64_t getBaudRate() { return 0; } }; #endif \ No newline at end of file diff --git a/test/Test_RoboCaddie.cpp b/test/Test_RoboCaddie.cpp index 4a780b3..956bb89 100644 --- a/test/Test_RoboCaddie.cpp +++ b/test/Test_RoboCaddie.cpp @@ -101,6 +101,18 @@ void test_robocaddie_sends_a_transmission_every_30_ms() { TEST_ASSERT_EQUAL_UINT64(2, uart.getNumbersOfExecutions()); } +void test_uart_baud_rate_should_be_115200() { + SpyUART uart; + FakeTimeService time; + RoboCaddie robocaddie(uart, time); + + TEST_ASSERT_EQUAL_UINT64(0, uart.getBaudRate()); + + robocaddie.init(); + + TEST_ASSERT_EQUAL_UINT64(115200, uart.getBaudRate()); +} + #ifndef ARDUINO_ARCH_MBED int main(int argc, char **argv) { @@ -110,6 +122,7 @@ int main(int argc, char **argv) { RUN_TEST( test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP); RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms); + RUN_TEST(test_uart_baud_rate_should_be_115200); UNITY_END(); } @@ -127,6 +140,7 @@ void setup() { RUN_TEST( test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP); RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms); + RUN_TEST(test_uart_baud_rate_should_be_115200); UNITY_END(); } From e98c82e7716f646d2a1176a13fa80847d747a2bc Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Tue, 26 Sep 2023 20:04:22 +0200 Subject: [PATCH 2/7] UART initialization: Green --- lib/RoboCaddie/src/RoboCaddie.cpp | 2 +- lib/RoboCaddie/src/UART.h | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/RoboCaddie/src/RoboCaddie.cpp b/lib/RoboCaddie/src/RoboCaddie.cpp index 85e2436..c2e4616 100644 --- a/lib/RoboCaddie/src/RoboCaddie.cpp +++ b/lib/RoboCaddie/src/RoboCaddie.cpp @@ -9,7 +9,7 @@ RoboCaddie::~RoboCaddie() {} int RoboCaddie::getStatus() { return STOP; } -void RoboCaddie::init() {} +void RoboCaddie::init() { uart.init(); } void RoboCaddie::transmission() { std::vector stopMsg = {0x04, 0x01, 0x0A, 0x57, 0x0E, 0x00, 0x00, diff --git a/lib/RoboCaddie/src/UART.h b/lib/RoboCaddie/src/UART.h index 6adcab2..765ef5f 100644 --- a/lib/RoboCaddie/src/UART.h +++ b/lib/RoboCaddie/src/UART.h @@ -10,6 +10,7 @@ class UART { public: UART() {} ~UART() {} + virtual void init(void) = 0; virtual int transmit(const uint8_t *message, int length) = 0; }; @@ -19,6 +20,7 @@ class SpyUART : public RoboCaddieUART::UART { private: std::vector lastSentMessage; uint64_t numberOfExecutions = 0; + uint64_t baudRate = 0; const int MAX_UART_MESSAGE_LENGTH = 258; public: @@ -27,6 +29,8 @@ class SpyUART : public RoboCaddieUART::UART { lastSentMessage = {}; } + void init() { baudRate = 115200; } + int transmit(const uint8_t *message, int length) { lastSentMessage.assign(message, message + length); numberOfExecutions = numberOfExecutions + 1; @@ -35,7 +39,7 @@ class SpyUART : public RoboCaddieUART::UART { std::vector getLastSentMessage() { return lastSentMessage; } uint8_t getNumbersOfExecutions() { return numberOfExecutions; } - uint64_t getBaudRate() { return 0; } + uint64_t getBaudRate() { return baudRate; } }; #endif \ No newline at end of file From 592a362f30a954291b410d85fa1714897c2df375 Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Tue, 26 Sep 2023 20:42:06 +0200 Subject: [PATCH 3/7] Refactor PlarformIO environments --- platformio.ini | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/platformio.ini b/platformio.ini index e9d1da3..d804883 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,13 +20,8 @@ framework = arduino test_framework = custom [env:nano33ble-renode] -platform = nordicnrf52@9.5.0 -board = nano33ble -framework = arduino +extends = env:nano33ble build_flags = -DRENODE_ENVIRONMENT -; Use arduino framework Unity version instead of Platformio default version -; https://docs.platformio.org/en/stable/advanced/unit-testing/frameworks/custom/examples/custom_unity_library.html -test_framework = custom platform_packages = platformio/tool-renode test_testing_command = From 3691d1307d0a544db69f874780ebe561912a8bab Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Tue, 26 Sep 2023 20:52:59 +0200 Subject: [PATCH 4/7] Tests refactored --- platformio.ini | 2 + .../RoboCaddieTests.h} | 66 +++++-------------- test/test_runner_embedded/Test_Embedded.cpp | 23 +++++++ .../test_custom_runner.py | 0 test/test_runner_native/Test_Native.cpp | 10 +++ 5 files changed, 51 insertions(+), 50 deletions(-) rename test/{Test_RoboCaddie.cpp => RoboCaddie/RoboCaddieTests.h} (80%) create mode 100644 test/test_runner_embedded/Test_Embedded.cpp rename test/{ => test_runner_embedded}/test_custom_runner.py (100%) create mode 100644 test/test_runner_native/Test_Native.cpp diff --git a/platformio.ini b/platformio.ini index d804883..0c14be4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,6 +10,7 @@ [env:native] platform = native +test_ignore = test_runner_embedded [env:nano33ble] platform = nordicnrf52@9.5.0 @@ -18,6 +19,7 @@ framework = arduino ; Use arduino framework Unity version instead of Platformio default version ; https://docs.platformio.org/en/stable/advanced/unit-testing/frameworks/custom/examples/custom_unity_library.html test_framework = custom +test_ignore = test_runner_native [env:nano33ble-renode] extends = env:nano33ble diff --git a/test/Test_RoboCaddie.cpp b/test/RoboCaddie/RoboCaddieTests.h similarity index 80% rename from test/Test_RoboCaddie.cpp rename to test/RoboCaddie/RoboCaddieTests.h index 956bb89..9028fe9 100644 --- a/test/Test_RoboCaddie.cpp +++ b/test/RoboCaddie/RoboCaddieTests.h @@ -1,19 +1,21 @@ #ifdef UNIT_TEST -#ifdef ARDUINO_ARCH_MBED -#include -#endif -#include -#include -#include - -// Fix arduino/ArduinoCore-mbed issue: -// https://github.com/platformio/platformio-core/issues/3980#issuecomment-1500895461 -#ifdef ARDUINO_ARCH_MBED -#ifndef RENODE_ENVIRONMENT -REDIRECT_STDOUT_TO(Serial); -#endif -#endif +void test_robocaddie_is_stopped_on_startup(); +void test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP(); +void test_robocaddie_sends_a_transmission_every_30_ms(); +void test_uart_baud_rate_should_be_115200(); + +int run_tests() { + UNITY_BEGIN(); + + RUN_TEST(test_robocaddie_is_stopped_on_startup); + RUN_TEST( + test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP); + RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms); + RUN_TEST(test_uart_baud_rate_should_be_115200); + + return UNITY_END(); +} void test_robocaddie_is_stopped_on_startup() { SpyUART uart; @@ -113,40 +115,4 @@ void test_uart_baud_rate_should_be_115200() { TEST_ASSERT_EQUAL_UINT64(115200, uart.getBaudRate()); } -#ifndef ARDUINO_ARCH_MBED - -int main(int argc, char **argv) { - UNITY_BEGIN(); - - RUN_TEST(test_robocaddie_is_stopped_on_startup); - RUN_TEST( - test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP); - RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms); - RUN_TEST(test_uart_baud_rate_should_be_115200); - - UNITY_END(); -} - -#endif - -#ifdef ARDUINO_ARCH_MBED - -void setup() { - delay(2000); - - UNITY_BEGIN(); - - RUN_TEST(test_robocaddie_is_stopped_on_startup); - RUN_TEST( - test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP); - RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms); - RUN_TEST(test_uart_baud_rate_should_be_115200); - - UNITY_END(); -} - -void loop() { delay(1000); } - -#endif - #endif diff --git a/test/test_runner_embedded/Test_Embedded.cpp b/test/test_runner_embedded/Test_Embedded.cpp new file mode 100644 index 0000000..856e351 --- /dev/null +++ b/test/test_runner_embedded/Test_Embedded.cpp @@ -0,0 +1,23 @@ +#ifdef UNIT_TEST + +#include +#include +#include + +#include "RoboCaddie/RoboCaddieTests.h" + +// Fix arduino/ArduinoCore-mbed issue: +// https://github.com/platformio/platformio-core/issues/3980#issuecomment-1500895461 +#ifndef RENODE_ENVIRONMENT +REDIRECT_STDOUT_TO(Serial); +#endif + +void setup() { + delay(2000); + + run_tests(); +} + +void loop() { delay(1000); } + +#endif diff --git a/test/test_custom_runner.py b/test/test_runner_embedded/test_custom_runner.py similarity index 100% rename from test/test_custom_runner.py rename to test/test_runner_embedded/test_custom_runner.py diff --git a/test/test_runner_native/Test_Native.cpp b/test/test_runner_native/Test_Native.cpp new file mode 100644 index 0000000..17ac6ef --- /dev/null +++ b/test/test_runner_native/Test_Native.cpp @@ -0,0 +1,10 @@ +#ifdef UNIT_TEST + +#include +#include + +#include "RoboCaddie/RoboCaddieTests.h" + +int main() { return run_tests(); } + +#endif From 562c07aa977894ede3ee058cd2a3ad1fc383e221 Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Tue, 26 Sep 2023 23:57:05 +0200 Subject: [PATCH 5/7] Update pre-commit hook --- .pre-commit-config.yaml | 3 ++- TODO.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0e05f76..f5ee0e5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,9 @@ +repos: - repo: local hooks: - id: pio-test name: pio-test - entry: pio test -e native + entry: pio test -e native -e nano33ble-renode --without-uploading pass_filenames: false language: system stages: [push] diff --git a/TODO.md b/TODO.md index aa64e43..768b5ce 100644 --- a/TODO.md +++ b/TODO.md @@ -7,7 +7,7 @@ - Go to metal: - Main loop - Arduino UART implementation - - UART baud rate initialization + - ~~UART baud rate initialization~~ - Arduino TimeService implementation - Consecutive messages should increase CI (Continuity counter) and CS (CheckSum) values - RoboCaddie goes forward when it receives a forward command From 4fe76b9d64e8985642fbddcdc54a0074270a9199 Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Wed, 27 Sep 2023 00:13:40 +0200 Subject: [PATCH 6/7] Remove unnecessary ci on pull requests --- .github/workflows/ci-arduino-nano-33-ble.yml | 2 +- .github/workflows/ci-native.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-arduino-nano-33-ble.yml b/.github/workflows/ci-arduino-nano-33-ble.yml index 69d59b4..1067227 100644 --- a/.github/workflows/ci-arduino-nano-33-ble.yml +++ b/.github/workflows/ci-arduino-nano-33-ble.yml @@ -1,6 +1,6 @@ name: CI-Arduino-Nano-33-BLE -on: [push, pull_request] +on: [push] jobs: test: diff --git a/.github/workflows/ci-native.yml b/.github/workflows/ci-native.yml index 6cac22a..3211975 100644 --- a/.github/workflows/ci-native.yml +++ b/.github/workflows/ci-native.yml @@ -1,6 +1,6 @@ name: CI-native -on: [push, pull_request] +on: [push] jobs: test: From 84bb57528014bc252e690f302b50cacd281814c2 Mon Sep 17 00:00:00 2001 From: minayaserrano Date: Wed, 27 Sep 2023 09:51:29 +0200 Subject: [PATCH 7/7] pre-commit package upgraded --- .pre-commit-config.yaml | 4 +- Pipfile | 12 ++++ Pipfile.lock | 140 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f5ee0e5..d0d23c3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,5 @@ +default_install_hook_types: [pre-push] +default_stages: [pre-push] repos: - repo: local hooks: @@ -6,4 +8,4 @@ repos: entry: pio test -e native -e nano33ble-renode --without-uploading pass_filenames: false language: system - stages: [push] + stages: [pre-push] diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..d501d91 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +pre-commit = "*" + +[requires] +python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..18cd726 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,140 @@ +{ + "_meta": { + "hash": { + "sha256": "3b3b722904e22c3e5b8b6c0d82d5801d5616aaf40e92f61e163d1355bfb54180" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": { + "cfgv": { + "hashes": [ + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" + ], + "markers": "python_version >= '3.8'", + "version": "==3.4.0" + }, + "distlib": { + "hashes": [ + "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", + "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" + ], + "version": "==0.3.7" + }, + "filelock": { + "hashes": [ + "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4", + "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd" + ], + "markers": "python_version >= '3.8'", + "version": "==3.12.4" + }, + "identify": { + "hashes": [ + "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b", + "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5" + ], + "markers": "python_version >= '3.8'", + "version": "==2.5.29" + }, + "nodeenv": { + "hashes": [ + "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", + "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.8.0" + }, + "platformdirs": { + "hashes": [ + "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", + "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" + ], + "markers": "python_version >= '3.7'", + "version": "==3.10.0" + }, + "pre-commit": { + "hashes": [ + "sha256:6bbd5129a64cad4c0dfaeeb12cd8f7ea7e15b77028d985341478c8af3c759522", + "sha256:96d529a951f8b677f730a7212442027e8ba53f9b04d217c4c67dc56c393ad945" + ], + "index": "pypi", + "version": "==3.4.0" + }, + "pyyaml": { + "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0.1" + }, + "virtualenv": { + "hashes": [ + "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b", + "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752" + ], + "markers": "python_version >= '3.7'", + "version": "==20.24.5" + } + } +}