{"id":20082178,"url":"https://github.com/exercism/elixir-representer","last_synced_at":"2026-03-10T01:31:24.260Z","repository":{"id":39863312,"uuid":"234887410","full_name":"exercism/elixir-representer","owner":"exercism","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-16T06:37:26.000Z","size":179,"stargazers_count":11,"open_issues_count":4,"forks_count":7,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-11-16T08:21:11.323Z","etag":null,"topics":["community-contributions-accepted","exercism-representer","exercism-tooling","maintained"],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exercism.png","metadata":{"funding":{"github":["exercism"],"custom":["https://exercism.org/donate"]},"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-01-19T11:17:47.000Z","updated_at":"2025-11-16T06:37:29.000Z","dependencies_parsed_at":"2024-01-08T06:43:04.494Z","dependency_job_id":"f522c39c-b0a6-4cbd-a419-02fa6c9d333d","html_url":"https://github.com/exercism/elixir-representer","commit_stats":{"total_commits":91,"total_committers":11,"mean_commits":8.272727272727273,"dds":0.6703296703296704,"last_synced_commit":"990d9d4ecfc3c73491f70dbcaeb27171beb7d5c5"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/exercism/elixir-representer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Felixir-representer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Felixir-representer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Felixir-representer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Felixir-representer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exercism","download_url":"https://codeload.github.com/exercism/elixir-representer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exercism%2Felixir-representer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30320886,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T20:05:46.299Z","status":"ssl_error","status_checked_at":"2026-03-09T19:57:04.425Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["community-contributions-accepted","exercism-representer","exercism-tooling","maintained"],"created_at":"2024-11-13T15:42:17.836Z","updated_at":"2026-03-10T01:31:24.228Z","avatar_url":"https://github.com/exercism.png","language":"Elixir","readme":"# Representer\n\nTo understand the purpose of this project in the context of the exercism submission platform, there are a few documents to review:\n\n- [Introduction to Representers](https://github.com/exercism/docs/tree/main/building/tooling/representers)\n- [Creating a Representer](https://github.com/exercism/docs/blob/main/building/tooling/representers/creating-from-scratch.md)\n- [The Representer Interface](https://github.com/exercism/docs/blob/main/building/tooling/representers/interface.md)\n- [How to normalize representations for the highest efficiency](https://github.com/exercism/docs/blob/main/building/tooling/representers/normalization.md)\n- [Docker image build and deployment](https://github.com/exercism/docs/blob/main/building/tooling/representers/docker.md)\n\n## Why\n\nCode analysis is tough, and the programming required to create them is complex.  Initially the goal of the exercism platform was to provide automated analysis on a wide scale.  But while this proved to be successful at a small scale (for now), it also served to prove how complex they are.\n\nSo rather than attempting to provide automated analysis, we attempt to normalize submissions to distill the solutions to the general approaches taken, provide feedback on the normalized subset, then memoize the feedback so that when a recongnized solution pattern is submitted, feedback can be replayed from the previous submissions.\n\n## Normalization\n\nThe role of this service is to take a code submission, and normalize it in the following ways:\n\n- format using `mix format`, enforcing _do...end_ blocks\n- removing comments\n- normalizing `@doc` and `@moduledoc` documentation\n- normalize module, variable, function names and maintain a mapping from the original to the placeholder names\n  - this is done by analyzing the source using the ast representation to find the names to replace\n  - then doing a textual find/replace on the source using the mapping\n\n## Escript\n\n\u003e `lib/representer/cli.ex`\n\nThis is the entrypoint for an escript to process the relevant files from the command line.\n\n## Git submodule\n\nSome of the tests depend on the `/elixir` git submodule. Run `git submodule update --init --recursive` once after cloning this repo to also get the submodule.\n\nTo check at which commit the submodule is, run `git submodule`. To update the submodule to the newest commit, run `git submodule update --remote --merge`.\n\nThe submodule is used only by the tests.\n","funding_links":["https://github.com/sponsors/exercism","https://exercism.org/donate"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexercism%2Felixir-representer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexercism%2Felixir-representer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexercism%2Felixir-representer/lists"}