{"id":25275912,"url":"https://github.com/ronanboiteau/NormEZ","last_synced_at":"2025-10-27T13:31:07.520Z","repository":{"id":41055364,"uuid":"114534625","full_name":"ronanboiteau/NormEZ","owner":"ronanboiteau","description":"Coding-style checker for Epitech students. This program analyzes your C source files for Epitech coding-style violations.","archived":false,"fork":false,"pushed_at":"2022-03-14T10:41:02.000Z","size":1197,"stargazers_count":73,"open_issues_count":2,"forks_count":20,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-05-16T18:55:13.513Z","etag":null,"topics":["coding-style","epitech","moulinette","norme","norminette"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ronanboiteau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-12-17T12:33:35.000Z","updated_at":"2023-05-16T18:55:13.514Z","dependencies_parsed_at":"2022-09-20T22:44:24.800Z","dependency_job_id":null,"html_url":"https://github.com/ronanboiteau/NormEZ","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronanboiteau%2FNormEZ","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronanboiteau%2FNormEZ/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronanboiteau%2FNormEZ/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ronanboiteau%2FNormEZ/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ronanboiteau","download_url":"https://codeload.github.com/ronanboiteau/NormEZ/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238498469,"owners_count":19482445,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coding-style","epitech","moulinette","norme","norminette"],"created_at":"2025-02-12T15:36:49.157Z","updated_at":"2025-10-27T13:31:06.990Z","avatar_url":"https://github.com/ronanboiteau.png","language":"Ruby","funding_links":[],"categories":["Epitech Tools"],"sub_categories":["Language related"],"readme":"[\u003cimg alt=\"NormEZ logo\" src=\"/artwork/normez-logo.png\" width=\"400px\"/\u003e](https://github.com/ronanboiteau/NormEZ)\n\nCoding-style checker for Epitech students. This program analyzes your C and Haskell source files for [Epitech C coding-style] and [Epitech Haskell coding-style] violations.\n\n*[French] Moulinette de norme pour les étudiants d'Epitech. Cette norminette cherche des erreurs de [norme C Epitech][Epitech C coding-style] et de [norme Haskell Epitech][Epitech Haskell coding-style] dans vos fichers de code source C et Haskell.*\n\n## Table of contents\n\n* __[Getting started](#getting-started)__\n  * [Requirements](#requirements)\n  * [How to use NormEZ?](#how-to-use-normez)\n* __[Options](#options)__\n* __[Features](#features)__\n* __[To-do](#to-do)__\n* __[Bugs](#bugs)__\n  * [Known issues](#known-issues)\n  * [Report a bug](#report-a-bug)\n* __[Getting involved](#getting-involved)__\n  * [Share](#share)\n  * [Contribute](#contribute)\n  * [Contributors](#contributors)\n\n## Getting started\n\n### Requirements\n\n - [Ruby](https://www.ruby-lang.org/en/)\n\n#### Installing Ruby on Fedora (Epitech's 2017 dump)\n\n```sh\nsudo dnf install ruby\n```\n\n### How to use NormEZ?\n\n1. Clone the repository:\n   ```sh\n   git clone https://github.com/ronanboiteau/NormEZ\n   ```\n2. Run `make install` to install NormEZ or `make uninstall` to uninstall it\n3. Run NormEZ:\n   ```sh\n   normez\n   ```\n4. NormEZ will recursively search for `.c` and `.h` files to analyze in your current directory.\n5. You can also pass specific files to check as argument:\n   ```sh\n   normez src/*.c src/*.h\n   ```\n\n## Options\n\n - `-u` or `--no-update`: don't check for NormEZ updates\n - `-f` or `--ignore-files`: ignore forbidden files\n - `-m` or `--ignore-functions`: ignore forbidden functions\n - `-i` or `--ignore-all`: ignore forbidden files \u0026 forbidden functions (same as `-fm`)\n - `-c` or `--colorless`: disable all styling on output\n\n## Features\n\nCoding-style violations checked by NormEZ.\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e = major infraction\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e = minor infraction\u003cbr/\u003e\n\n### C\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Lines with too many columns (\u003e 80).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Forbidden files: every regular file that does not match `Makefile`, `*.c` or `*.h` (ex: `*.o`, `*.gch`, `bsq`, ...) \u0026 that is not mentioned in a [`.gitignore`](https://git-scm.com/docs/gitignore) file located in your current working directory.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e *[Not exhaustive]* Too broad filenames (ex: `string.c`, `algo.c`, `my_algorithm.c`, ...).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Missing or corrupted header in sources files (`.c`), headers (`.h`) \u0026 `Makefile`s.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Functions that contain more than 20 lines.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Several semicolon-separated assignments on the same line.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e *[Not exhaustive]* Forbidden functions (`printf()`, `dprintf()`, `atoi()`, `memcpy()`, `scanf()`, `strlen()`...).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Trailing space(s) and/or tabulation(s) at the end of a line.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Filenames that don't respect the [snake_case] naming convention.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Condition and assignment on the same line.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Directory names that don't respect the [snake_case] naming convention.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Too many functions in file (\u003e 5).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Functions with no parameters that don't take void as argument in their declaration.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Functions with too many arguments (\u003e 4).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Space(s) in indentation.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Missing space after keyword.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Misplaced pointer symbol(s).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Macros used for constants.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Macros containing multiple assignments.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Too many `else if` statements.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Misplaced comments.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Missing space after comma.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Missing space around binary or ternary operator (`=`, `==`, `!=`, `\u003c=`, `\u003e=`, `\u0026\u0026`, `||`, `+=`, `-=`, `*=`, `/=`, `%=`, `\u0026=`, `^=`, `|=`, `|`, `^`, `\u003e\u003e`, `\u003c\u003c`, `\u003e\u003e=`, `\u003c\u003c=`).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Extra space after unary operators (`!`, `sizeof`, `++`, `--`).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Forbidden keyword (`goto`).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Functions must be separated by *one and only one* empty line in `.c` files.\u003cbr/\u003e\n\n### Haskell\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Lines with too many columns (\u003e 80).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Functions that contain more than 10 lines.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Filenames that don't respect the [UpperCamelCase](https://en.wikipedia.org/wiki/Camel_case) naming convention.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Imbedded `if` blocks.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Mutable variables used.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Missing type signatures.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Useless `do`.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e *[Not exhaustive]* Guards that should be pattern matching.\u003cbr/\u003e\n\n## To-do\n\nCoding-style violations ***NOT YET*** checked by NormEZ.\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e = major infraction\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e = minor infraction\u003cbr/\u003e\n\n### C\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Typedef not ending with `_t`.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Identifiers that don't respect the [snake_case] naming convention.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Macros, global constants or enums that don't respect the SNAKE_CASE convention (uppercase [snake_case]).\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Function prototypes, typedefs, global variables, macros or static inline functions in `.c` source files.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Single-letter identifiers shouldn't be named `l` (lowercase `L`) or `o` to avoid confusions.\u003c/br\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Nested conditonal branchings (depth \u003e 2).\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Header files not protected against double inclusion\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Wrong indentation level in `.c` and `.h` files.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Wrong indentation level in pre-processor directives.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Extra space between function name and opening parenthesis.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Misplaced curly brackets.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Multiple variables declared on the same line.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Variable not declared at the beginning of function.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Missing empty line after variable declarations.\u003cbr/\u003e\n\u003cimg alt=\"Minor infraction\" src=\"/artwork/direction_arrow_green_down.png\" width=\"12\" height=\"12\"/\u003e Extra empty lines in function.\u003cbr/\u003e\n\n### Haskell\n\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Naming identifiers according to the [lowerCamelCase](https://en.wikipedia.org/wiki/Camel_case) convention.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Forbidden language extentions.\u003cbr/\u003e\n\u003cimg alt=\"Major infraction\" src=\"/artwork/direction_arrow_red_up.png\" width=\"12\" height=\"12\"/\u003e Contents of delivery folder\u003cbr/\u003e\n\n## Bugs\n\n### Known issues\n\n - NormEZ doesn't make the difference between strings/comments \u0026 code. Examples: a commented forbidden function will be flagged, as well as a commented `;` (multiple assignments on the same line), etc.\n - The check for functions containing more than 20 lines doesn't work yet with the new coding style v3.1. [See related issue.](https://github.com/ronanboiteau/NormEZ/issues/20)\n - For Haskell, the check of guards that should be expressed as pattern matching is not very accurate, it flags guards that use only direct comparisons (or `==`)\n\n### Report a bug\n\nIf you found a bug that isn't listed above in as a known issue, feel free to [create a GitHub issue](https://github.com/ronanboiteau/NormEZ/issues).\n\n## Getting involved\n\n### Share\n\n - Enjoying NormEZ? Leave it [a star](https://github.com/ronanboiteau/NormEZ/stargazers) to show your support :)\n - And share the link to this repository with your friends at Epitech!\n\n### Contribute\n\nYou want to add awesome features to NormEZ? Here's how:\n 1. [Fork](https://github.com/ronanboiteau/NormEZ/network/members) NormEZ\n 2. Commit \u0026 push a new feature to the forked repository\n 3. Open a [pull request](https://github.com/ronanboiteau/NormEZ/pulls) so I can merge your work into this repository :)\n\n### Contributors\n\n[Here](https://github.com/ronanboiteau/NormEZ/graphs/contributors) is the list of NormEZ's contributors. Thanks to everyone who helped developing this project!\n\n\u003c!-- Links --\u003e\n[Epitech C coding-style]: /epitech_coding_styles_pdf/epitech_c_coding_style.pdf\n[Epitech Haskell coding-style]: /epitech_coding_styles_pdf/epitech_haskell_coding_style.pdf\n[snake_case]: https://en.wikipedia.org/wiki/Snake_case\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fronanboiteau%2FNormEZ","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fronanboiteau%2FNormEZ","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fronanboiteau%2FNormEZ/lists"}