{"id":28479563,"url":"https://github.com/prosegrinder/python-prosegrinder","last_synced_at":"2026-04-13T03:23:54.479Z","repository":{"id":47349978,"uuid":"120102626","full_name":"prosegrinder/python-prosegrinder","owner":"prosegrinder","description":"A relatively fast, functional prose text counter with readability scoring.","archived":false,"fork":false,"pushed_at":"2026-03-24T17:51:27.000Z","size":219,"stargazers_count":4,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-25T22:55:54.768Z","etag":null,"topics":["prose","readability-scores","statistics","text-analysis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prosegrinder.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-02-03T15:20:23.000Z","updated_at":"2026-03-24T17:51:34.000Z","dependencies_parsed_at":"2023-02-18T11:31:43.065Z","dependency_job_id":"244887f8-2d1c-4f26-bdf6-4999b9117b60","html_url":"https://github.com/prosegrinder/python-prosegrinder","commit_stats":{"total_commits":146,"total_committers":7,"mean_commits":"20.857142857142858","dds":0.136986301369863,"last_synced_commit":"d2fcb36e7ba32048df5ccb7d480c663758eca59e"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/prosegrinder/python-prosegrinder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosegrinder%2Fpython-prosegrinder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosegrinder%2Fpython-prosegrinder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosegrinder%2Fpython-prosegrinder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosegrinder%2Fpython-prosegrinder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prosegrinder","download_url":"https://codeload.github.com/prosegrinder/python-prosegrinder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prosegrinder%2Fpython-prosegrinder/sbom","scorecard":{"id":204358,"data":{"date":"2025-08-11","repo":{"name":"github.com/prosegrinder/python-prosegrinder","commit":"85e5dfe6daffa21268baa3be9ca0e6dffd811b20"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Code-Review","score":2,"reason":"Found 2/9 approved changesets -- score normalized to 2","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":"Maintained","score":5,"reason":"6 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/autoapprove-prs.yaml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/autoapprove-prs.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dependabot-batcher.yaml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/dependabot-batcher.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pypi-publish.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/pypi-publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-ci.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-ci.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-release.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/prosegrinder/python-prosegrinder/python-release.yml/main?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  20 third-party GitHubAction dependencies pinned"],"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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/python-release.yml:37","Warn: no topLevel permission defined: .github/workflows/dependabot-batcher.yaml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/pypi-publish.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/python-ci.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/python-release.yml:4"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"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":"SAST","score":3,"reason":"SAST tool is not run on all commits -- score normalized to 3","details":["Warn: 9 commits out of 23 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-16T23:22:47.264Z","repository_id":47349978,"created_at":"2025-08-16T23:22:47.264Z","updated_at":"2025-08-16T23:22:47.264Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31738433,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T22:19:12.206Z","status":"online","status_checked_at":"2026-04-13T02:00:06.623Z","response_time":93,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["prose","readability-scores","statistics","text-analysis"],"created_at":"2025-06-07T18:09:37.344Z","updated_at":"2026-04-13T03:23:54.471Z","avatar_url":"https://github.com/prosegrinder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Prosegrinder\n\n[![Latest PyPI version](https://img.shields.io/pypi/v/prosegrinder.svg)](https://pypi.python.org/pypi/prosegrinder)\n[![Python Poetry CI](https://github.com/prosegrinder/python-prosegrinder/actions/workflows/python-ci.yml/badge.svg)](https://github.com/prosegrinder/python-prosegrinder/actions/workflows/python-ci.yml)\n\nA relatively fast, functional prose text counter with readability scoring.\n\n## Installation\n\n`prosegrinder` is available on PyPI. Simply install it with `pip`:\n\n```bash\npip install prosegrinder\n```\n\n## Usage\n\nThe main use is via the `prosegrinder.Prose` object.\n\n```python\n\u003e\u003e\u003e from prosegrinder import Prose\n\u003e\u003e\u003e p = Prose(\"Some lengthy text that's actual prose, like a novel or article.\")\n```\n\nThe Prose object will parse everything down and compute basic statistics,\nincluding word count, sentence count, paragraph count, syllable count, point of\nview, dialogue, narrative, and a set of readability scores. All objects and\nattributes should be treated as immutable.\n\nI know this isn't great documentation, but it should be enough to get you going.\n\n### Command Line Interface\n\nProsegrinder now includes a simple CLI for analyzing text in a file:\n\n```bash\n$ prosegrinder --help\nUsage: prosegrinder [OPTIONS] FILES...\n\n  Setup the command line interface\n\nOptions:\n  -i, --indent INTEGER  Python pretty-print json indent level.\n  -s, --save FILENAME   File to save output to.\n  --help                Show this message and exit.\n```\n\nWill provide basic statistics on text from a file or set of files including the\nfilename and sh256 of text in each file analyzed. Output is json to help\nfacilitate use in automation::\n\n```json\n[\n  {\n    \"filename\": \"shortstory.txt\",\n    \"statistics\": {\n      \"sha256\": \"5b756dea7c7f0088ff3692e402466af7f4fc493fa357c1ae959fa4493943fc03\",\n      \"word_character_count\": 7008,\n      \"phone_count\": 5747,\n      \"syllable_count\": 2287,\n      \"word_count\": 1528,\n      \"sentence_count\": 90,\n      \"paragraph_count\": 77,\n      \"complex_word_count\": 202,\n      \"long_word_count\": 275,\n      \"pov_word_count\": 113,\n      \"first_person_word_count\": 8,\n      \"second_person_word_count\": 74,\n      \"third_person_word_count\": 31,\n      \"pov\": \"first\",\n      \"readability_scores\": {\n        \"automated_readability_index\": 0.281,\n        \"coleman_liau_index\": 9.425,\n        \"flesch_kincaid_grade_level\": 8.693,\n        \"flesch_reading_ease\": 62.979,\n        \"gunning_fog_index\": 12.079,\n        \"linsear_write\": 10.733,\n        \"lix\": 34.975,\n        \"rix\": 3.056,\n        \"smog\": 11.688\n      }\n    }\n  },\n  {\n    \"filename\": \"copyright.txt\",\n    \"statistics\": {\n      \"sha256\": \"553bfd087a2736e4bbe2f312e3d3a5b763fb57caa54e3626da03b0fd3f42e017\",\n      \"word_character_count\": 222,\n      \"phone_count\": 169,\n      \"syllable_count\": 78,\n      \"word_count\": 46,\n      \"sentence_count\": 7,\n      \"paragraph_count\": 16,\n      \"complex_word_count\": 10,\n      \"long_word_count\": 12,\n      \"pov_word_count\": 1,\n      \"first_person_word_count\": 1,\n      \"second_person_word_count\": 0,\n      \"third_person_word_count\": 0,\n      \"pov\": \"first\",\n      \"readability_scores\": {\n        \"automated_readability_index\": 1.404,\n        \"coleman_liau_index\": 8.073,\n        \"flesch_kincaid_grade_level\": 6.982,\n        \"flesch_reading_ease\": 56.713,\n        \"gunning_fog_index\": 11.324,\n        \"linsear_write\": 3.714,\n        \"lix\": 32.658,\n        \"rix\": 1.714,\n        \"smog\": 9.957\n      }\n    }\n  }\n]\n```\n\n### Readability scores\n\nThe set of scores automatically calculated:\n\n- Automated Readability Index\n- Coleman Liau Index\n- Flesch Kincaid Grade Level\n- Flesch Reading Ease\n- Gunning Fog Index\n- Linsear Write\n- LIX\n- RIX\n- SMOG\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprosegrinder%2Fpython-prosegrinder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprosegrinder%2Fpython-prosegrinder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprosegrinder%2Fpython-prosegrinder/lists"}