{"id":17270206,"url":"https://github.com/fusion/reasonable-fidelity","last_synced_at":"2026-05-17T19:33:37.621Z","repository":{"id":66522871,"uuid":"137983476","full_name":"Fusion/reasonable-fidelity","owner":"Fusion","description":"Replay recorded web sessions, check for fidelity","archived":false,"fork":false,"pushed_at":"2020-04-07T02:39:12.000Z","size":1371,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T20:39:35.856Z","etag":null,"topics":["automation","ocaml","reasonml","regression-tests","testing"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fusion.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-06-20T05:18:47.000Z","updated_at":"2020-04-07T02:39:15.000Z","dependencies_parsed_at":"2023-02-28T01:01:21.407Z","dependency_job_id":null,"html_url":"https://github.com/Fusion/reasonable-fidelity","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Fusion/reasonable-fidelity","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fusion%2Freasonable-fidelity","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fusion%2Freasonable-fidelity/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fusion%2Freasonable-fidelity/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fusion%2Freasonable-fidelity/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fusion","download_url":"https://codeload.github.com/Fusion/reasonable-fidelity/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fusion%2Freasonable-fidelity/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33151768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"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":["automation","ocaml","reasonml","regression-tests","testing"],"created_at":"2024-10-15T08:19:01.281Z","updated_at":"2026-05-17T19:33:37.615Z","avatar_url":"https://github.com/Fusion.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reasonable Fidelity\n\n## What?\n\nThe idea behind this app is to record whatever actions you would when testing a  \nweb app, then replay them later and compare their level of fidelity. \nAttributes/files you do not wish to compare can be added to 'ignore' files.\n\n### How?\n\n- Open your favorite browswer (let's pretend it's Chrome)\n- Open the developer console\n- Open the 'Network' tab and select 'Preserve logs'\n- Interact with application\n- Right click the developer console, select 'Save as HAR with content'\n- Use this file to replay and compare\n- Fine tune ignored attributes in config/ directory\n\n### Some Features\n\n- CSV or full text output\n- Multiple configuration environments\n- Cookies or dedicated token\n- Plugins (written in Python)\n- ...\n\n## TODO\n\n- more advanced attribute extractors\n- more configurable login\n- Point Free composition!\n\n## Using\n\n```\nValid Arguments:\n\nhelp:\n    display help\n\nsanity:\n    check requirements \u0026 help explain issues\n\nrun:\n    run tests\n    options:\n        --csv: output csv data rather than plain text\n         -source \u003cfile_name\u003e: specify alternate .har file\n         -config \u003cdir_name\u003e: specify alternate config directory\n         -forcelogin: attempt log in to service rather than trust cookies/token (experimental!)\n\nmodified:\n    show which lines were changed from the reference capture\n\ntimestamp \u003cstartedDateTime\u003e \u003ctime\u003e:\n    return a timestamp for 'start_at'/'stop_at' configuration\n\nedit \u003cfilename\u003e:\n    edit har file -- for now, mark actions for deletion\n\nreset:\n    re-create default configuration file\n```\n\n## Building\n\nFrom scratch, really...\n\nOS X\n```bash\nbrew install opam\n```\nLinux\n```bash\nsudo apt install m4\nwget https://raw.github.com/ocaml/opam/master/shell/opam_installer.sh -O - | sh -s /usr/local/bin\n```\nThen (Common)\n```bash\nopam init\nopam update \u0026\u0026 opam switch 4.09.0\n```\n\nTo install dependencies .opam file from dune-project:\n\n```bash\ndune build @install\n```\n\n### Curses\n\nThe built-in editor relies on ncurses (v5). On some Linux distros, you may have to run `make prepare_curses`\n\n### More building...\n\nSame goes for lymp that is running cold that's a bit too... dated.\n\nRun:\n\n```bash\nmake prepare\n```\n\nWhen everything is built properly, we will want to create symlinks to clean stubs:\n\n```bash\nsudo bash -c 'for lib in ~/.opam/default/lib/stublibs/*; do libname=\"$(basename $lib)\"; ln -s $lib /usr/local/lib/${libname/dll/lib}; done'\n```\n\n## Specifics of this code\n\nMy first ReasonML app! So, yeah, it's not perfect,\n\n### Things to keep in mind if this is your first use of Lwt promises\n\n- Lwt is our Promises library\n- Lwt comes with infix operators:\n- `\u003e\u003e=` equivalent to Lwt.bind\n- `\u003e|=` equivalent to Lwd.map (right side does not return a promise)\n- '=\u003c\u003c` and `=|\u003c` are reversed versions\n\n### Misc Notes\n\nParallel queries\n\n- We can use Lwt.run(Lwt.join(...\n- execute.get is good\n- we could run up to n threads in parallel\n- ...or until we meet execute.post\n- All pending threads to be stored in a list...\n- Orchestrated in execute.get?\n- Q: what to do about pause when \u003e 0.?\n- Do something about non-csv output, which is broken up\n\n- {action, url, query_string, post_data)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffusion%2Freasonable-fidelity","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffusion%2Freasonable-fidelity","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffusion%2Freasonable-fidelity/lists"}