Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge package:characters #131

Merged
merged 85 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from 83 commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
f12cedd
Initial commit
mit-mit Aug 29, 2019
931f92c
Add travis (dart-lang/characters#2)
mit-mit Aug 29, 2019
b3a04b0
Repo config (dart-lang/characters#1)
mit-mit Aug 29, 2019
d0b408c
Add initial implementation. (dart-lang/characters#3)
lrhn Sep 3, 2019
3e070bd
Add third_party directory containing licenses and referenced document…
lrhn Sep 4, 2019
21dd4ad
Update README.md (dart-lang/characters#7)
mit-mit Sep 27, 2019
9545eae
First attempt at index-agnostic API. (dart-lang/characters#6)
lrhn Oct 10, 2019
265a6f1
Change replace to keep its position in the new result. Add a few memb…
lrhn Oct 22, 2019
4408e7f
Add required fields to pubspec.yaml.s
lrhn Oct 22, 2019
ef80511
Update changelog.
lrhn Oct 22, 2019
053bf6f
Enable pedantic lints and fix to meet (dart-lang/characters#10)
mit-mit Oct 25, 2019
a79808c
Add small example (dart-lang/characters#9)
mit-mit Oct 25, 2019
7a69a39
Add extension method for easy creation (dart-lang/characters#11)
mit-mit Nov 13, 2019
4009fe0
Add Pub badge (dart-lang/characters#12)
mit-mit Nov 15, 2019
d7437f2
Hide UTF-16 assumptions in the API. (dart-lang/characters#13)
lrhn Nov 15, 2019
511c9bb
Update README.md (dart-lang/characters#14)
mit-mit Dec 5, 2019
1e193b4
Add split methods. (dart-lang/characters#16)
lrhn May 12, 2020
fb7fd4b
Time for 1.0 (dart-lang/characters#18)
mit-mit May 27, 2020
b0a50fd
Update README.md (dart-lang/characters#19)
lrhn Jun 9, 2020
1f8d85e
Remove vscode config (dart-lang/characters#26)
natebosch Jun 19, 2020
4ccafc0
merge null_safety branch into master (dart-lang/characters#28)
jakemac53 Jun 24, 2020
c376b8b
allow the <=2.9.10 stable sdk and bump version (dart-lang/characters#29)
jakemac53 Jul 17, 2020
b52ae78
update to the 2.10 dev sdk (dart-lang/characters#31)
jakemac53 Jul 21, 2020
3e20367
CI: Test on dev branch (dart-lang/characters#32)
kevmoo Jul 23, 2020
6cfa784
Update README.md
lrhn Aug 29, 2020
047dd05
Update README.md
lrhn Aug 29, 2020
33bed6a
Add some extra functionality. (dart-lang/characters#34)
lrhn Sep 22, 2020
aece3c8
Prepare for the 2.11 dev SDKs (dart-lang/characters#35)
natebosch Sep 22, 2020
72151b6
Allow the 2.12 dev SDKs (dart-lang/characters#36)
natebosch Oct 22, 2020
613d61c
Bump SDK constraints for pub (dart-lang/characters#37)
natebosch Nov 3, 2020
c70e1e0
Move tests back to top-level test dir (dart-lang/characters#42)
mit-mit Dec 4, 2020
5c39647
Fix grammatical error (dart-lang/characters#40)
sidrao2006 Dec 4, 2020
1f7e954
Migrate to GitHub Actions (dart-lang/characters#44)
athomas Jan 12, 2021
728d890
Prepare to publish for stable null safety (dart-lang/characters#45)
natebosch Feb 2, 2021
f1e6076
fixed typos (whwere -> where) (dart-lang/characters#46)
suragch Mar 12, 2021
e574fcd
Cleanup test-package.yml (dart-lang/characters#47)
mit-mit Mar 15, 2021
8680354
Update LICENSE (dart-lang/characters#49)
franklinyow Apr 5, 2021
7dfb679
Change pubspec homepage to repository (dart-lang/characters#50)
natebosch May 5, 2021
dc8565a
Fix unneeded imports (dart-lang/characters#52)
kevmoo May 24, 2021
0ad65df
Switch to package:lints (dart-lang/characters#53)
mit-mit May 25, 2021
49ed146
Add `empty` constant. (dart-lang/characters#54)
lrhn Jun 1, 2021
03ce3c2
Change argument type of `contains`. (dart-lang/characters#51)
lrhn Jun 14, 2021
845463b
Fix method syntax in ReadMe example code (dart-lang/characters#55)
GAM3RG33K Jun 14, 2021
96731ca
Dart format with latest SDK (dart-lang/characters#56)
kevmoo Jul 12, 2021
1de1edd
Don't duplicate work in `where`. (dart-lang/characters#58)
lrhn Aug 6, 2021
95e5e93
Add copyright header (dart-lang/characters#60)
mit-mit Sep 13, 2021
b769373
Make the version be 1.2.0. (dart-lang/characters#59)
lrhn Sep 13, 2021
8d7c19c
Update pubspec.yaml (dart-lang/characters#64)
devoncarew Apr 26, 2022
5232969
prep to publish 1.2.1 (dart-lang/characters#65)
devoncarew May 4, 2022
f5023bd
blast_repo fixes (dart-lang/characters#68)
kevmoo Nov 9, 2022
39fb9b9
Bump actions/checkout from 3.1.0 to 3.2.0 (dart-lang/characters#69)
dependabot[bot] Jan 3, 2023
78dde51
Update tables to Unicode 15.0. (dart-lang/characters#71)
lrhn Jan 30, 2023
a3ac443
Bump dart-lang/setup-dart from 1.3 to 1.4 (dart-lang/characters#74)
dependabot[bot] Feb 1, 2023
ca35053
Bump actions/checkout from 3.2.0 to 3.3.0 (dart-lang/characters#73)
dependabot[bot] Feb 1, 2023
b715adb
blast_repo fixes (dart-lang/characters#75)
devoncarew Feb 17, 2023
efeaf3d
Bump dart-lang/setup-dart from 1.4.0 to 1.5.0 (dart-lang/characters#80)
dependabot[bot] Apr 3, 2023
80c89bb
Bump actions/checkout from 3.3.0 to 3.5.0 (dart-lang/characters#79)
dependabot[bot] Apr 3, 2023
2f289c5
Add tools to update and generate tables and tests. (dart-lang/charact…
lrhn Apr 19, 2023
f729e1c
Bump actions/checkout from 3.5.0 to 3.5.2 (dart-lang/characters#81)
dependabot[bot] May 1, 2023
589b8d6
blast_repo fixes (dart-lang/characters#82)
devoncarew May 15, 2023
ef63e5b
Bump actions/checkout from 3.5.2 to 3.5.3 (dart-lang/characters#84)
dependabot[bot] Jul 1, 2023
6c7c759
Bump actions/checkout from 3.5.3 to 3.6.0 (dart-lang/characters#86)
dependabot[bot] Sep 1, 2023
8e15cae
Bump dart-lang/setup-dart from 1.5.0 to 1.5.1 (dart-lang/characters#88)
dependabot[bot] Oct 1, 2023
bf74e5e
Bump actions/checkout from 3.6.0 to 4.1.0 (dart-lang/characters#87)
dependabot[bot] Oct 1, 2023
06fc1a7
Fix broken comment references (dart-lang/characters#89)
srawlins Oct 13, 2023
0bcc1de
Bump actions/checkout from 4.1.0 to 4.1.1 (dart-lang/characters#90)
dependabot[bot] Nov 1, 2023
d062b28
Bump dart-lang/setup-dart from 1.5.1 to 1.6.0 (dart-lang/characters#91)
dependabot[bot] Nov 1, 2023
ec59b45
Fix README formatting (dart-lang/characters#92)
parlough Jan 29, 2024
1346dd2
Bump dart-lang/setup-dart from 1.6.0 to 1.6.2 (dart-lang/characters#94)
dependabot[bot] Feb 1, 2024
ec195e1
Bump actions/checkout from 4.1.1 to 4.1.2 (dart-lang/characters#96)
dependabot[bot] Apr 1, 2024
5c7e058
Bump dart-lang/setup-dart from 1.6.2 to 1.6.4 (dart-lang/characters#97)
dependabot[bot] May 1, 2024
ada4e69
Bump actions/checkout from 4.1.2 to 4.1.4 (dart-lang/characters#98)
dependabot[bot] May 1, 2024
637f282
blast_repo fixes (dart-lang/characters#99)
devoncarew May 3, 2024
59195df
Add `topics` to `pubspec.yaml` (dart-lang/characters#100)
szakarias May 23, 2024
ed394de
Bump actions/checkout from 4.1.4 to 4.1.6 in the github-actions group…
dependabot[bot] Jun 1, 2024
57b6660
Bump lints and min SDK (dart-lang/characters#102)
kevmoo Jun 4, 2024
58c8b89
Bump the github-actions group with 2 updates (dart-lang/characters#103)
dependabot[bot] Jul 1, 2024
c4509cc
update lints (dart-lang/characters#104)
kevmoo Jul 8, 2024
9582360
Bump actions/checkout from 4.1.7 to 4.2.0 in the github-actions group…
dependabot[bot] Oct 1, 2024
dcac9f1
Merge package:characters into the core monorepo
mosuem Oct 14, 2024
e309d4e
Moving fixes
mosuem Oct 14, 2024
275919c
Rename labeler
mosuem Oct 15, 2024
defe8b6
Merge branch 'main' into merge-characters-package
mosuem Oct 15, 2024
762195d
Changes as per review
mosuem Oct 16, 2024
94061ca
Merge branch 'main' into merge-characters-package
mosuem Oct 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
"package-args":
- changed-files:
- any-glob-to-any-file: 'pkgs/args/**'

"package-characters":
mosuem marked this conversation as resolved.
Show resolved Hide resolved
- changed-files:
- any-glob-to-any-file: 'pkgs/characters/**'
72 changes: 72 additions & 0 deletions .github/workflows/characters.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Dart CI
mosuem marked this conversation as resolved.
Show resolved Hide resolved

on:
# Run CI on pushes to the main branch, and on PRs against main.
push:
branches: [ main ]
paths:
- '.github/workflows/characters.yaml'
- 'pkgs/characters/**'
pull_request:
branches: [ main ]
paths:
- '.github/workflows/characters.yaml'
- 'pkgs/characters/**'
schedule:
- cron: "0 0 * * 0"
env:
PUB_ENVIRONMENT: bot.github

defaults:
run:
working-directory: pkgs/characters/

jobs:
# Check code formatting and static analysis on a single OS (linux)
# against dev, stable, and 2.19.0 (the package's lower bound).
analyze:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
sdk: [dev, stable, 3.4]
steps:
- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938
- uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672
with:
sdk: ${{ matrix.sdk }}
- id: install
name: Install dependencies
run: dart pub get
- name: Check formatting
run: dart format --output=none --set-exit-if-changed .
if: matrix.sdk == 'dev' && steps.install.outcome == 'success'
- name: Analyze code
run: dart analyze --fatal-infos
if: always() && steps.install.outcome == 'success'

# Run tests on a matrix consisting of two dimensions:
# 1. OS: ubuntu-latest
# 2. Release channel: dev, stable, and 2.19.0 (the package's lower bound)
test:
needs: analyze
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
sdk: [dev, stable, 3.4]
steps:
- uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938
- uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672
with:
sdk: ${{ matrix.sdk }}
- id: install
name: Install dependencies
run: dart pub get
- name: Run VM tests
run: dart test --platform vm
if: always() && steps.install.outcome == 'success'
- name: Run Chrome tests
run: dart test --platform chrome
if: always() && steps.install.outcome == 'success'
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ This repository is home to various Dart packages under the [dart.dev](https://pu
| Package | Description | Version |
|---|---|---|
| [args](pkgs/args/) | Library for defining parsers for parsing raw command-line arguments into a set of options and values. | [![pub package](https://img.shields.io/pub/v/args.svg)](https://pub.dev/packages/args) |
| [characters](pkgs/characters/) | String replacement with operations that are Unicode/grapheme cluster aware. | [![pub package](https://img.shields.io/pub/v/characters.svg)](https://pub.dev/packages/characters) |

## Publishing automation

Expand Down
4 changes: 4 additions & 0 deletions pkgs/characters/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.dart_tool/
.packages
pubspec.lock
doc/api/
6 changes: 6 additions & 0 deletions pkgs/characters/AUTHORS
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Below is a list of people and organizations that have contributed
# to the Dart project. Names should be added to the list like so:
#
# Name/Organization <email address>

Google LLC
67 changes: 67 additions & 0 deletions pkgs/characters/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
## 1.3.1

* Fixed README rendering on pub.dev and API docs.
* Require Dart `^3.4.0`.
* Move to `dart-lang/core` monorepo.

## 1.3.0

* Updated to use Unicode 15.0.0.

## 1.2.1

* Update the value of the pubspec `repository` field.

## 1.2.0

* Fix `Characters.where` which unnecessarily did the iteration and test twice.
* Adds `Characters.empty` constant and makes `Characters("")` return it.
* Changes the argument type of `Characters.contains` to (covariant) `String`.
The implementation still accepts `Object?`, so it can be cast to
`Iterable<Object?>`, but you get warned if you try to call directly with a
non-`String`.

## 1.1.0

* Stable release for null safety.
* Added `stringBeforeLength` and `stringAfterLength` to `CharacterRange`.
* Added `CharacterRange.at` constructor.
* Added `getRange(start, end)` and `characterAt(pos)` to `Characters`
as alternative to `.take(end).skip(start)` and `getRange(pos, pos + 1)`.
* Change some positional parameter names from `other` to `characters`.

## 1.0.0

* Core APIs deemed stable; package version set to 1.0.0.
* Added `split` methods on `Characters` and `CharacterRange`.

## 0.5.0

* Change [codeUnits] getter to [utf16CodeUnits] which returns an iterable.
This avoids leaking that the underlying string has efficient UTF-16
code unit access in the API, and allows the same interface to be
just as efficiently implemented on top of UTF-8.

## 0.4.0

* Added an extension method on `String` to allow easy access to the `Characters`
of the string:

```dart
print('The first character is: ' + myString.characters.first)
```

* Updated Dart SDK dependency to Dart 2.6.0

## 0.3.1

* Added small example in `example/main.dart`
* Enabled pedantic lints and updated code to resolve issues.

## 0.3.0

* Updated API which does not expose the underlying string indices.

## 0.1.0

* Initial release
27 changes: 27 additions & 0 deletions pkgs/characters/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Copyright 2019, the Dart project authors.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* 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.
* Neither the name of Google LLC 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
OWNER 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.
133 changes: 133 additions & 0 deletions pkgs/characters/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
[![Build Status](https://github.com/dart-lang/core/actions/workflows/characters.yaml/badge.svg)](https://github.com/dart-lang/core/actions/workflows/characters.yaml)
[![pub package](https://img.shields.io/pub/v/characters.svg)](https://pub.dev/packages/characters)
[![package publisher](https://img.shields.io/pub/publisher/characters.svg)](https://pub.dev/packages/characters/publisher)

[`Characters`][Characters] are strings viewed as
sequences of **user-perceived character**s,
also known as [Unicode (extended) grapheme clusters][Grapheme Clusters].

The [`Characters`][Characters] class allows access to
the individual characters of a string,
and a way to navigate back and forth between them
using a [`CharacterRange`][CharacterRange].

## Unicode characters and representations

There is no such thing as plain text.

Computers only know numbers,
so any "text" on a computer is represented by numbers,
which are again stored as bytes in memory.

The meaning of those bytes are provided by layers of interpretation,
building up to the *glyph*s that the computer displays on the screen.

| Abstraction | Dart Type | Usage | Example |
| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| Bytes | [`ByteBuffer`][ByteBuffer],<br />[`Uint8List`][Uint8List] | Physical layout: Memory or network communication. | `file.readAsBytesSync()` |
| [Code units][] | [`Uint8List`][Uint8List] (UTF&#x2011;8)<br />[`Uint16List`][Uint16List], [`String`][String] (UTF&#x2011;16) | Standard formats for<br /> encoding code points in memory.<br />Stored in memory using one (UTF&#x2011;8) or more (UTF&#x2011;16) bytes. One or more code units encode a code point. | `string.codeUnits`<br />`string.codeUnitAt(index)`<br />`utf8.encode(string)` |
| [Code points][] | [`Runes`][Runes] | The Unicode unit of meaning. | `string.runes` |
| [Grapheme Clusters][] | [`Characters`][Characters] | Human perceived character. One or more code points. | `string.characters` |
| [Glyphs][] | | Visual rendering of grapheme clusters. | `print(string)` |

A Dart `String` is a sequence of UTF-16 code units,
just like strings in JavaScript and Java.
The runtime system decides on the underlying physical representation.

That makes plain strings inadequate
when needing to manipulate the text that a user is viewing, or entering,
because string operations are not working at the grapheme cluster level.

For example, to abbreviate a text to, say, the 15 first characters or glyphs,
a string like "A 🇬🇧 text in English"
should abbreviate to "A 🇬🇧 text in Eng&mldr; when counting characters,
but will become "A 🇬🇧 text in &mldr;"
if counting code units using [`String`][String] operations.

Whenever you need to manipulate strings at the character level,
you should be using the [`Characters`][Characters] type,
not the methods of the [`String`][String] class.

## The Characters class

The [`Characters`][Characters] class exposes a string
as a sequence of grapheme clusters.
All operations on [`Characters`][Characters] operate
on entire grapheme clusters,
so it removes the risk of splitting combined characters or emojis
that are inherent in the code-unit based [`String`][String] operations.

You can get a [`Characters`][Characters] object for a string using either
the constructor [`Characters(string)`][Characters constructor]
or the extension getter `string.characters`.

At its core, the class is an [`Iterable<String>`][Iterable]
where the element strings are single grapheme clusters.
This allows sequential access to the individual grapheme clusters
of the original string.

On top of that, there are operations mirroring the operations
of [`String`][String] that are not index, code-unit or code-point based,
like [`startsWith`][Characters.startsWith]
or [`replaceAll`][Characters.replaceAll].
There are some differences between these and the [`String`][String] operations.
For example the replace methods only accept characters as pattern.
Regular expressions are not grapheme cluster aware,
so they cannot be used safely on a sequence of characters.

Grapheme clusters have varying length in the underlying representation,
so operations on a [`Characters`][Characters] sequence cannot be index based.
Instead, the [`CharacterRange`][CharacterRange] *iterator*
provided by [`Characters.iterator`][Characters.iterator]
has been greatly enhanced.
It can move both forwards and backwards,
and it can span a *range* of grapheme cluster.
Most operations that can be performed on a full [`Characters`][Characters]
can also be performed on the grapheme clusters
in the range of a [`CharacterRange`][CharacterRange].
The range can be contracted, expanded or moved in various ways,
not restricted to using [`moveNext`][CharacterRange.moveNext],
to move to the next grapheme cluster.

Example:

```dart
// Using String indices.
String? firstTagString(String source) {
var start = source.indexOf('<') + 1;
if (start > 0) {
var end = source.indexOf('>', start);
if (end >= 0) {
return source.substring(start, end);
}
}
return null;
}

// Using CharacterRange operations.
Characters? firstTagCharacters(Characters source) {
var range = source.findFirst('<'.characters);
if (range != null && range.moveUntil('>'.characters)) {
return range.currentCharacters;
}
return null;
}
```

[ByteBuffer]: https://api.dart.dev/dart-typed_data/ByteBuffer-class.html "ByteBuffer class"
[CharacterRange.moveNext]: https://pub.dev/documentation/characters/latest/characters/CharacterRange/moveNext.html "CharacterRange.moveNext"
[CharacterRange]: https://pub.dev/documentation/characters/latest/characters/CharacterRange-class.html "CharacterRange class"
[Characters constructor]: https://pub.dev/documentation/characters/latest/characters/Characters/Characters.html "Characters constructor"
[Characters.iterator]: https://pub.dev/documentation/characters/latest/characters/Characters/iterator.html "CharactersRange get iterator"
[Characters.replaceAll]: https://pub.dev/documentation/characters/latest/characters/Characters/replaceAll.html "Characters.replaceAlle"
[Characters.startsWith]: https://pub.dev/documentation/characters/latest/characters/Characters/startsWith.html "Characters.startsWith"
[Characters]: https://pub.dev/documentation/characters/latest/characters/Characters-class.html "Characters class"
[Code Points]: https://unicode.org/glossary/#code_point "Unicode Code Point"
[Code Units]: https://unicode.org/glossary/#code_unit "Unicode Code Units"
[Glyphs]: https://unicode.org/glossary/#glyph "Unicode Glyphs"
[Grapheme Clusters]: https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries "Unicode (Extended) Grapheme Cluster"
[Iterable]: https://api.dart.dev/dart-core/Iterable-class.html "Iterable class"
[Runes]: https://api.dart.dev/dart-core/Runes-class.html "Runes class"
[String]: https://api.dart.dev/dart-core/String-class.html "String class"
[Uint16List]: https://api.dart.dev/dart-typed_data/Uint16List-class.html "Uint16List class"
[Uint8List]: https://api.dart.dev/dart-typed_data/Uint8List-class.html "Uint8List class"
5 changes: 5 additions & 0 deletions pkgs/characters/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
include: package:dart_flutter_team_lints/analysis_options.yaml

analyzer:
errors:
prefer_single_quotes: ignore
Loading
Loading