diff --git a/.github/PULL_REQUEST_TEMPLATES.md b/.github/PULL_REQUEST_TEMPLATES.md new file mode 100644 index 0000000..6a24e22 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATES.md @@ -0,0 +1,25 @@ +# Tipo do Merge Request + +- [ ] 🛠️ Bugfix +- [ ] ✨ Feature +- [ ] ✅ Build or CI +- [ ] 🧹 Code Refactor or Style +- [ ] 📝 Documentation +- [ ] 🗑️ Others + +## Describe current behavior + +Briefly describe the behavior of the application + +### What were the behavior changes? + +List the changes presented in this MR, with images if possible + +### Does this MR have any breaking changes? + +- [ ] ✅ Yes +- [ ] ❌ No + +### Other information + +Talk a little more about what is being done in this MR diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..39bd9ac --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,7 @@ +version: 2 +enable-beta-ecosystems: true +updates: + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..8ff631b --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,62 @@ +name: Rubik Utils CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + if: ${{ always() }} + + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2.10.0 + + - name: Set up timezone + run: sudo ln -snf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo America/Sao_Paulo | sudo tee /etc/timezone + + - name: Setup coverage + run: sudo apt-get update -qq -y && sudo apt-get install -y lcov + + - name: Run Test + run: flutter test --coverage test/rubik_utils_test.dart + + - name: Coverage + run: | + lcov --list coverage/lcov.info + lcov -r coverage/lcov.info '*/__test*__/*' -o coverage/lcov_cleaned.info + genhtml coverage/lcov_cleaned.info --output=coverage + + publish: + needs: test + name: Publish + runs-on: ubuntu-latest + + if: github.ref == 'refs/heads/main' + + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2.10.0 + + - run: echo "flutter pub publish -h" + + analyze: + name: Analyze + runs-on: ubuntu-latest + + if: ${{ always() }} + + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2.10.0 + + - name: Run Analyze + run: flutter analyze + continue-on-error: true + + \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..23eefa0 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,47 @@ +image: ghcr.io/cirruslabs/flutter:latest + +stages: + - test + - analyze + - deploy + +Test: + stage: test + before_script: + - DEBIAN_FRONTEND=noninteractive apt-get update + - DEBIAN_FRONTEND=noninteractive apt-get install tzdata + - ln -fs /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime + script: + - flutter clean && flutter pub get + - TZ="America/Bahia" && flutter test --coverage test/rubik_utils_test.dart + - lcov -r coverage/lcov.info '*/__test*__/*' -o coverage/lcov_cleaned.info + - genhtml coverage/lcov_cleaned.info --output=coverage + coverage: '/lines\.*:\s*(\d+.\d+)%/' + artifacts: + paths: + - coverage + +Analyze: + stage: analyze + script: + - flutter analyze + allow_failure: true + +SonarQube: + stage: deploy + variables: + GIT_DEPTH: "0" + GIT_STRATEGY: clone + needs: + - Test + script: + - | + curl -O https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip + unzip sonar-scanner-cli-4.8.0.2856-linux.zip + sonar-scanner-4.8.0.2856-linux/bin/sonar-scanner \ + -Dsonar.projectKey=$CI_PROJECT_PATH_SLUG \ + -Dsonar.qualitygate.wait=true \ + -Dsonar.host.url=https://sonarqube.cubos.io \ + -Dsonar.sources=lib + allow_failure: true + diff --git a/.gitlab/merge_request_templates/Merge Request.md b/.gitlab/merge_request_templates/Merge Request.md new file mode 100644 index 0000000..3cf28e4 --- /dev/null +++ b/.gitlab/merge_request_templates/Merge Request.md @@ -0,0 +1,31 @@ +[//]: # (NÃO ALTERE o formato do bloco abaixo. Utilizamos um parser para coletar o tipo do merge request, link do clickup e o numero de story points) + +### Tipo do Merge Request + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style (Formatação, mudança de nome de variáveis) +- [ ] Refactoring (Sem mudanças funcionais na aplicação) +- [ ] Mudanças de Build ou CI +- [ ] Mudanças na documentação +- [ ] Outro (por favor descreva): + +* Link do ClickUp: N/A +* Story points: N/A + +### Descreva o comportamento atual + +Faça uma breve descrição do comportamento da aplicação + +### Quais foram as mudanças de comportamento? + +Liste as alterações presentes neste MR, com imagens se possível + +### Esse MR tem alguma breaking change? + +- [ ] Sim +- [ ] Não + +### Outras informações + +Fale um pouco mais sobre o que está sendo feito neste MR diff --git a/.metadata b/.metadata deleted file mode 100644 index 0229312..0000000 --- a/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: c07f7888888435fd9df505aa2efc38d3cf65681b - channel: stable - -project_type: package diff --git a/INSTALLING.md b/INSTALLING.md index 4f85c42..ce13f97 100644 --- a/INSTALLING.md +++ b/INSTALLING.md @@ -2,39 +2,39 @@ 1. Depend on it - Add this to your package's pubspec.yaml file: + Add this to your package's pubspec.yaml file: - ```flutter - dependencies: - rubik_utils: ^0.0.2 - ``` + ```flutter + dependencies: + rubik_utils: ^1.0.2 + ``` 2. Install it - You can install packages from the command line: - with Flutter: + You can install packages from the command line: + with Flutter: - ```bash - flutter pub get - ``` + ```bash + flutter pub get + ``` - Alternatively, your editor might support flutter pub get. Check the docs for your editor to - learn more. + Alternatively, your editor might support flutter pub get. Check the docs for your editor to + learn more. 3. Import it - Now in your Dart code, you can use: + Now in your Dart code, you can use: - ```flutter - import 'package:rubik_utils/rubik_utils.dart'; + ```flutter + import 'package:rubik_utils/rubik_utils.dart'; - void main(){ - print('hello'.isNull); // Hello world! - print('rubik'.isInstanceOf()); // false - print('hello word!'.capitalize()); // Hello world! + void main(){ + print('hello'.isNull); // Hello world! + print('rubik'.isInstanceOf()); // false + print('hello word!'.capitalize()); // Hello world! - final schema = RubikValidationsBuilder.strings().minLength(3).maxLength(10); - print(schema.validate('rubik')); // null + final schema = RubikValidationsBuilder.strings().minLength(3).maxLength(10); + print(schema.validate('rubik')); // null - print(RString().minLength(3).maxLength(10).validate('rubik')) // null - } - ``` + print(RString().minLength(3).maxLength(10).validate('rubik')) // null + } + ``` diff --git a/LICENSE b/LICENSE index 4c655cb..ba75c69 100644 --- a/LICENSE +++ b/LICENSE @@ -1,28 +1 @@ -BSD 3-Clause License - -Copyright (c) 2023, Cubos Tecnologia - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +TODO: Add your license here. diff --git a/analysis_options.yaml b/analysis_options.yaml index d61e715..9ee94b6 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,32 +1,33 @@ -include: package:flutter_lints/flutter.yaml +include: package:lints/recommended.yaml analyzer: - plugins: - - dart_code_metrics + exclude: + - test/** -dart_code_metrics: - metrics: - cyclomatic-complexity: 20 - number-of-parameters: 4 - maximum-nesting-level: 5 - metrics-exclude: - - test/** +linter: rules: - - avoid-dynamic - - avoid-redundant-async - - avoid-passing-async-when-sync-expected - - avoid-redundant-async - - avoid-unnecessary-type-assertions - - avoid-unnecessary-type-casts - - avoid-unrelated-type-assertions - - avoid-unused-parameters - - avoid-nested-conditional-expressions - - newline-before-return - - no-boolean-literal-compare - - no-empty-block - - prefer-trailing-comma - - prefer-conditional-expressions - - no-equal-then-else - - prefer-moving-to-variable - - prefer-declaring-const-constructor: - allow-one: true \ No newline at end of file + - close_sinks + - avoid_print + - avoid_unnecessary_containers + - avoid_web_libraries_in_flutter + - comment_references + - no_logic_in_create_state + - prefer_const_constructors + - prefer_const_constructors_in_immutables + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - sized_box_for_whitespace + - sort_child_properties_last + - use_build_context_synchronously + - use_full_hex_values_for_flutter_colors + - use_key_in_widget_constructors + - use_super_parameters + - prefer_single_quotes + - always_declare_return_types + - cancel_subscriptions + - combinators_ordering + - comment_references + - dangling_library_doc_comments + - collection_methods_unrelated_type + - invalid_case_patterns + - implicit_call_tearoffs: true diff --git a/coverage/lcov.info b/coverage/lcov.info index cc64c79..fead905 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,989 +1,959 @@ SF:lib/src/components/horizontal_spacing.dart -DA:16,1 -DA:18,1 -DA:20,2 +DA:16,3 +DA:18,3 +DA:20,6 LF:3 LH:3 end_of_record SF:lib/src/components/vertical_spacing.dart -DA:16,1 -DA:18,1 -DA:20,2 +DA:16,3 +DA:18,3 +DA:20,6 LF:3 LH:3 end_of_record +SF:lib/src/constants/rubik_regexps.dart +DA:2,39 +DA:3,9 +DA:5,9 +DA:6,9 +DA:9,9 +DA:11,15 +DA:12,15 +DA:13,9 +DA:14,9 +DA:15,9 +DA:18,9 +DA:20,15 +DA:21,15 +DA:22,9 +DA:25,21 +DA:29,12 +DA:30,12 +DA:31,24 +DA:32,24 +DA:36,9 +LF:20 +LH:20 +end_of_record SF:lib/src/constants/rubik_strings.dart -DA:36,1 -DA:37,1 -DA:38,1 -DA:73,1 -DA:105,2 -DA:120,1 -DA:121,1 -DA:122,1 -DA:172,1 -DA:224,2 -DA:238,1 -DA:239,1 -DA:240,1 -DA:262,1 -DA:286,1 -DA:290,2 -DA:305,2 +DA:36,5 +DA:37,5 +DA:38,5 +DA:73,5 +DA:105,10 +DA:120,3 +DA:121,3 +DA:122,3 +DA:172,3 +DA:224,6 +DA:238,3 +DA:239,3 +DA:240,3 +DA:262,3 +DA:286,3 +DA:290,8 +DA:305,8 LF:17 LH:17 end_of_record -SF:lib/src/extensions/duration_extensions.dart -DA:19,1 -DA:20,4 -DA:30,1 -DA:32,3 -DA:34,2 -DA:45,1 -DA:47,3 -DA:49,2 -DA:60,1 -DA:62,3 -DA:64,2 -DA:74,3 -DA:83,3 -DA:92,3 -DA:101,1 -DA:107,1 -DA:108,1 -DA:118,3 -DA:127,3 +SF:lib/src/extensions/context_extensions.dart +DA:9,6 +DA:12,9 +DA:15,9 +DA:18,6 +DA:23,9 +DA:26,12 +DA:29,12 +DA:32,9 +DA:35,3 +DA:36,12 +DA:39,9 +DA:45,3 +DA:51,3 +DA:52,3 +DA:53,3 +DA:54,3 +DA:55,3 +DA:62,6 +DA:65,6 +DA:70,0 +DA:73,0 +DA:78,9 +DA:81,6 +DA:84,6 +DA:89,0 +DA:92,0 +DA:93,0 +DA:96,0 +DA:99,0 +DA:100,0 +DA:102,0 +DA:107,0 +DA:108,0 +DA:110,0 +DA:118,6 +DA:119,3 +DA:120,3 +LF:37 +LH:25 +end_of_record +SF:lib/src/extensions/datetime_extensions.dart +DA:18,9 +DA:27,9 +DA:36,9 +DA:45,15 +DA:54,15 +DA:63,15 +DA:72,15 +DA:81,15 +DA:90,18 +DA:99,12 +DA:108,9 +DA:117,3 +DA:118,6 +DA:128,3 DA:136,3 -DA:145,1 -DA:151,1 -DA:152,1 -DA:162,4 -DA:173,4 -DA:184,4 -DA:194,1 -DA:199,2 -DA:200,1 -DA:201,2 -DA:204,1 -DA:205,1 -DA:207,2 -DA:218,1 -DA:223,2 -DA:225,1 -DA:226,2 -DA:229,1 -DA:230,1 -DA:232,1 -DA:234,1 -DA:246,1 -DA:251,2 -DA:253,1 -DA:254,2 -DA:257,1 -DA:258,1 -DA:260,1 -DA:262,1 -DA:274,1 -DA:279,2 -DA:281,1 -DA:282,2 -DA:285,1 -DA:286,1 -DA:288,1 -DA:290,1 -DA:302,1 -DA:308,1 -DA:310,1 -DA:312,3 -DA:313,2 -DA:320,3 -DA:321,2 -DA:328,3 -DA:329,2 -DA:336,3 -DA:337,2 -DA:344,2 -DA:364,1 -DA:365,1 -DA:367,1 -DA:368,1 -DA:369,1 -DA:370,1 -DA:371,1 +DA:137,3 +DA:138,3 +DA:139,3 +DA:149,18 +DA:158,12 +DA:167,9 +DA:177,3 +DA:178,6 +DA:188,3 +DA:196,3 +DA:197,3 +DA:198,3 +DA:199,3 +DA:211,3 +DA:212,21 +DA:214,21 +DA:228,3 +DA:232,3 +DA:233,3 +DA:234,3 +DA:235,3 +DA:236,3 +DA:241,15 +DA:243,3 +DA:245,3 +DA:246,3 +DA:259,3 +DA:264,3 +DA:266,6 +DA:277,3 +DA:282,3 +DA:284,6 +DA:296,3 +DA:301,9 +DA:302,6 +DA:304,3 +DA:306,6 +DA:317,3 +DA:321,9 +DA:322,6 +DA:324,6 +DA:335,3 +DA:339,3 +DA:340,12 +DA:343,3 +DA:345,3 +DA:348,9 +DA:349,3 +DA:351,3 +DA:364,3 +DA:370,6 +DA:373,6 +DA:387,3 +DA:388,9 +DA:389,9 +DA:390,9 +DA:391,9 +DA:392,9 +DA:393,9 +DA:394,9 +DA:412,9 +DA:421,12 +DA:430,12 +DA:439,12 +DA:448,6 +DA:458,3 +DA:459,3 +DA:475,6 +DA:476,6 +DA:477,6 +DA:478,6 +DA:479,6 +DA:480,6 +DA:481,6 +DA:482,6 +LF:90 +LH:90 +end_of_record +SF:lib/src/extensions/duration_extensions.dart +DA:19,3 +DA:20,12 +DA:30,3 +DA:32,9 +DA:34,6 +DA:45,3 +DA:47,9 +DA:49,6 +DA:60,3 +DA:62,9 +DA:64,6 +DA:74,9 +DA:83,9 +DA:92,9 +DA:101,3 +DA:107,3 +DA:108,3 +DA:118,9 +DA:127,9 +DA:136,9 +DA:145,3 +DA:151,3 +DA:152,3 +DA:162,12 +DA:173,12 +DA:184,12 +DA:194,3 +DA:199,6 +DA:200,3 +DA:201,6 +DA:204,3 +DA:205,3 +DA:207,6 +DA:218,3 +DA:223,6 +DA:225,3 +DA:226,6 +DA:229,3 +DA:230,3 +DA:232,3 +DA:234,3 +DA:246,3 +DA:251,6 +DA:253,3 +DA:254,6 +DA:257,3 +DA:258,3 +DA:260,3 +DA:262,3 +DA:274,3 +DA:279,6 +DA:281,3 +DA:282,6 +DA:285,3 +DA:286,3 +DA:288,3 +DA:290,3 +DA:302,3 +DA:308,3 +DA:310,3 +DA:312,9 +DA:313,6 +DA:320,9 +DA:321,6 +DA:328,9 +DA:329,6 +DA:336,9 +DA:337,6 +DA:344,6 +DA:365,6 +DA:366,6 +DA:368,6 +DA:369,6 +DA:370,6 +DA:371,6 +DA:372,6 LF:76 LH:76 end_of_record SF:lib/src/extensions/list_extensions.dart -DA:26,3 -DA:35,1 -DA:36,1 -DA:38,2 -DA:60,1 -DA:61,1 -DA:63,2 -DA:64,1 -DA:65,1 -DA:67,4 -DA:80,5 -DA:89,2 -DA:100,1 -DA:103,2 -DA:105,1 -DA:106,1 -DA:107,2 -DA:108,2 -DA:109,2 -DA:112,4 -DA:127,1 -DA:128,2 -DA:130,1 -DA:131,1 -DA:132,2 -DA:133,2 -DA:134,2 -DA:137,4 -DA:149,1 -DA:150,2 -DA:152,1 -DA:153,1 -DA:154,2 -DA:155,2 -DA:156,2 -DA:157,2 -DA:160,4 -DA:172,1 -DA:173,2 -DA:175,1 -DA:176,1 -DA:177,2 -DA:178,2 -DA:179,2 -DA:180,2 -DA:183,4 -DA:195,1 -DA:196,1 -DA:198,1 -DA:199,5 -DA:200,5 -DA:201,5 -DA:202,1 -DA:203,5 -DA:204,1 -DA:205,5 -DA:208,3 -DA:222,1 -DA:223,1 -DA:225,1 -DA:226,1 -DA:227,2 -DA:229,2 -DA:230,3 -DA:242,1 -DA:243,1 -DA:245,1 -DA:247,3 -DA:248,1 -DA:249,2 -DA:251,3 -DA:265,1 -DA:266,1 -DA:268,1 -DA:270,3 -DA:271,1 -DA:272,2 -DA:274,2 -DA:288,1 -DA:289,1 -DA:290,1 -DA:292,2 -DA:293,3 -DA:307,3 -DA:319,5 -DA:328,1 -DA:329,1 -DA:331,2 -DA:332,1 -DA:334,1 -DA:335,1 -DA:336,1 -DA:350,1 +DA:26,9 +DA:35,3 +DA:36,3 +DA:38,6 +DA:60,3 +DA:61,3 +DA:63,6 +DA:64,3 +DA:65,3 +DA:67,12 +DA:80,15 +DA:89,6 +DA:100,3 +DA:103,6 +DA:105,3 +DA:106,3 +DA:107,6 +DA:108,6 +DA:109,6 +DA:112,12 +DA:127,3 +DA:128,6 +DA:130,3 +DA:131,3 +DA:132,6 +DA:133,6 +DA:134,6 +DA:137,12 +DA:149,3 +DA:150,6 +DA:152,3 +DA:153,3 +DA:154,6 +DA:155,6 +DA:156,6 +DA:157,6 +DA:160,12 +DA:172,3 +DA:173,6 +DA:175,3 +DA:176,3 +DA:177,6 +DA:178,6 +DA:179,6 +DA:180,6 +DA:183,12 +DA:195,3 +DA:196,3 +DA:198,3 +DA:199,15 +DA:200,15 +DA:201,15 +DA:202,3 +DA:203,15 +DA:204,3 +DA:205,15 +DA:208,9 +DA:223,3 +DA:224,3 +DA:226,3 +DA:227,3 +DA:228,6 +DA:230,6 +DA:231,9 +DA:243,3 +DA:244,3 +DA:246,3 +DA:248,9 +DA:249,3 +DA:250,6 +DA:252,9 +DA:266,3 +DA:267,3 +DA:269,3 +DA:271,9 +DA:272,3 +DA:273,6 +DA:275,6 +DA:289,3 +DA:290,3 +DA:291,3 +DA:293,6 +DA:294,9 +DA:308,9 +DA:320,15 +DA:329,3 +DA:330,3 +DA:332,6 +DA:333,3 +DA:335,3 +DA:336,3 +DA:337,3 DA:351,3 -DA:352,2 +DA:352,9 +DA:353,6 LF:95 LH:95 end_of_record -SF:lib/src/extensions/object_extensions.dart -DA:14,1 -DA:26,2 -DA:38,2 -DA:50,1 -DA:51,1 -DA:53,2 -DA:55,1 -DA:56,2 -DA:57,3 -DA:58,3 -DA:59,3 -DA:60,3 +SF:lib/src/extensions/number_extensions.dart +DA:24,6 +DA:33,6 +DA:42,15 +DA:52,6 DA:61,3 -DA:64,2 -DA:65,2 -DA:66,2 -DA:69,1 -DA:82,1 -DA:83,1 -DA:97,1 +DA:62,6 +DA:72,5 +DA:78,5 +DA:82,5 +DA:86,15 DA:98,3 -DA:103,1 -DA:104,2 -DA:119,1 -DA:120,1 -DA:122,1 -DA:123,3 -DA:124,3 -DA:125,3 -DA:126,3 -DA:127,4 -DA:130,1 -DA:131,2 -DA:132,1 -DA:133,2 -DA:134,1 -DA:135,2 -DA:138,3 -DA:151,3 -DA:160,1 -DA:161,1 -DA:162,1 -DA:163,2 -DA:165,2 +DA:102,3 +DA:103,3 +DA:104,3 +DA:106,9 +DA:116,3 +DA:119,6 +DA:129,9 +DA:139,3 +DA:140,6 +DA:153,5 +DA:154,5 +DA:156,6 +DA:157,6 +DA:161,10 +DA:162,6 +DA:173,3 +DA:174,6 +DA:185,10 +DA:194,9 +DA:203,9 +DA:212,3 +DA:213,3 +DA:215,6 +DA:216,3 +DA:217,6 +DA:227,7 +DA:228,14 +DA:238,3 +DA:239,6 +DA:249,6 +DA:259,6 +DA:263,6 +DA:265,6 +DA:266,6 +DA:267,6 +DA:268,6 +DA:269,6 +DA:270,6 +DA:271,6 +DA:274,6 +DA:284,3 +DA:285,6 +DA:295,6 +DA:304,9 +DA:313,6 +DA:322,12 +DA:331,6 +DA:340,15 +DA:349,6 +DA:358,18 +DA:367,6 +DA:376,21 +DA:385,6 +DA:394,12 +LF:65 +LH:65 +end_of_record +SF:lib/src/extensions/object_extensions.dart +DA:14,13 +DA:26,20 +DA:38,12 +DA:50,3 +DA:51,3 +DA:53,6 +DA:55,3 +DA:56,6 +DA:57,9 +DA:58,9 +DA:59,9 +DA:60,9 +DA:61,9 +DA:64,6 +DA:65,6 +DA:66,6 +DA:69,3 +DA:82,3 +DA:83,3 +DA:97,3 +DA:98,9 +DA:103,3 +DA:104,6 +DA:119,3 +DA:120,3 +DA:122,3 +DA:123,9 +DA:124,9 +DA:125,9 +DA:126,9 +DA:127,12 +DA:130,3 +DA:131,6 +DA:132,3 +DA:133,6 +DA:134,3 +DA:135,6 +DA:138,9 +DA:151,9 +DA:160,3 +DA:161,3 +DA:162,3 +DA:163,6 +DA:165,6 LF:44 LH:44 end_of_record SF:lib/src/extensions/string_extensions.dart -DA:22,1 -DA:24,2 -DA:25,2 -DA:35,1 -DA:37,2 -DA:38,2 -DA:47,2 -DA:55,2 -DA:63,2 -DA:71,2 -DA:81,1 -DA:82,2 -DA:83,2 -DA:86,3 -DA:89,1 -DA:97,1 -DA:98,6 -DA:100,1 -DA:108,1 -DA:109,1 -DA:111,1 -DA:112,2 -DA:114,4 -DA:122,1 -DA:123,1 +DA:22,3 +DA:24,6 +DA:25,6 +DA:35,13 +DA:37,26 +DA:38,6 +DA:47,6 +DA:55,6 +DA:63,6 +DA:71,6 +DA:81,8 +DA:82,16 +DA:83,16 +DA:86,9 +DA:89,8 +DA:98,3 +DA:99,18 +DA:101,3 +DA:110,3 +DA:111,3 +DA:113,3 +DA:114,6 +DA:116,12 DA:125,3 -DA:133,1 -DA:134,1 -DA:136,1 -DA:137,2 -DA:139,2 -DA:148,1 -DA:149,1 -DA:151,3 -DA:153,2 -DA:161,1 -DA:162,1 -DA:164,1 -DA:165,2 -DA:166,5 -DA:169,1 -DA:179,3 -DA:188,3 -DA:197,3 -DA:206,3 -DA:215,1 -DA:216,2 -DA:225,1 -DA:226,1 -DA:227,1 -DA:229,3 -DA:230,3 -DA:233,1 -DA:244,1 -DA:245,2 -DA:248,1 -DA:249,2 -DA:250,2 -DA:251,2 -DA:252,2 -DA:253,2 -DA:263,2 -DA:271,2 -DA:280,1 -DA:282,2 -DA:283,3 -DA:293,1 -DA:295,2 -DA:296,3 -DA:306,1 -DA:307,2 -DA:315,3 -DA:324,4 -DA:332,3 -DA:340,3 -DA:349,1 -DA:352,2 -DA:353,2 -DA:372,1 -DA:373,1 -DA:374,1 -DA:376,3 -DA:377,4 -DA:379,2 -DA:380,4 -DA:383,1 -DA:392,2 -DA:400,1 -DA:401,2 -DA:403,2 -DA:412,4 -DA:420,3 -DA:429,3 -DA:438,3 -DA:449,1 -DA:450,2 -DA:452,2 -DA:465,1 -DA:466,1 -DA:468,1 -DA:469,1 -DA:471,2 -DA:473,1 -DA:474,4 -DA:475,4 -DA:476,5 -DA:477,5 -DA:480,2 -DA:481,1 -DA:483,2 -DA:484,2 -DA:485,2 -DA:486,2 -DA:488,1 -DA:491,2 -DA:507,1 -DA:511,1 -DA:513,1 -DA:515,1 -DA:516,4 -DA:519,1 -DA:520,4 +DA:126,3 +DA:128,9 +DA:137,3 +DA:138,3 +DA:140,3 +DA:141,6 +DA:143,6 +DA:152,3 +DA:153,3 +DA:155,9 +DA:157,6 +DA:166,3 +DA:167,3 +DA:169,3 +DA:170,6 +DA:171,15 +DA:174,3 +DA:184,9 +DA:193,9 +DA:202,9 +DA:211,9 +DA:220,3 +DA:221,6 +DA:230,7 +DA:231,7 +DA:232,7 +DA:234,21 +DA:235,15 +DA:238,7 +DA:249,7 +DA:250,14 +DA:253,7 +DA:254,14 +DA:255,14 +DA:256,14 +DA:257,14 +DA:258,14 +DA:268,14 +DA:276,10 +DA:285,7 +DA:287,6 +DA:288,21 +DA:298,7 +DA:300,6 +DA:301,21 +DA:311,3 +DA:312,6 +DA:320,18 +DA:329,16 +DA:337,9 +DA:345,9 +DA:354,3 +DA:357,6 +DA:358,6 +DA:377,9 +DA:378,9 +DA:379,9 +DA:381,21 +DA:382,30 +DA:384,18 +DA:385,12 +DA:388,9 +DA:397,18 +DA:405,6 +DA:406,11 +DA:408,10 +DA:417,12 +DA:425,9 +DA:434,24 +DA:443,24 +DA:454,5 +DA:455,10 +DA:457,10 +DA:470,3 +DA:471,3 +DA:473,3 +DA:474,3 +DA:476,6 +DA:478,3 +DA:479,12 +DA:480,12 +DA:481,15 +DA:482,15 +DA:485,6 +DA:486,3 +DA:488,6 +DA:489,6 +DA:490,6 +DA:491,6 +DA:493,3 +DA:496,6 +DA:512,3 +DA:516,3 +DA:518,3 +DA:520,3 +DA:521,12 +DA:524,3 +DA:525,12 LF:122 LH:122 end_of_record -SF:lib/src/types/rubik_duration_types.dart -DA:17,1 -DA:18,1 -DA:27,1 -DA:37,2 -DA:40,2 -DA:43,2 -DA:46,2 -DA:49,2 -DA:52,2 -LF:9 -LH:9 -end_of_record -SF:lib/src/types/rubik_number_types.dart -DA:22,1 -DA:23,3 -LF:2 -LH:2 -end_of_record -SF:lib/src/validations/types/rubik_validator_type.dart -DA:56,1 -DA:58,1 -DA:59,2 -DA:81,1 -DA:83,1 -DA:84,2 -DA:137,1 -DA:138,3 -DA:163,1 -DA:164,3 -DA:183,1 -DA:184,2 -DA:186,2 -DA:187,1 -DA:188,2 -DA:189,1 -DA:190,3 -DA:210,1 -DA:211,3 -DA:231,1 -DA:232,2 -DA:233,2 -DA:235,1 -DA:255,1 -DA:256,2 -DA:257,1 -DA:258,1 -DA:262,1 -DA:284,1 -DA:287,2 -DA:288,1 -DA:289,1 -DA:295,2 -DA:296,1 -DA:301,2 -DA:317,3 -LF:36 -LH:36 -end_of_record -SF:lib/src/constants/rubik_regexps.dart -DA:2,3 -DA:3,3 -DA:5,3 -DA:6,3 -DA:9,3 -DA:11,3 -DA:12,3 -DA:13,3 -DA:14,3 -DA:15,3 -DA:18,3 -DA:20,3 -DA:21,3 -DA:22,3 -DA:25,3 -DA:29,3 -DA:30,3 -DA:31,3 -DA:32,3 -DA:36,3 -LF:20 -LH:20 -end_of_record -SF:lib/src/extensions/context_extensions.dart -DA:7,2 -DA:10,3 -DA:13,3 -DA:16,2 -DA:21,3 +SF:lib/src/formatter/inputs/rubik_cnpj_input_formatter.dart DA:24,4 DA:27,4 -DA:30,3 -DA:33,1 -DA:34,4 -DA:37,3 -DA:43,1 -DA:49,1 -DA:50,1 -DA:51,1 -DA:52,1 -DA:53,1 -DA:60,2 -DA:63,2 -DA:68,0 -DA:71,0 -DA:76,3 -DA:79,2 -DA:82,2 -DA:88,2 -DA:89,1 -DA:90,1 -LF:27 -LH:25 -end_of_record -SF:lib/src/extensions/datetime_extensions.dart -DA:18,3 -DA:27,3 -DA:36,3 -DA:45,3 -DA:54,3 +DA:30,4 +DA:31,4 +DA:33,12 +DA:34,8 +DA:37,4 +DA:42,4 +DA:44,12 +DA:45,8 +DA:47,4 +DA:49,8 +DA:53,3 +DA:54,12 +DA:56,3 +DA:58,6 +DA:62,3 DA:63,3 -DA:72,5 -DA:81,5 -DA:90,6 -DA:99,4 -DA:108,3 -DA:117,1 -DA:118,2 -DA:128,1 -DA:136,1 -DA:137,1 -DA:138,1 -DA:139,1 -DA:149,6 -DA:158,4 -DA:167,3 -DA:177,1 -DA:178,2 -DA:188,1 -DA:196,1 -DA:197,1 -DA:198,1 -DA:199,1 -DA:211,1 -DA:212,7 -DA:214,7 -DA:228,1 -DA:232,1 -DA:233,1 -DA:234,1 -DA:235,1 -DA:236,1 -DA:241,5 -DA:243,1 -DA:245,1 -DA:246,1 -DA:259,1 -DA:264,1 -DA:266,2 -DA:277,1 -DA:282,1 -DA:284,2 -DA:296,1 -DA:301,3 -DA:302,2 -DA:304,1 -DA:306,2 -DA:317,1 -DA:321,3 -DA:322,2 -DA:324,2 -DA:335,1 -DA:339,1 -DA:340,4 -DA:343,1 -DA:345,1 -DA:348,3 -DA:349,1 -DA:351,1 -DA:364,1 -DA:370,2 -DA:373,2 -DA:387,1 -DA:388,3 -DA:389,3 -DA:390,3 -DA:391,3 -DA:392,3 -DA:393,3 -DA:394,3 -DA:412,3 -DA:421,4 -DA:430,4 -DA:439,4 -DA:448,2 -DA:458,1 -DA:459,1 -DA:475,1 -DA:476,1 -DA:477,1 -DA:478,1 -DA:479,1 -DA:480,1 -DA:481,1 -DA:482,1 -LF:90 -LH:90 -end_of_record -SF:lib/src/extensions/number_extensions.dart -DA:24,2 -DA:33,2 -DA:42,3 -DA:52,2 -DA:61,1 -DA:62,2 -DA:72,1 -DA:78,1 -DA:82,1 -DA:86,3 -DA:98,1 -DA:102,1 -DA:103,1 -DA:104,1 -DA:106,3 -DA:116,1 -DA:119,2 -DA:129,3 -DA:139,1 -DA:140,2 -DA:153,1 -DA:154,1 -DA:156,2 -DA:157,2 -DA:161,2 -DA:162,2 -DA:173,1 -DA:174,2 -DA:185,2 -DA:194,3 -DA:203,3 -DA:212,1 -DA:213,1 -DA:215,2 -DA:216,1 -DA:217,2 -DA:227,1 -DA:228,2 -DA:238,1 -DA:239,2 -DA:249,2 -DA:259,1 -DA:263,1 -DA:265,1 -DA:266,1 -DA:267,1 -DA:268,1 -DA:269,1 -DA:270,1 -DA:271,1 -DA:274,1 -DA:284,1 -DA:285,2 -DA:295,2 -DA:304,3 -DA:313,2 -DA:322,4 -DA:331,2 -DA:340,5 -DA:349,2 -DA:358,6 -DA:367,2 -DA:376,7 -DA:385,2 -DA:394,3 -LF:65 -LH:65 -end_of_record -SF:lib/src/formatter/inputs/rubik_cnpj_input_formatter.dart -DA:24,1 -DA:27,1 -DA:30,1 -DA:31,1 -DA:33,3 -DA:34,2 -DA:37,1 -DA:42,1 -DA:44,3 -DA:45,2 -DA:47,1 -DA:49,2 -DA:53,1 -DA:54,4 -DA:56,1 -DA:58,2 -DA:62,1 -DA:63,1 -DA:64,1 -DA:66,2 -DA:68,2 -DA:70,2 -DA:72,1 -DA:74,1 -DA:84,2 -DA:93,4 +DA:64,3 +DA:66,6 +DA:68,6 +DA:70,6 +DA:72,3 +DA:74,3 +DA:84,8 +DA:93,12 LF:26 LH:26 end_of_record SF:lib/src/formatter/rubik_formatter_base.dart -DA:27,1 -DA:44,1 -DA:45,2 -DA:46,3 -DA:48,1 -DA:50,2 -DA:65,1 -DA:66,1 -DA:68,3 -DA:70,1 -DA:72,2 -DA:83,4 -DA:94,3 -DA:103,1 -DA:104,2 -DA:118,1 -DA:119,2 -DA:131,1 -DA:132,4 -DA:146,1 -DA:147,3 +DA:27,6 +DA:44,3 +DA:45,6 +DA:46,9 +DA:48,3 +DA:50,6 +DA:65,3 +DA:66,3 +DA:68,9 +DA:70,3 +DA:72,6 +DA:83,16 +DA:94,21 +DA:103,6 +DA:104,12 +DA:118,6 +DA:119,12 +DA:131,6 +DA:132,24 +DA:146,6 +DA:147,18 LF:21 LH:21 end_of_record SF:lib/src/formatter/inputs/rubik_cpf_cnpj_input_formatter.dart -DA:21,1 -DA:26,2 -DA:27,3 -DA:28,4 -DA:31,1 -DA:44,2 +DA:21,3 +DA:26,6 +DA:27,9 +DA:28,12 +DA:31,3 +DA:44,6 LF:6 LH:6 end_of_record SF:lib/src/formatter/inputs/rubik_cpf_input_formatter.dart -DA:24,1 -DA:27,1 -DA:30,1 -DA:31,1 -DA:33,3 -DA:34,2 -DA:37,1 -DA:42,1 -DA:44,3 -DA:45,2 -DA:47,1 -DA:49,2 -DA:53,1 -DA:54,4 -DA:56,1 -DA:58,2 -DA:62,1 -DA:63,1 -DA:64,2 -DA:66,2 -DA:68,2 -DA:70,1 -DA:72,1 -DA:82,2 -DA:91,4 +DA:24,4 +DA:27,4 +DA:30,4 +DA:31,4 +DA:33,12 +DA:34,8 +DA:37,4 +DA:42,4 +DA:44,12 +DA:45,8 +DA:47,4 +DA:49,8 +DA:53,4 +DA:54,14 +DA:56,4 +DA:58,8 +DA:62,4 +DA:63,4 +DA:64,7 +DA:66,6 +DA:68,6 +DA:70,3 +DA:72,3 +DA:82,8 +DA:91,12 LF:25 LH:25 end_of_record SF:lib/src/formatter/inputs/rubik_money_input_formatter.dart -DA:39,1 -DA:56,1 -DA:72,1 -DA:80,1 -DA:85,1 -DA:86,2 -DA:88,2 -DA:89,1 -DA:90,1 -DA:91,1 -DA:94,2 -DA:96,2 -DA:109,1 -DA:110,1 -DA:111,1 -DA:113,4 -DA:115,1 -DA:127,1 -DA:128,4 -DA:147,1 -DA:152,1 -DA:154,2 +DA:39,3 +DA:56,3 +DA:72,3 +DA:80,3 +DA:85,3 +DA:86,6 +DA:88,6 +DA:89,3 +DA:90,3 +DA:91,3 +DA:94,6 +DA:96,6 +DA:109,3 +DA:110,3 +DA:111,3 +DA:113,12 +DA:115,3 +DA:127,3 +DA:128,12 +DA:147,3 +DA:152,3 +DA:154,6 LF:22 LH:22 end_of_record SF:lib/src/types/rubik_datetime_types.dart -DA:25,2 -DA:28,2 -DA:31,2 -DA:34,2 -DA:37,3 -DA:47,1 -DA:53,1 -DA:54,1 -DA:55,1 -DA:56,1 -DA:57,1 -DA:60,1 -DA:106,3 -DA:109,3 -DA:119,1 -DA:120,2 -DA:121,1 -DA:122,1 -DA:123,1 -DA:124,1 -DA:126,1 -DA:128,1 -DA:136,2 +DA:25,10 +DA:28,10 +DA:31,6 +DA:34,6 +DA:37,15 +DA:47,5 +DA:53,5 +DA:54,5 +DA:55,5 +DA:56,5 +DA:57,5 +DA:60,5 +DA:106,15 +DA:109,9 +DA:119,5 +DA:120,10 +DA:121,5 +DA:122,5 +DA:123,5 +DA:124,5 +DA:126,5 +DA:128,5 +DA:136,10 LF:23 LH:23 end_of_record +SF:lib/src/types/rubik_duration_types.dart +DA:17,3 +DA:18,3 +DA:27,3 +DA:37,6 +DA:40,6 +DA:43,6 +DA:46,6 +DA:49,6 +DA:52,6 +LF:9 +LH:9 +end_of_record SF:lib/src/types/rubik_list_types.dart -DA:59,3 -DA:70,2 -DA:79,3 -DA:81,1 -DA:82,2 -DA:94,2 -DA:96,1 -DA:97,2 -DA:112,1 -DA:113,4 -DA:119,2 -DA:124,1 -DA:125,2 -DA:135,1 -DA:136,5 -DA:140,1 -DA:142,1 -DA:143,2 -DA:157,1 -DA:158,4 -DA:162,2 -DA:164,1 -DA:165,2 -DA:180,1 -DA:182,5 -DA:187,1 -DA:189,1 -DA:190,2 -DA:200,1 -DA:201,4 -DA:205,2 -DA:207,1 -DA:208,2 -DA:222,1 -DA:223,4 -DA:227,1 -DA:229,1 -DA:230,2 -DA:240,1 -DA:241,4 -DA:245,1 -DA:247,1 -DA:248,2 -DA:258,1 -DA:259,4 -DA:263,1 -DA:265,1 -DA:266,2 -DA:280,1 -DA:281,4 -DA:285,1 -DA:287,1 -DA:288,2 -DA:302,1 -DA:303,4 -DA:307,1 -DA:309,1 -DA:310,2 -DA:320,1 -DA:321,4 -DA:325,1 -DA:327,1 -DA:328,2 -DA:338,1 -DA:339,4 -DA:343,1 -DA:345,1 -DA:346,2 -DA:360,1 -DA:361,5 -DA:365,1 -DA:367,1 -DA:368,2 -DA:382,1 -DA:384,5 +DA:59,13 +DA:70,6 +DA:79,9 +DA:81,5 +DA:82,10 +DA:94,6 +DA:96,3 +DA:97,6 +DA:112,5 +DA:113,20 +DA:119,6 +DA:124,3 +DA:125,6 +DA:135,5 +DA:136,25 +DA:140,5 +DA:142,3 +DA:143,6 +DA:157,5 +DA:158,20 +DA:162,8 +DA:164,5 +DA:165,10 +DA:180,5 +DA:182,23 +DA:187,3 +DA:189,3 +DA:190,6 +DA:200,3 +DA:201,12 +DA:205,6 +DA:207,3 +DA:208,6 +DA:222,5 +DA:223,20 +DA:227,3 +DA:229,3 +DA:230,6 +DA:240,3 +DA:241,12 +DA:245,3 +DA:247,3 +DA:248,6 +DA:258,3 +DA:259,12 +DA:263,3 +DA:265,3 +DA:266,6 +DA:280,3 +DA:281,12 +DA:285,3 +DA:287,3 +DA:288,6 +DA:302,3 +DA:303,12 +DA:307,3 +DA:309,3 +DA:310,6 +DA:320,3 +DA:321,12 +DA:325,3 +DA:327,3 +DA:328,6 +DA:338,3 +DA:339,12 +DA:343,3 +DA:345,3 +DA:346,6 +DA:360,3 +DA:361,15 +DA:365,3 +DA:367,3 +DA:368,6 +DA:382,3 +DA:384,15 LF:75 LH:75 end_of_record +SF:lib/src/types/rubik_number_types.dart +DA:22,5 +DA:23,15 +LF:2 +LH:2 +end_of_record SF:lib/src/types/rubik_string_types.dart -DA:18,3 -DA:32,3 -DA:41,4 -DA:49,5 -DA:58,4 -DA:67,3 -DA:76,1 -DA:77,2 -DA:78,3 -DA:80,4 -DA:83,1 -DA:85,4 -DA:94,1 +DA:18,37 +DA:32,9 +DA:41,12 +DA:50,15 +DA:59,12 +DA:68,24 +DA:77,8 +DA:78,13 +DA:79,9 +DA:81,22 +DA:84,3 +DA:86,12 DA:95,3 -DA:97,5 -DA:99,5 +DA:96,37 +DA:98,15 +DA:100,15 LF:16 LH:16 end_of_record SF:lib/src/validations/cpf_cnpj_validator/rubik_cnpj_validator.dart -DA:26,1 -DA:29,5 -DA:31,3 -DA:32,2 -DA:33,2 -DA:36,1 -DA:38,3 -DA:48,1 -DA:49,1 -DA:51,2 -DA:53,1 -DA:54,2 -DA:56,2 -DA:59,2 -DA:62,1 -DA:63,6 -DA:81,1 -DA:82,1 -DA:83,3 -DA:85,2 -DA:87,1 -DA:88,2 -DA:89,2 -DA:91,4 -DA:92,3 -DA:103,1 -DA:104,1 -DA:105,1 -DA:107,2 -DA:108,3 -DA:111,3 -DA:112,3 -DA:114,3 -DA:126,1 -DA:127,3 +DA:26,4 +DA:29,20 +DA:31,12 +DA:32,8 +DA:33,8 +DA:36,4 +DA:38,12 +DA:48,8 +DA:49,8 +DA:51,16 +DA:53,5 +DA:54,10 +DA:56,10 +DA:59,16 +DA:62,8 +DA:63,48 +DA:81,4 +DA:82,4 +DA:83,12 +DA:85,8 +DA:87,4 +DA:88,8 +DA:89,8 +DA:91,16 +DA:92,12 +DA:103,3 +DA:104,3 +DA:105,3 +DA:107,6 +DA:108,9 +DA:111,9 +DA:112,9 +DA:114,9 +DA:126,3 +DA:127,9 LF:35 LH:35 end_of_record SF:lib/src/validations/cpf_cnpj_validator/rubik_cpf_validator.dart -DA:26,1 -DA:27,5 -DA:29,2 -DA:30,1 -DA:32,3 -DA:33,4 -DA:36,4 -DA:38,3 -DA:48,1 -DA:49,1 -DA:51,2 -DA:53,1 -DA:54,2 -DA:56,2 -DA:59,2 -DA:62,6 -DA:80,1 -DA:81,1 -DA:82,3 -DA:84,2 -DA:86,1 -DA:87,2 -DA:88,2 -DA:90,4 -DA:91,3 -DA:102,1 -DA:103,1 -DA:104,1 -DA:106,2 -DA:107,3 -DA:110,3 -DA:111,3 -DA:113,3 -DA:125,1 -DA:126,3 +DA:26,4 +DA:27,20 +DA:29,8 +DA:30,4 +DA:32,12 +DA:33,16 +DA:36,16 +DA:38,12 +DA:48,8 +DA:49,8 +DA:51,6 +DA:53,3 +DA:54,6 +DA:56,6 +DA:59,16 +DA:62,48 +DA:80,4 +DA:81,4 +DA:82,12 +DA:84,8 +DA:86,4 +DA:87,8 +DA:88,8 +DA:90,16 +DA:91,12 +DA:102,3 +DA:103,3 +DA:104,3 +DA:106,6 +DA:107,9 +DA:110,9 +DA:111,9 +DA:113,9 +DA:125,3 +DA:126,9 LF:35 LH:35 end_of_record @@ -992,128 +962,200 @@ DA:4,0 LF:1 LH:0 end_of_record +SF:lib/src/validations/types/rubik_validator_type.dart +DA:61,4 +DA:63,4 +DA:64,8 +DA:89,4 +DA:91,4 +DA:92,8 +DA:145,4 +DA:149,12 +DA:174,4 +DA:178,12 +DA:180,6 +DA:200,4 +DA:201,4 +DA:203,4 +DA:205,7 +DA:206,4 +DA:207,7 +DA:208,4 +DA:209,12 +DA:230,3 +DA:231,6 +DA:251,4 +DA:252,4 +DA:254,4 +DA:255,8 +DA:257,4 +DA:278,4 +DA:279,8 +DA:280,4 +DA:281,4 +DA:282,0 +DA:287,4 +DA:288,0 +DA:311,3 +DA:317,6 +DA:318,3 +DA:319,3 +DA:325,3 +DA:342,0 +LF:39 +LH:36 +end_of_record SF:lib/src/validations/types/rubik_string_validations.dart -DA:8,1 -DA:9,2 -DA:10,3 -DA:12,1 +DA:8,3 +DA:12,9 DA:13,3 -DA:14,1 -DA:19,1 -DA:24,2 -DA:25,1 -DA:26,2 -DA:28,1 -DA:32,1 -DA:37,2 -DA:38,1 -DA:39,2 -DA:41,1 -DA:45,1 -DA:46,2 -DA:47,2 -DA:51,1 +DA:18,3 +DA:20,3 +DA:25,0 +DA:27,0 +DA:32,3 +DA:37,3 +DA:42,3 +DA:47,3 DA:52,3 -DA:55,1 -DA:56,3 -DA:59,1 -DA:60,2 -DA:61,1 -DA:62,1 -DA:65,1 -DA:66,1 -DA:73,1 -DA:74,3 -DA:77,1 -DA:78,1 -DA:79,2 -DA:83,1 -DA:84,3 -DA:87,1 -DA:90,1 -DA:91,2 -DA:95,1 -DA:98,1 -DA:99,3 -DA:103,1 -DA:107,4 -DA:110,1 -DA:111,1 -DA:112,3 -DA:116,1 -DA:117,2 -DA:118,1 -DA:120,1 -DA:124,1 -DA:125,2 -DA:126,1 -DA:128,1 -DA:132,1 -DA:137,2 -DA:139,3 -DA:140,1 -DA:142,1 -DA:146,1 -DA:147,1 -DA:148,2 -DA:152,1 -DA:153,2 -DA:154,2 -DA:155,1 -DA:157,2 -DA:158,3 -DA:160,2 +DA:58,3 +DA:60,3 +DA:61,3 +DA:62,6 +DA:64,3 +DA:69,3 +DA:75,3 +DA:77,3 +DA:78,3 +DA:79,6 +DA:81,3 +DA:86,3 +DA:91,3 +DA:93,3 +DA:94,6 +DA:96,0 +DA:101,3 +DA:105,3 +DA:107,6 +DA:111,3 +DA:115,3 +DA:117,6 +DA:121,3 +DA:125,3 +DA:127,3 +DA:128,3 +DA:129,3 +DA:132,3 +DA:133,3 +DA:141,3 +DA:145,3 +DA:147,6 +DA:151,3 +DA:155,3 +DA:157,6 DA:161,3 -DA:163,1 -DA:164,1 -DA:170,1 -DA:171,1 -DA:173,1 -DA:178,2 -DA:179,1 -DA:180,2 -DA:183,4 -DA:184,4 -DA:186,1 -DA:190,1 -DA:195,2 -DA:196,1 -DA:197,2 -DA:200,4 -DA:201,4 -DA:203,1 -DA:207,1 -DA:212,2 -DA:213,1 -DA:214,1 -DA:217,4 -DA:219,1 -DA:223,1 -DA:228,2 -DA:229,1 -DA:230,1 -DA:233,1 -DA:235,2 -DA:236,2 -DA:238,1 -DA:242,1 -DA:245,2 -DA:246,3 -DA:247,2 -DA:248,3 -DA:252,4 -DA:259,1 -DA:263,2 -DA:264,1 -DA:265,2 -DA:267,1 -DA:271,1 -DA:272,3 -DA:277,1 +DA:165,3 +DA:167,6 +DA:171,3 +DA:175,3 +DA:177,6 +DA:181,3 +DA:185,3 +DA:187,3 +DA:188,6 +DA:192,3 +DA:197,3 +DA:199,9 +DA:203,3 +DA:208,3 +DA:210,3 +DA:211,6 +DA:215,3 +DA:220,3 +DA:222,3 +DA:223,3 +DA:225,3 +DA:230,3 +DA:235,3 +DA:237,3 +DA:238,3 +DA:240,3 +DA:245,3 +DA:251,3 +DA:253,3 +DA:255,9 +DA:256,3 +DA:258,3 +DA:263,3 +DA:268,3 +DA:270,6 +DA:274,3 DA:278,3 -DA:283,1 -DA:285,1 -DA:286,1 -LF:121 -LH:121 +DA:280,3 +DA:281,6 +DA:282,3 +DA:284,6 +DA:285,9 +DA:287,6 +DA:288,9 +DA:290,3 +DA:291,3 +DA:298,3 +DA:299,3 +DA:301,3 +DA:307,3 +DA:309,3 +DA:310,3 +DA:312,6 +DA:315,12 +DA:316,12 +DA:318,3 +DA:323,3 +DA:329,3 +DA:331,3 +DA:332,3 +DA:334,6 +DA:337,12 +DA:338,12 +DA:340,3 +DA:345,3 +DA:351,3 +DA:353,3 +DA:354,3 +DA:355,3 +DA:358,12 +DA:360,3 +DA:365,3 +DA:371,3 +DA:373,3 +DA:374,3 +DA:375,3 +DA:378,3 +DA:380,6 +DA:381,6 +DA:385,3 +DA:390,3 +DA:394,3 +DA:396,3 +DA:397,9 +DA:398,6 +DA:399,9 +DA:403,12 +DA:411,3 +DA:416,3 +DA:418,3 +DA:419,3 +DA:420,6 +DA:422,3 +DA:427,3 +DA:433,3 +DA:435,3 +DA:436,3 +DA:439,6 +DA:444,3 +DA:445,9 +DA:450,3 +DA:451,9 +LF:150 +LH:147 end_of_record diff --git a/lib/src/extensions/context_extensions.dart b/lib/src/extensions/context_extensions.dart index 57f0e8a..b51e74c 100644 --- a/lib/src/extensions/context_extensions.dart +++ b/lib/src/extensions/context_extensions.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; +import 'package:rubik_utils/rubik_utils.dart'; + extension RubikThemeExtensions on BuildContext { /// Returns the `ThemeData` of context ThemeData get theme => Theme.of(this); @@ -82,6 +84,34 @@ extension TextEditingControllerExtension on TextEditingController { void update(String value) => text = value; } +extension PageControllerExtension on PageController { + /// Returns `true`, if the `PageController` is on the last page + bool get isOnFirstPage => pageIndex == 0; + + /// Returns `true`, if the `PageController` is on the first page + bool isOnLastPage([int? length]) => + pageIndex == (length ?? page?.roundToDouble()); + + /// Returns `page` of `PageController` + int get pageIndex => page?.toInt() ?? 0; + + /// Navigates to the `next page` + void next({Duration? duration, Curve? curve}) { + nextPage( + curve: curve ?? Curves.linear, + duration: duration ?? 300.milliseconds, + ); + } + + /// Navigates to the `previous page` + void previous({Duration? duration, Curve? curve}) { + previousPage( + curve: curve ?? Curves.linear, + duration: duration ?? 300.milliseconds, + ); + } +} + extension SizeExtension on Size { /// Creates a copy of `Size` with the given fields replaced with the /// new values. diff --git a/lib/src/extensions/duration_extensions.dart b/lib/src/extensions/duration_extensions.dart index f4da57e..9cebfcd 100644 --- a/lib/src/extensions/duration_extensions.dart +++ b/lib/src/extensions/duration_extensions.dart @@ -361,6 +361,7 @@ extension RubikDurationExtensions on Duration { /// /// duration.toDateTime() // returns DateTime(2023, 03, 30, 15, 30) /// ``` + /// {@end-tool} DateTime toDateTime([int? year, int? month, int? day]) { final now = DateTime.now(); diff --git a/lib/src/extensions/list_extensions.dart b/lib/src/extensions/list_extensions.dart index 524b614..3405ce4 100644 --- a/lib/src/extensions/list_extensions.dart +++ b/lib/src/extensions/list_extensions.dart @@ -219,6 +219,7 @@ extension RubikListExtensions on List { /// list.replace(1, 10, start: 1); // [10, 2, 3, 4, 5] /// list.replace(1, 10, start: 1, end: 3); // [10, 2, 3, 4, 5] /// ``` + /// {@end-tool} void replace(E oldValue, E newValue, {int start = 0, int? end}) { if (isEmpty) return; @@ -315,7 +316,7 @@ extension RubikListExtensions on List { /// final list = [1, 2, 3, 4, 5]; /// list.average; // 3 /// ``` - /// + /// {@end-tool} double get average => isEmpty ? 0 : sum / length; /// Rotates the elements of the list `n` times to the left. diff --git a/lib/src/extensions/string_extensions.dart b/lib/src/extensions/string_extensions.dart index 864be72..1679509 100644 --- a/lib/src/extensions/string_extensions.dart +++ b/lib/src/extensions/string_extensions.dart @@ -94,6 +94,7 @@ extension RubikStringExtensions on String { /// ```dart /// 'Flutter is awesome'.capitalize // returns 'Fluter is awesome' /// ``` + /// {@end-tool} String get capitalize { if (length > 1) return '${this[0].toUpperCase()}${substring(1)}'; @@ -105,6 +106,7 @@ extension RubikStringExtensions on String { /// ```dart /// 'mr. john wick'.capitalizeWords // returns 'Mr. John Wick' /// ``` + /// {@end-tool} String get capitalizeWords { if (isEmpty) return ''; @@ -119,6 +121,7 @@ extension RubikStringExtensions on String { /// ```dart /// 'John wick'.firstName // returns 'John' /// ``` + /// {@end-tool} String get firstName { if (isEmpty) return this; @@ -130,6 +133,7 @@ extension RubikStringExtensions on String { /// ```dart /// 'wick'.lastName // returns 'Wick' /// ``` + /// {@end-tool} String get lastName { if (isEmpty) return this; @@ -158,6 +162,7 @@ extension RubikStringExtensions on String { /// ```dart /// 'Marcos Vinicius Santos Fernandes'.socialName // returns 'Marcos Santos' /// ``` + /// {@end-tool} String get socialName { if (isEmpty) return this; @@ -255,7 +260,7 @@ extension RubikStringExtensions on String { } /// Converts `String` to int, return null if the String is in the wrong format; - /// /// {@tool snippet} + /// {@tool snippet} /// ```dart /// '10'.toInt // returns 10 /// ``` diff --git a/lib/src/types/rubik_duration_types.dart b/lib/src/types/rubik_duration_types.dart index 694a2d6..eb0d8d2 100644 --- a/lib/src/types/rubik_duration_types.dart +++ b/lib/src/types/rubik_duration_types.dart @@ -1,4 +1,4 @@ -/// The unit of time used in [RubikDuration]. +/// The unit of time used in `RubikDuration`. /// {@tool snippet} /// ```dart /// RubikTimeUnit.days // returns 'days' diff --git a/lib/src/types/rubik_string_types.dart b/lib/src/types/rubik_string_types.dart index d87f39b..65fe2de 100644 --- a/lib/src/types/rubik_string_types.dart +++ b/lib/src/types/rubik_string_types.dart @@ -46,6 +46,7 @@ class RubikStringNames { /// final name = RubikStringNames('', shortName: 'package'); /// name.shortNameOrFullName; // returns 'package' /// ``` + /// {@end-tool} String get shortNameOrFullName => shortName.isEmpty ? fullName : shortName; /// Retuns full name and short name separated by a space. diff --git a/lib/src/validations/types/rubik_string_validations.dart b/lib/src/validations/types/rubik_string_validations.dart index f7ca795..3e46a23 100644 --- a/lib/src/validations/types/rubik_string_validations.dart +++ b/lib/src/validations/types/rubik_string_validations.dart @@ -5,13 +5,46 @@ import '../../../rubik_utils.dart'; typedef RString = RubikStringValidations; class RubikStringValidations extends RubikValidatorType { - RubikStringValidations._(); - factory RubikStringValidations() => instance; - static final instance = RubikStringValidations._(); + RubikStringValidations _add({ + required String key, + required RubikCallbackAction action, + }) { + required().types([String]); + addValidate(key: key, value: action); + + return this; + } + + @override + RubikValidatorType types(List types, {String? key, String? message}) { + super.types(types, key: key, message: message); - RubikStringValidations _add(RubikCallbackAction action) { - super.required().types([String]); - addValidate(action); + return this; + } + + @override + RubikValidatorType optional({String? key, String? message}) { + super.optional(key: key, message: message); + + return this; + } + + @override + RubikStringValidations transform( + RubikCallbackAction value, [ + String? key, + ]) { + super.transform(value, key); + + return this; + } + + @override + RubikStringValidations required({ + String? key, + String? message = 'Campo obrigatório', + }) { + super.required(key: key, message: message); return this; } @@ -19,152 +52,247 @@ class RubikStringValidations extends RubikValidatorType { RubikStringValidations minLength( int min, { String? message, + String key = 'minLength', bool includeEquals = true, }) { - return _add((value) { - final length = value.length; - final isValid = includeEquals ? length <= min : length < min; + return _add( + key: key, + action: (value) { + final length = value.length; + final isValid = includeEquals ? length >= min : length > min; - return isValid ? null : (message ?? 'Valor mínimo é $min'); - }); + return isValid ? null : (message ?? 'Valor mínimo é $min'); + }, + ); } RubikStringValidations maxLength( int max, { String? message, + String key = 'maxLength', bool includeEquals = true, }) { - return _add((value) { - final length = value.length; - final isValid = includeEquals ? length <= max : length < max; + return _add( + key: key, + action: (value) { + final length = value.length; + final isValid = includeEquals ? length <= max : length < max; - return isValid ? null : message ?? 'Valor máximo é $max'; - }); + return isValid ? null : message ?? 'Valor máximo é $max'; + }, + ); } - RubikStringValidations length(int len, {String? message}) { - return _add((value) { - return value.length == len ? null : message ?? 'Deve ter $len caracteres'; - }); + RubikStringValidations length( + int len, { + String key = 'length', + String? message, + }) { + return _add( + key: key, + action: (value) { + return value.length == len + ? null + : message ?? 'Deve ter $len caracteres'; + }, + ); } - RubikStringValidations cpf({String message = 'CPF inválido'}) { - return _add((value) => RubikCPFValidator.isValid(value) ? null : message); + RubikStringValidations cpf({ + String key = 'cpf', + String message = 'CPF inválido', + }) { + return _add( + key: key, + action: (value) => RubikCPFValidator.isValid(value) ? null : message, + ); } - RubikStringValidations cnpj({String message = 'CNPJ inválido'}) { - return _add((value) => RubikCNPJValidator.isValid(value) ? null : message); + RubikStringValidations cnpj({ + String key = 'cnpj', + String message = 'CNPJ inválido', + }) { + return _add( + key: key, + action: (value) => RubikCNPJValidator.isValid(value) ? null : message, + ); } - RubikStringValidations cpfOrCnpj({String message = 'CPF/CNPJ inválido'}) { - return _add((value) { - if (value.isCpf()) { - return RubikCPFValidator.isValid(value) ? null : message; - } - - if (value.isCnpj()) { - return RubikCNPJValidator.isValid(value) ? null : message; - } - - return message; - }); + RubikStringValidations cpfOrCnpj({ + String key = 'cpfOrCnpj', + String message = 'CPF/CNPJ inválido', + }) { + return _add( + key: key, + action: (value) { + if (value.isCpf()) { + return RubikCPFValidator.isValid(value) ? null : message; + } + + if (value.isCnpj()) { + return RubikCNPJValidator.isValid(value) ? null : message; + } + + return message; + }, + ); } - RubikStringValidations email({String message = 'Email inválido'}) { - return _add((value) => string_validator.isEmail(value) ? null : message); + RubikStringValidations email({ + String key = 'email', + String message = 'Email inválido', + }) { + return _add( + key: key, + action: (value) => string_validator.isEmail(value) ? null : message, + ); } - RubikStringValidations url({String message = 'URL inválida'}) { + RubikStringValidations url({ + String key = 'url', + String message = 'URL inválida', + }) { return _add( - (value) => string_validator.isURL(value) ? null : message, + key: key, + action: (value) => string_validator.isURL(value) ? null : message, ); } - RubikStringValidations uuid({String message = 'UUID inválido'}) { - return _add((value) => string_validator.isUUID(value) ? null : message); + RubikStringValidations uuid({ + String key = 'uuid', + String message = 'UUID inválido', + }) { + return _add( + key: key, + action: (value) => string_validator.isUUID(value) ? null : message, + ); } RubikStringValidations creditCard({ + String key = 'creditCard', String message = 'Cartão de crédito inválido', }) { return _add( - (value) => string_validator.isCreditCard(value) ? null : message, + key: key, + action: (value) => string_validator.isCreditCard(value) ? null : message, ); } RubikStringValidations randomPixKey({ + String key = 'randomPixKey', String message = 'Chave aleatória inválida', }) { return _add( - (value) => RubikRegExps.randomPixKey.hasMatch(value) ? null : message, + key: key, + action: (value) => + RubikRegExps.randomPixKey.hasMatch(value) ? null : message, ); } RubikStringValidations match( String pattern, { + String key = 'match', String message = 'Valor inválido', }) { - return _add((value) => RegExp(pattern).hasMatch(value) ? null : message); + return _add( + key: key, + action: (value) => RegExp(pattern).hasMatch(value) ? null : message, + ); } - RubikStringValidations includes(String str, {String? message}) { + RubikStringValidations includes( + String str, { + String key = 'includes', + String? message, + }) { return _add( - (value) => value.contains(str) ? null : message ?? '$str não encontrado', + key: key, + action: (value) => + value.contains(str) ? null : message ?? '$str não encontrado', ); } - RubikStringValidations startsWith(String str, {String? message}) { - return _add((value) { - final isValid = value.startsWith(str); + RubikStringValidations startsWith( + String str, { + String key = 'startsWith', + String? message, + }) { + return _add( + key: key, + action: (value) { + final isValid = value.startsWith(str); - return isValid ? null : message ?? '$value não inicia com $str'; - }); + return isValid ? null : message ?? '$value não inicia com $str'; + }, + ); } - RubikStringValidations endsWith(String str, {String? message}) { - return _add((value) { - final isValid = value.endsWith(str); + RubikStringValidations endsWith( + String str, { + String key = 'endsWith', + String? message, + }) { + return _add( + key: key, + action: (value) { + final isValid = value.endsWith(str); - return isValid ? null : message ?? '$value não termina com $str'; - }); + return isValid ? null : message ?? '$value não termina com $str'; + }, + ); } RubikStringValidations equals( String str, { String? message, + String key = 'equals', bool equalsIgnoreCase = false, }) { - return _add((value) { - final isValid = equalsIgnoreCase - ? value.toLowerCase() == str.toLowerCase() - : value == str; - - return isValid ? null : message ?? '$value não é igual a $str'; - }); + return _add( + key: key, + action: (value) { + final isValid = equalsIgnoreCase + ? value.toLowerCase() == str.toLowerCase() + : value == str; + + return isValid ? null : message ?? '$value não é igual a $str'; + }, + ); } - RubikStringValidations ip({String? version, String message = 'IP inválido'}) { + RubikStringValidations ip({ + String key = 'ip', + String? version, + String message = 'IP inválido', + }) { return _add( - (value) => string_validator.isIP(value, version) ? null : message, + key: key, + action: (value) => string_validator.isIP(value, version) ? null : message, ); } - RubikStringValidations date({String message = 'Data inválida'}) { - return _add((value) { - final match = RubikRegExps.dateRegex.firstMatch(value); - if (match.isNull) return message; + RubikStringValidations date({ + String key = 'date', + String message = 'Data inválida', + }) { + return _add( + key: key, + action: (value) { + final match = RubikRegExps.dateRegex.firstMatch(value); + if (match.isNull) return message; - final date = match!.group(1)!.toList('-', '/'); - final firstItemIsYear = date.first.length == 4; + final date = match!.group(1)!.toList('-', '/'); + final firstItemIsYear = date.first.length == 4; - final month = date[1].toInt!; - final day = (firstItemIsYear ? date.last : date.first).toInt!; + final month = date[1].toInt!; + final day = (firstItemIsYear ? date.last : date.first).toInt!; - final isDay = day.isBetween(1, 31, needToBeEqual: true); - final isMonth = month.isBetween(1, 12, needToBeEqual: true); + final isDay = day.isBetween(1, 31, needToBeEqual: true); + final isMonth = month.isBetween(1, 12, needToBeEqual: true); - return isDay && isMonth ? null : message; - }); + return isDay && isMonth ? null : message; + }, + ); } String _relativeError(bool isRelative, int quantity) => @@ -173,118 +301,155 @@ class RubikStringValidations extends RubikValidatorType { RubikStringValidations uppercase( int quantity, { String? message, + String key = 'uppercase', bool isRelative = false, }) { - return _add((value) { - final relativeError = _relativeError(isRelative, quantity); - final newValue = value.replaceAll(RubikRegExps.contaisUppercaseRegex, ''); - - final isValid = isRelative - ? (value.length - newValue.length) >= quantity - : (value.length - newValue.length) == quantity; - - return isValid ? null : message ?? '$relativeError letras maiúsculas'; - }); + return _add( + key: key, + action: (value) { + final relativeError = _relativeError(isRelative, quantity); + final newValue = + value.replaceAll(RubikRegExps.contaisUppercaseRegex, ''); + + final isValid = isRelative + ? (value.length - newValue.length) >= quantity + : (value.length - newValue.length) == quantity; + + return isValid ? null : message ?? '$relativeError letras maiúsculas'; + }, + ); } RubikStringValidations lowercase( int quantity, { String? message, + String key = 'lowercase', bool isRelative = false, }) { - return _add((value) { - final relativeError = _relativeError(isRelative, quantity); - final newValue = value.replaceAll(RubikRegExps.contaisLowercaseRegex, ''); - - final isValid = isRelative - ? (value.length - newValue.length) >= quantity - : (value.length - newValue.length) == quantity; - - return isValid ? null : message ?? '$relativeError letras minúsculas'; - }); + return _add( + key: key, + action: (value) { + final relativeError = _relativeError(isRelative, quantity); + final newValue = + value.replaceAll(RubikRegExps.contaisLowercaseRegex, ''); + + final isValid = isRelative + ? (value.length - newValue.length) >= quantity + : (value.length - newValue.length) == quantity; + + return isValid ? null : message ?? '$relativeError letras minúsculas'; + }, + ); } RubikStringValidations digits( int quantity, { String? message, + String key = 'digits', bool isRelative = false, }) { - return _add((value) { - value = value.digitsOnly(); - final relativeError = _relativeError(isRelative, quantity); + return _add( + key: key, + action: (value) { + value = value.digitsOnly(); + final relativeError = _relativeError(isRelative, quantity); - final isValid = - isRelative ? value.length >= quantity : value.length == quantity; + final isValid = + isRelative ? value.length >= quantity : value.length == quantity; - return isValid ? null : message ?? '$relativeError dígitos'; - }); + return isValid ? null : message ?? '$relativeError dígitos'; + }, + ); } RubikStringValidations specialCharacters( int quantity, { String? message, bool isRelative = false, + String key = 'specialCharacters', }) { - return _add((value) { - final newValue = value.replaceAll( - RubikRegExps.withoutLettersOrDigitsRegex, - '', - ); - final relativeError = _relativeError(isRelative, quantity); - final isValid = isRelative - ? newValue.length >= quantity - : newValue.length == quantity; - - return isValid ? null : message ?? '$relativeError caracteres especiais'; - }); + return _add( + key: key, + action: (value) { + final newValue = value.replaceAll( + RubikRegExps.withoutLettersOrDigitsRegex, + '', + ); + final relativeError = _relativeError(isRelative, quantity); + final isValid = isRelative + ? newValue.length >= quantity + : newValue.length == quantity; + + return isValid + ? null + : message ?? '$relativeError caracteres especiais'; + }, + ); } RubikStringValidations digitSequence({ + String key = 'digitSequence', String message = 'Não pode conter sequência numérica', }) { - return _add((value) { - for (int i = 1; i < value.length; i++) { - final int? a = value[i].toInt; - final int? b = value[i - 1].toInt; + return _add( + key: key, + action: (value) { + for (int i = 1; i < value.length; i++) { + final int? a = value[i].toInt; + final int? b = value[i - 1].toInt; - if (a == null || b == null) continue; + if (a == null || b == null) continue; - return (a - 1) == b || (a + 1) == b ? message : null; - } + return (a - 1) == b || (a + 1) == b ? message : null; + } - return null; - }); + return null; + }, + ); } RubikStringValidations repetition({ bool digitsOnly = true, + String key = 'repetition', String message = 'Não deve conter repetição', }) { - return _add((value) { - value = digitsOnly ? value.digitsOnly() : value; - final matches = RubikRegExps.contaisRepetitionRegex.allMatches(value); + return _add( + key: key, + action: (value) { + value = digitsOnly ? value.digitsOnly() : value; + final matches = RubikRegExps.contaisRepetitionRegex.allMatches(value); - return matches.isEmpty ? null : message; - }); + return matches.isEmpty ? null : message; + }, + ); } - RubikStringValidations toUpperCase() { - transform((value) => value.toUpperCase()); + RubikStringValidations confirmPassword( + String password, + RString schema, { + String key = 'confirmPassword', + String message = 'Senha não coincidem', + }) { + return _add( + key: key, + action: (value) { + final initialValidation = schema.validate(value); + if (initialValidation != null) return initialValidation; - return this; + return password.compareTo(value) == 0 ? null : message; + }, + ); } - RubikStringValidations toLowerCase() { - transform((value) => value.toLowerCase()); + RubikStringValidations toUpperCase({String key = 'transform_to_uppercase'}) { + transform((value) => value.toUpperCase(), key); return this; } - @override - String? validate(Object? value) { - final result = super.validate(value); - super.clear(); + RubikStringValidations toLowerCase({String key = 'transform_to_lowercase'}) { + transform((value) => value.toLowerCase(), key); - return result; + return this; } } diff --git a/lib/src/validations/types/rubik_validator_type.dart b/lib/src/validations/types/rubik_validator_type.dart index 95bbdb0..f85e165 100644 --- a/lib/src/validations/types/rubik_validator_type.dart +++ b/lib/src/validations/types/rubik_validator_type.dart @@ -13,6 +13,7 @@ import '../../extensions/object_extensions.dart'; /// ``` /// {@end-tool} typedef RubikCallbackAction = R? Function(T); +typedef RubikActionEvent = void Function(String, Object?); /// The `RubikFieldAction` an class abstract class representing an action that can be executed on a field. /// It has two generic type parameters, `T` and `R`, @@ -31,6 +32,7 @@ typedef RubikCallbackAction = R? Function(T); /// ``` /// {@end-tool} abstract class RubikFieldAction { + String get key; R execute(T value); } @@ -52,8 +54,11 @@ abstract class RubikFieldAction { /// ``` /// {@end-tool} class RubikValidationAction implements RubikFieldAction { + @override + final String key; + final RubikCallbackAction validator; - const RubikValidationAction(this.validator); + const RubikValidationAction(this.validator, this.key); @override String? execute(T value) => validator.call(value); @@ -77,8 +82,11 @@ class RubikValidationAction implements RubikFieldAction { /// ``` /// {@end-tool} class RubikTransformAction implements RubikFieldAction { + @override + final String key; + final RubikCallbackAction transform; - const RubikTransformAction(this.transform); + const RubikTransformAction(this.transform, this.key); @override R? execute(T value) => transform.call(value); @@ -134,8 +142,11 @@ abstract class RubikValidatorType { /// print(validator.validate('John Doe')); // returns null /// ``` /// {@end-tool} - RubikValidatorType addValidate(RubikCallbackAction value) { - _actions.add(RubikValidationAction(value)); + RubikValidatorType addValidate({ + required String key, + required RubikCallbackAction value, + }) { + _actions.add(RubikValidationAction(value, key)); return this; } @@ -160,8 +171,14 @@ abstract class RubikValidatorType { /// print(validator.validate('John Doe')); // returns 'This field must be a number' /// ``` /// {@end-tool} - RubikValidatorType transform(RubikCallbackAction value) { - _actions.add(RubikTransformAction(value)); + RubikValidatorType transform( + RubikCallbackAction value, [ + String? key, + ]) { + _actions.add(RubikTransformAction( + value, + key ?? 'trasform_${value.hashCode}', + )); return this; } @@ -180,17 +197,20 @@ abstract class RubikValidatorType { /// print(validator.validate(null)); // returns 'This field is required' /// ``` /// {@end-tool} - RubikValidatorType required({String? message}) { - return addValidate((value) { - return value == null || - (value is Map && value.isEmpty) || - (value is Set && value.isEmpty) || - (value is Iterable && value.isEmpty) || - (value is List && value.isEmpty) || - (value is String && value.trim().isEmpty) - ? message ?? 'Campo obrigatório' - : null; - }); + RubikValidatorType required({String? key, String? message}) { + return addValidate( + key: key ?? 'required', + value: (value) { + return value == null || + (value is Map && value.isEmpty) || + (value is Set && value.isEmpty) || + (value is Iterable && value.isEmpty) || + (value is List && value.isEmpty) || + (value is String && value.trim().isEmpty) + ? message ?? 'Campo obrigatório' + : null; + }, + ); } /// Adds a validation action that allows a null value. @@ -207,8 +227,8 @@ abstract class RubikValidatorType { /// print(validator.validate(null)); // returns null /// ``` /// {@end-tool} - RubikValidatorType optional({String? message}) { - return addValidate((value) => value.isNull ? null : message); + RubikValidatorType optional({String? key, String? message}) { + return addValidate(key: key ?? 'optional', value: (value) => null); } /// Adds a validation action that checks if the input value is an instance of @@ -228,12 +248,15 @@ abstract class RubikValidatorType { /// print(validator.validate('John Doe')); // returns 'This field must be a number' /// ``` /// {@end-tool} - RubikValidatorType types(List types, {String? message}) { - return addValidate((value) { - final isValid = types.contains(value.runtimeType); + RubikValidatorType types(List types, {String? key, String? message}) { + return addValidate( + key: 'types', + value: (value) { + final isValid = types.contains(value.runtimeType); - return isValid ? null : message ?? 'O tipo $value não é válido'; - }); + return isValid ? null : message ?? 'O tipo $value não é válido'; + }, + ); } /// Adds a validation action that checks if the input value is equal to one of @@ -252,14 +275,18 @@ abstract class RubikValidatorType { /// print(validator.validate('John Doe')); // returns 'This field must be a number' /// ``` /// {@end-tool} - String? validate(Object? value) { + String? validate(Object? value, [RubikActionEvent? event]) { for (final action in _actions) { if (action.isInstanceOf()) { value = (action as RubikTransformAction).execute(value); + event?.call(action.key, value); + continue; } final result = action.execute(value); + event?.call(action.key, result); + if (result != null) return result; } @@ -281,13 +308,16 @@ abstract class RubikValidatorType { /// print(schema.parse('John Doe')); // returns null /// ``` /// {@end-tool} - TResult? parse(TInput? value) { + ({TResult? result, String? error}) + parse( + TInput? value, + ) { Object? newValue; for (final action in _actions) { if (action.isInstanceOf()) { - final hasError = action.execute(value) != null; - if (hasError) return null; + final error = action.execute(value); + if (error != null) return (result: null, error: error); continue; } @@ -295,7 +325,7 @@ abstract class RubikValidatorType { newValue = (action as RubikTransformAction).execute(newValue ?? value); } - return newValue as TResult?; + return (result: newValue as TResult?, error: null); } /// Clears all actions from the validator. diff --git a/pubspec.lock b/pubspec.lock index 6e375bc..2bfd9ce 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,46 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568" - url: "https://pub.dev" - source: hosted - version: "59.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96 - url: "https://pub.dev" - source: hosted - version: "5.11.1" - analyzer_plugin: - dependency: transitive - description: - name: analyzer_plugin - sha256: c1d5f167683de03d5ab6c3b53fc9aeefc5d59476e7810ba7bbddff50c6f4392d - url: "https://pub.dev" - source: hosted - version: "0.11.2" - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "607f8fa9786f392043f169898923e6c59b4518242b68b8862eb8a8b7d9c30b4a" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - args: - dependency: transitive - description: - name: args - sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a - url: "https://pub.dev" - source: hosted - version: "2.4.1" async: dependency: transitive description: @@ -77,58 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" - url: "https://pub.dev" - source: hosted - version: "1.17.1" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - csslib: - dependency: transitive - description: - name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "0.17.2" - dart_code_metrics: - dependency: "direct dev" - description: - name: dart_code_metrics - sha256: "162c81dbd0a2ba182f38ca615335f3e8878f212ec7beea83d6bfad4e99eb541a" - url: "https://pub.dev" - source: hosted - version: "5.7.3" - dart_code_metrics_presets: - dependency: transitive - description: - name: dart_code_metrics_presets - sha256: "22e27f98e8c7d8b11cca43d2656a822935280747050ae65e8cd03c52d09c0d1c" - url: "https://pub.dev" - source: hosted - version: "1.7.0" - dart_style: - dependency: transitive - description: - name: dart_style - sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad - url: "https://pub.dev" - source: hosted - version: "2.3.1" + version: "1.18.0" fake_async: dependency: transitive description: @@ -137,128 +49,56 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" - file: - dependency: transitive - description: - name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" - source: hosted - version: "6.1.4" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.dev" - source: hosted - version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - glob: - dependency: transitive - description: - name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - html: - dependency: transitive - description: - name: html - sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" - url: "https://pub.dev" - source: hosted - version: "0.15.3" - http: - dependency: transitive - description: - name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" - url: "https://pub.dev" - source: hosted - version: "0.13.6" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" intl: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" - url: "https://pub.dev" - source: hosted - version: "0.18.1" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "0.19.0" lints: - dependency: transitive + dependency: "direct dev" description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" matcher: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" + version: "1.10.0" path: dependency: transitive description: @@ -267,46 +107,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" - url: "https://pub.dev" - source: hosted - version: "5.1.0" - platform: - dependency: transitive - description: - name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" - source: hosted - version: "3.1.0" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - pub_updater: - dependency: transitive - description: - name: pub_updater - sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c" - url: "https://pub.dev" - source: hosted - version: "0.3.0" sky_engine: dependency: transitive description: flutter @@ -316,26 +116,26 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -348,10 +148,10 @@ packages: dependency: "direct main" description: name: string_validator - sha256: b419cf5d21d608522e6e7cafed4deb34b6f268c43df866e63c320bab98a08cf6 + sha256: "54d4f42cd6878ae72793a58a529d9a18ebfdfbfebd9793bbe55c9b28935e8543" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" term_glyph: dependency: transitive description: @@ -364,26 +164,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb - url: "https://pub.dev" - source: hosted - version: "0.5.1" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "1.3.1" - uuid: - dependency: transitive - description: - name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" - url: "https://pub.dev" - source: hosted - version: "3.0.7" + version: "0.6.1" vector_math: dependency: transitive description: @@ -392,30 +176,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - watcher: + web: dependency: transitive description: - name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "1.0.2" - xml: - dependency: transitive - description: - name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" - url: "https://pub.dev" - source: hosted - version: "6.2.2" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" + version: "0.3.0" sdks: - dart: ">=3.0.0-0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=1.17.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3c9b6e3..51d80fd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,24 +1,23 @@ name: rubik_utils description: RubikUtils is a collection of utilities for project Flutter. -version: 1.0.0 +version: 1.0.2 -homepage: https://git.cubos.io/cubos/flutter-packages/rubik_utils +homepage: https://github.com/cubos/cubos_extensions environment: - sdk: '>=2.19.2 <4.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=1.17.0" dependencies: flutter: sdk: flutter - intl: ^0.18.0 + intl: ^0.19.0 string_validator: ^1.0.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 - dart_code_metrics: ^5.6.0 \ No newline at end of file + lints: ^3.0.0 \ No newline at end of file diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..cc1d56e --- /dev/null +++ b/renovate.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base", + ":disableDependencyDashboard" + ] +} + + \ No newline at end of file diff --git a/test/src/components/horizontal_spacing_test.dart b/test/src/components/horizontal_spacing_test.dart index fa3a0f6..93cfa0c 100644 --- a/test/src/components/horizontal_spacing_test.dart +++ b/test/src/components/horizontal_spacing_test.dart @@ -24,13 +24,13 @@ void main() { const Key rowKey = Key('row'); const Key child0Key = Key('child0Key'); - await tester.pumpWidget(Center( + await tester.pumpWidget(const Center( child: Row( key: rowKey, mainAxisSize: MainAxisSize.min, textDirection: TextDirection.ltr, mainAxisAlignment: MainAxisAlignment.center, - children: const [ + children: [ SizedBox(height: 20.0, width: 100.0), HorizontalSpacing(key: child0Key, 150.0), SizedBox(height: 20.0, width: 100.0), diff --git a/test/src/components/vertical_spacing_test.dart b/test/src/components/vertical_spacing_test.dart index 4c004ec..ef2339e 100644 --- a/test/src/components/vertical_spacing_test.dart +++ b/test/src/components/vertical_spacing_test.dart @@ -24,11 +24,11 @@ void main() { const Key columnKey = Key('column'); const Key child0Key = Key('child0Key'); - await tester.pumpWidget(Center( + await tester.pumpWidget(const Center( child: Column( key: columnKey, mainAxisSize: MainAxisSize.min, - children: const [ + children: [ SizedBox(width: 100.0, height: 100.0), VerticalSpacing(key: child0Key, 50.0), SizedBox(width: 100.0, height: 150.0), diff --git a/test/src/validations/types/rubik_string_validations_test.dart b/test/src/validations/types/rubik_string_validations_test.dart index def7153..a4bd51e 100644 --- a/test/src/validations/types/rubik_string_validations_test.dart +++ b/test/src/validations/types/rubik_string_validations_test.dart @@ -32,7 +32,7 @@ void main() { const message = 'invalid_minLength'; expect( - RString().minLength(2, message: message).validate('test'), + RString().minLength(4, message: message).validate('abc'), message, ); }); @@ -394,15 +394,24 @@ void main() { expect(RString().repetition(message: message).validate('11'), message); }); -// test('RString.confirmPassword', () { -// expect(RString.confirmPassword('', ''), isString); -// expect(RString.confirmPassword(' ', ''), isString); -// expect(RString.confirmPassword('', null), isString); + test('RString.confirmPassword', () { + final schema = + RString().minLength(3).maxLength(6).specialCharacters(1).digits(1); -// expect(RString.confirmPassword('10', '10'), isNull); -// expect(RString.confirmPassword('hello', 'hello'), isNull); -// expect(RString.confirmPassword('Senha2132', 'Senha2132'), isNull); -// }); + expect(RString().confirmPassword('', schema).validate(''), isString); + expect(RString().confirmPassword('', schema).validate(null), isString); + expect(RString().confirmPassword('ab', schema).validate('ab'), isString); + + expect( + RString().confirmPassword('ab1de@', schema).validate('abc'), + isString, + ); + + expect( + RString().confirmPassword('ab1de@', schema).validate('ab1de@'), + isNull, + ); + }); }); group('RubikStringRString.transforms', () { diff --git a/test/src/validations/types/rubik_validator_type_test.dart b/test/src/validations/types/rubik_validator_type_test.dart index f82ceed..6f91378 100644 --- a/test/src/validations/types/rubik_validator_type_test.dart +++ b/test/src/validations/types/rubik_validator_type_test.dart @@ -41,15 +41,15 @@ void main() { test('should return transformad value', () { var schema = _TestValidation().required().types([String]); - expect(schema.parse(1), isNull); + expect(schema.parse(1).result, isNull); schema = schema.transform>((e) { return e.toList(',').map((e) => int.parse(e)).toList(); }); - expect(schema.parse(1), isNull); + expect(schema.parse(1).result, isNull); - final parsed = schema.parse>('1,2,3'); + final parsed = schema.parse>('1,2,3').result; expect(parsed, isNotNull); expect(parsed, isA>()); expect(parsed, [1, 2, 3]);