{"id":15750269,"url":"https://github.com/objarni/pam","last_synced_at":"2026-02-23T02:31:49.922Z","repository":{"id":142954218,"uuid":"195533693","full_name":"objarni/pam","owner":"objarni","description":"Python ApprovalTests Makefile (PAM)","archived":false,"fork":false,"pushed_at":"2019-07-07T16:22:59.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-27T16:36:29.844Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Makefile","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/objarni.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}},"created_at":"2019-07-06T11:49:53.000Z","updated_at":"2019-07-07T16:23:01.000Z","dependencies_parsed_at":"2023-04-29T12:46:26.446Z","dependency_job_id":null,"html_url":"https://github.com/objarni/pam","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/objarni/pam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/objarni%2Fpam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/objarni%2Fpam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/objarni%2Fpam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/objarni%2Fpam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/objarni","download_url":"https://codeload.github.com/objarni/pam/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/objarni%2Fpam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29735759,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T02:24:00.660Z","status":"ssl_error","status_checked_at":"2026-02-23T02:22:56.087Z","response_time":90,"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":[],"created_at":"2024-10-04T06:23:13.326Z","updated_at":"2026-02-23T02:31:49.896Z","avatar_url":"https://github.com/objarni.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"pam\n===\n**P**ython **A**pprovalTests **M**akefile and utility script **pam.py**.\n\nA minimal Makefile to ease practicing Approval Testing in Python.\n\n\nUsage\n-----\nGiven files **rabbit.py** and **test_rabbit.py** with content as below, copied to **pam/dut** folder, cloned from github, then\nthe expected behaviour is something like this:\n\n    $ pwd\n    /home/olof/github/pam\n\n    $ cat dut/rabbit.py\n\n    def fn(x):\n        return x * 2\n\n    $ cat dut/test_rabbit.py\n\n    from pam import verify\n    from rabbit import fn\n\n\n    def test():\n        args = [\n          [0, 1, 2]\n        ]\n        verify(fn, args)\n\n    $ DUT=rabbit make test\n  \n.. this will create a virtual environment, with [ApprovalTests.Python](https://github.com/approvals/ApprovalTests.Python) and more installed, and run pytest on **test_rabbit.py** (which tests **rabbit.py**). **DUT** stands for \"**D**evice **U**nder **T**est\".\n\n\nThese make targets are documented and 'production ready':\n\n    make install-things     # install help tools (meld, entr, surf)\n    DUT=\u003cname\u003e make test    # create a Python 3 virtual environment\n                            # including pytest, coverage and approvaltests\n                            # in ./env/ (if it does not already exist)\n                            # and run tests of DUT.\n\n    make clean              # remove all artifacts built by make\n\n\nThere are also a couple of w.i.p targets which needs better UX (currently implicit dependencies e.g):\n\n    DUT=\u003cname\u003e make cover   # produce a HTML coverage report for \u003cname\u003e\n\n    DUT=\u003cname\u003e make lci     # run a 'local continuous integration ' loop which\n                            # detect modifications of DUT code and re-runs test(s)\n\n    DUT=\u003cname\u003e make mutate  # run cosmic ray mutation testing on DUT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobjarni%2Fpam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobjarni%2Fpam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobjarni%2Fpam/lists"}