{"id":41685583,"url":"https://github.com/jnmclarty/validada","last_synced_at":"2026-01-24T19:27:36.840Z","repository":{"id":34807529,"uuid":"38793362","full_name":"jnmclarty/validada","owner":"jnmclarty","description":"Another library for defensive data analysis.","archived":false,"fork":false,"pushed_at":"2018-11-12T18:38:08.000Z","size":28,"stargazers_count":29,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-11-28T11:09:51.556Z","etag":null,"topics":["checkset","data","data-analysis","data-validation","decorators","pandas","slice","validation"],"latest_commit_sha":null,"homepage":null,"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/jnmclarty.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":"2015-07-09T02:57:16.000Z","updated_at":"2025-07-18T01:29:27.000Z","dependencies_parsed_at":"2022-08-17T21:25:12.461Z","dependency_job_id":null,"html_url":"https://github.com/jnmclarty/validada","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/jnmclarty/validada","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnmclarty%2Fvalidada","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnmclarty%2Fvalidada/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnmclarty%2Fvalidada/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnmclarty%2Fvalidada/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jnmclarty","download_url":"https://codeload.github.com/jnmclarty/validada/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnmclarty%2Fvalidada/sbom","scorecard":{"id":525149,"data":{"date":"2025-08-11","repo":{"name":"github.com/jnmclarty/validada","commit":"da806ee649d67e2ac36ad4f22493003622493ee5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":1,"reason":"Found 1/9 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T04:09:15.133Z","repository_id":34807529,"created_at":"2025-08-20T04:09:15.134Z","updated_at":"2025-08-20T04:09:15.134Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28735232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T19:23:36.361Z","status":"ssl_error","status_checked_at":"2026-01-24T19:23:28.966Z","response_time":89,"last_error":"SSL_read: 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":["checkset","data","data-analysis","data-validation","decorators","pandas","slice","validation"],"created_at":"2026-01-24T19:27:36.194Z","updated_at":"2026-01-24T19:27:36.827Z","avatar_url":"https://github.com/jnmclarty.png","language":"Python","readme":"Validada \n========\n\n(Pronounced \"Valid-Data\")\n\nThis project started as a fork of [engarde v0.0.2](https://github.com/TomAugspurger/engarde)\n\nValidada differentiates from engarde under the hood, substantially, in order to implement a richer\nfeature set including custom-exceptions, universal slicing API, check object-return.  All, \nwith a focus on code brevity.  \n\nAll of the basics are the same as engarde, with likely a minor hit to speed.  Although,\nin many cases engarde raises on the first problem it finds.  Validada's policy is\nto raise only after checking everything.\n\nAs of 7/7/2015,  validada passes all of the unit tests of engarde.\n\nSlicing?\n========\nAll checks slice the dataframe internally, so users of validada never have to pass in a sliced dataframe.\nInstead, users can pass in a slice-like object as an argument.  \n\nHow do I pass a slice?\n\n```python\nfrom validada.slicers import iloc, loc\n\nsome_check(adf, iloc[-7:], iloc[:-7])\n\n# or...\n\n@some_check(iloc[-1], iloc[:-1])\ndef somefunc(adf):\n\treturn adf + 1.0\n\n```\n\nAll checks can take up to two slice-like arguments.  The first, is the slice which will be checked. \nThe second, is a slice for calculating constants to use during the check.  Both are optional.\nSo, say you have a dataframe coming from a source of data, with known \"good\" data \n(for instance, before last week), and want to check that the data for just this week is within\ntwo standard deviations of the data, excluding the latest week of data, you would pass in \n```iloc[-7:]``` and ```iloc[:-7]``` as arguments to the check.\n\n```\n#To use the same functionality of engarde, one would use...\nfrom validada.functions.raising import none_missing, is_shape, unique_index\n#or\nfrom validada.decorators.raising import none_missing, is_shape, unique_index\n```\n\n```\n#But with validada you get more out of the box...\nfrom validada.functions.returning import none_missing, is_shape, unique_index\n#or\nfrom validada.decorators.returning import none_missing, is_shape, unique_index\n```\n\nCustom Return-Objects?\n======================\nDepending on the check, there might be some useful information to pass back out, or maybe you\nwant to perform a bunch of checks and just collect the boolean results for each?\n\n``` python\nfrom validada.core import ReturnSet\n\nrs = ReturnSet(('bool', 'obj'))\nnone_missing = rs.none_missing\n\nprint \"Since we specified 'bool' and 'obj', in that order:\"\na_bool, an_obj = none_missing(adf, ix['2013':], columns='one')\n#a_bool, is the result of the check\nprint a_bool\n#an_obj, is a none_missing specific object, it's a way to \n#get other information out of the check.\nprint an_obj\n```\n\n\nCustom Exceptions?\n==================\nTo use the advance features instantiate your own ```CheckSet``` (or child of, eg. ```RaiseSet```,```ReturnSet```) via...\n\n``` python\nfrom validada.core import RaiseSet\nrs = RaiseSet(IOError, \"IO error makes no sense, but why not?\")\nnone_missing = rs.none_missing\n\n#ready...\nnone_missing(adf, ix['2013':])\n\n#or make a decorator\nnone_missing = rs.decorator_maker('none_missing')\n```\n\nDependencies\n============\n\n- Pandas\n\n\nSupports python 2.7+  and Python 3.6\n\n\nOverall Design\n==============\n\nEvery check has a return-function and raise-function created all sharing a common signature.\nThese two functions are used to create one staticfunction, for every check, of the CheckSet.\nA CheckSet object stores custom-exception, custom-object return, and default slicing settings.\nA CheckSet object has a generic way to turn any check, into a decorator using one line.  \nAn instance of RaiseSet and ReturnSet is used to declare function.*.checks and decorators.*.checks.\n\nSee Also\n========\n\n[assertr](https://github.com/tonyfischetti/assertr)\n[engarde](https://github.com/TomAugspurger/engarde)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjnmclarty%2Fvalidada","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjnmclarty%2Fvalidada","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjnmclarty%2Fvalidada/lists"}