Detect and fix typos with codespell

Hello,

Using codespell, I can detect a large number of typos in various Exercism repos, most of which are true positives. Should I create MRs to fix them?

Example in problem-specifications (Wrong detections omitted):

./exercises/triangle/canonical-data.json:12: disscussion ==>
 discussion
./exercises/book-store/canonical-data.json:7: implementors ==> implementers
./exercises/grep/canonical-data.json:45: tast ==> taste, test, task
./exercises/grep/canonical-data.json:78: tast ==> taste, test, task
./exercises/grep/canonical-data.json:89: tast ==> taste, test, task
./exercises/grep/canonical-data.json:281: tast ==> taste, test, task
./exercises/grep/canonical-data.json:407: tast ==> taste, test, task
./exercises/anagram/canonical-data.json:152: patter ==> pattern
./exercises/roman-numerals/canonical-data.json:74: occurence ==> occurrence
./exercises/roman-numerals/canonical-data.json:126: occurence ==> occurrence
./exercises/roman-numerals/canonical-data.json:167: occurence ==> occurrence
./exercises/roman-numerals/canonical-data.json:198: occurence ==> occurrence
./exercises/roman-numerals/canonical-data.json:229: occurence ==> occurrence
./exercises/killer-sudoku-helper/description.md:23: followings ==> following
./exercises/killer-sudoku-helper/description.md:23: followings ==> following
./exercises/killer-sudoku-helper/description.md:34: continguous ==> contiguous

Those are all in JSON data. If they don’t show up on the website, I don’t know that it’s worth the churn.

This is the example in python repos for a more generic example. The tool works quite universally, however I can focus on the places that are worth fixing the most.

Typos
./CONTRIBUTING.md:173: ouputs ==> outputs
./CONTRIBUTING.md:273: cannonical ==> canonical
./CONTRIBUTING.md:274: cannonical ==> canonical
./CONTRIBUTING.md:275: cannonical ==> canonical
./concepts/lists/about.md:332: Ned ==> Need, End, Nod
./concepts/lists/about.md:332: ned ==> need, end, nod
./concepts/lists/about.md:455: ned ==> need, end, nod
./concepts/class-inheritance/about.md:4: re-use ==> reuse
./concepts/classes/links.json:20: Youre ==> Your, You're
./concepts/classes/about.md:121: seperate ==> separate
./concepts/list-methods/about.md:240: Ned ==> Need, End, Nod
./concepts/list-methods/about.md:240: ned ==> need, end, nod
./concepts/list-methods/about.md:251: ned ==> need, end, nod
./concepts/function-arguments/introduction.md:7: Paramater ==> Parameter
./concepts/function-arguments/about.md:7: Paramater ==> Parameter
./concepts/functions/about.md:5: build-in ==> built-in
./concepts/functions/about.md:379: build-in ==> built-in
./concepts/loops/links.json:4: Ned ==> Need, End, Nod
./concepts/binary-octal-hexadecimal/introduction.md:8: hexidecimal ==> hexadecimal
./concepts/binary-octal-hexadecimal/about.md:193: hexidecimal ==> hexadecimal
./concepts/basics/links.json:40: Ned ==> Need, End, Nod
./concepts/basics/introduction.md:6: everythings ==> everything
./concepts/basics/introduction.md:130: everythings ==> everything
./concepts/basics/about.md:5: everythings ==> everything
./concepts/basics/about.md:172: mis-match ==> mismatch
./concepts/basics/about.md:292: everythings ==> everything
./concepts/functools/introduction.md:15: lastest ==> latest, last
./concepts/functools/introduction.md:23: preform ==> perform
./concepts/functools/about.md:15: lastest ==> latest, last
./concepts/functools/about.md:53: preform ==> perform
./concepts/functools/about.md:196: becuse ==> because
./concepts/conditionals/introduction.md:59: Boolen ==> Boolean
./docs/TRACEBACKS.md:418: divison ==> division
./docs/TRACEBACKS.md:418: divison ==> division
./docs/TRACEBACKS.md:490: passsed ==> passed
./docs/ABOUT.md:6: everythings ==> everything
./docs/ABOUT.md:45: everythings ==> everything
./exercises/practice/transpose/transpose_test.py:117: EASER ==> EASIER, ERASER
./exercises/practice/transpose/transpose_test.py:117: SER ==> SET
./exercises/practice/grep/grep_test.py:31: tast ==> taste, test, task
./exercises/practice/grep/grep_test.py:62: tast ==> taste, test, task
./exercises/practice/grep/grep_test.py:68: tast ==> taste, test, task
./exercises/practice/grep/grep_test.py:181: tast ==> taste, test, task
./exercises/practice/grep/grep_test.py:287: tast ==> taste, test, task
./exercises/practice/anagram/anagram_test.py:69: patter ==> pattern
./exercises/practice/rational-numbers/rational_numbers.py:2:
 numer ==> number
./exercises/practice/rational-numbers/rational_numbers.py:3:
 numer ==> number
./exercises/practice/rational-numbers/rational_numbers.py:7:
 numer ==> number
./exercises/practice/rational-numbers/rational_numbers.py:7:
 numer ==> number
./exercises/practice/rational-numbers/rational_numbers.py:10: numer ==> number
./exercises/practice/paasio/paasio_test.py:279: infinte ==> infinite
./exercises/concept/cater-waiter/sets_test.py:61: iputs ==> inputs
./exercises/concept/cater-waiter/sets_test_data.py:202: Presse ==> Pressed, Press
./exercises/concept/locomotive-engineer/locomotive_engineer.py:16: parm ==> param, pram, parma
./exercises/concept/locomotive-engineer/locomotive_engineer.py:17: parm ==> param, pram, parma
./exercises/concept/ellens-alien-game/classes_test.py:26: thst ==> that
./reference/Python_Track_Exercise_Tree.svg:26: oT ==> to, of, or, not
./reference/Python_Track_Exercise_Tree.svg:1215: Definied ==> Defined
./reference/track_exercises_overview.md:220: Litte ==> Little
./reference/track_exercises_overview.md:221: Litte ==> Little
./reference/track_exercises_overview.md:362: Definied ==> Defined
./reference/concept-exercise-mapping.md:401: recieve ==> receive
./reference/concept-exercise-mapping.md:408: operatons ==> operations
./reference/concepts/default_arguments.md:5: initally ==> initially
./reference/concepts/string_translation.md:5: inital ==> initial
./reference/concepts/type_hinting.md:5: neccessary ==> necessary
./reference/concepts/instance_methods.md:7: uneeded ==> unneeded, unheeded, needed
./reference/concepts/duck_typing.md:5: wit ==> with
./reference/concepts/instance_properties.md:5: rquires ==> requires
./reference/concepts/return_value.md:10: expicit ==> explicit
./reference/concepts/return_value.md:10: statment ==> statement
./reference/concepts/return_value.md:11: statment ==> statement
./reference/concepts/initialization.md:5: instatiation ==> instantiation
./reference/concepts/instance_attributes.md:5: rquires ==> requires
./reference/concepts/constructor.md:6: initalization ==> initialization
./reference/concepts/string_splitting.md:6: seperators ==> separators
./reference/concepts/slicing.md:7: becase ==> because
./reference/concepts/builtin_types/frozenset.md:5: intialization ==> initialization
./reference/concepts/builtin_types/list.md:3: homogenous ==>
 homogeneous
./reference/exercise-concepts/reverse-string.md:19: becase ==> because
./reference/exercise-concepts/reverse-string.md:34: neccessary ==> necessary
./reference/exercise-concepts/leap.md:21: Comparision ==> Comparison
./reference/exercise-concepts/leap.md:21: comparision ==> comparison
./reference/exercise-concepts/rna-transcription.md:19: inital ==> initial
./reference/exercise-concepts/rna-transcription.md:22: expicit ==> explicit
./reference/exercise-concepts/rna-transcription.md:22: statment ==> statement
./reference/exercise-concepts/robot-simulator.md:70: instatiation ==> instantiation
./reference/exercise-concepts/robot-simulator.md:71: statment ==> statement
./reference/exercise-concepts/robot-simulator.md:79: rquires ==> requires
./reference/exercise-concepts/robot-simulator.md:82: initally ==> initially
./reference/exercise-concepts/matrix.md:56: initalization ==> initialization
./reference/exercise-concepts/matrix.md:62: rquires ==> requires
./reference/exercise-concepts/matrix.md:66: returnd ==> returned
./reference/exercise-concepts/matrix.md:66: reccommended ==>
 recommended
./reference/exercise-concepts/matrix.md:74: equivelent ==> equivalent
./reference/exercise-concepts/matrix.md:77: seperators ==> separators
./reference/exercise-concepts/phone-number.md:43: uneeded ==> unneeded, unheeded, needed
./reference/exercise-concepts/hamming.md:44: wit ==> with
./bin/generate_tests.py:141: hexidecimal ==> hexadecimal

It depends on the repo. I know some repos are not interested in small fixes like that that aren’t user visible on the site. Other repos aren’t maintained and it might not be worth bugging Erik for non-user visible changes. There might be some repos more open to that, but, once again, typos that aren’t user visible aren’t very high value contributions and are often more cost than benefit.

@tqa236 – Thank you for the go-through, but the Python repo is not interested in a “mass spell check” with PRs.

Many of the “errors” you’ve listed are proper names, variable names not subject to spelling, formatting needed for a particular purpose, data pulled from canonical data (as in not originating from the Python repo), or (in the case of everything in the ./reference/ directory), not public-facing and mostly not maintained.

I don’t know how other maintainers feel/what they’d like - but for Python, we prefer to do things like Spell checking in a different manner/context.

I have never used codespell, but I am open to fixing a list of typos in the public-facing portion of the C++ track. That would be everything in a .doc directory, /docs, and the blurb lines in the json files.

Did I miss anything?

Hello @vaeng,

I created a PR to fix the suggested doc here