{"id":22114018,"url":"https://github.com/plinss/public_suffix_list","last_synced_at":"2025-10-08T22:38:43.511Z","repository":{"id":57455463,"uuid":"240790939","full_name":"plinss/public_suffix_list","owner":"plinss","description":"Mirror of https://gitlab.linss.com/open-source/public_suffix_list","archived":false,"fork":false,"pushed_at":"2020-06-16T03:54:34.000Z","size":13,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-25T15:57:21.114Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","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/plinss.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":"2020-02-15T21:34:21.000Z","updated_at":"2020-02-21T18:41:59.000Z","dependencies_parsed_at":"2022-09-08T20:11:41.860Z","dependency_job_id":null,"html_url":"https://github.com/plinss/public_suffix_list","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/plinss/public_suffix_list","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plinss%2Fpublic_suffix_list","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plinss%2Fpublic_suffix_list/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plinss%2Fpublic_suffix_list/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plinss%2Fpublic_suffix_list/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/plinss","download_url":"https://codeload.github.com/plinss/public_suffix_list/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plinss%2Fpublic_suffix_list/sbom","scorecard":{"id":737834,"data":{"date":"2025-08-11","repo":{"name":"github.com/plinss/public_suffix_list","commit":"54bbfeac47a18c14cb5a8ba1b607dc20ed9fb135"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":-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":"Code-Review","score":0,"reason":"Found 0/5 approved changesets -- score normalized to 0","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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"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":"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":"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":"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: 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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}}]},"last_synced_at":"2025-08-22T16:25:56.483Z","repository_id":57455463,"created_at":"2025-08-22T16:25:56.483Z","updated_at":"2025-08-22T16:25:56.483Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000779,"owners_count":26082851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"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":[],"created_at":"2024-12-01T11:08:21.355Z","updated_at":"2025-10-08T22:38:43.494Z","avatar_url":"https://github.com/plinss.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# public_suffix_list\n\nThis is a module for querying the Public Suffix List to determine effective top level domains.\n\nIt provides APIs to split domain names into subdomains, registered, and public suffix parts.\n\nNote this module does NOT include a copy of the public suffix list, \nit downloads the list, caches it, and periodically checks for updates automatically.\n\nAs such, internet connectivity is required. \nIf the list is unable to be refreshed,\nit will continue to run with the last cached version.\n\nFor applications that do not have internet connectivity, \nuse an alternate package that includes a copy of the list,\nor pre-populate the cache file through other means.\nNote that without periodic updates the list will get out of date.\n\nCache updates happen on a thread so do not cause processing delays.\n\nSee https://publicsuffix.org/ for details about the list.\n\n## API\n\nThe package provides the following functions which operate on a single, global list instance:\n\n#### public_suffix_list.setup(url: str = None, cache_dir: str = None, refresh_interval: datetime.timedelta = None, log: Logger = None) -\u003e PublicSuffixList: ...\n\nInitialize the global list.\nOnly needs to be called if not using the default values.\n\nAccepts an optional URL to download the list from, the default is: https://publicsuffix.org/list/public_suffix_list.dat\n\nThe list cache will be stored in a file 'public_suffix_list.dat' in the cache_dir, the default cache_dir is '.'.\n\nThe refresh_interval defaults to 24 hours.\n\nAn optional logger will receive debug and error messages.\nIf a logger is not provided, fatal errors will raise exceptions.\n\n\n#### public_suffix_list.split_domain(domain_name: str) -\u003e Tuple[str, str, str]: ...\n\nSplit a domain name into subdomain, registered name, and publix suffix.\n\nReturns a Tuple of (subdomain, registered name, public suffix).\n\ne.g. www.example.com -\u003e (www, example, com)\n\n\n#### public_suffix_list.public_suffix(domain_name: str) -\u003e str: ...\n\nReturn public suffix of domain name.\n\ne.g. www.example.com -\u003e com\n\n\n#### public_suffix_list.registered_name(domain_name: str) -\u003e str: ...\n\nReturn registered name of domain name only.\n\ne.g. www.example.com -\u003e example\n\n\n#### public_suffix_list.registered_domain_name(domain_name: str) -\u003e str: ...\n\nReturn fully qualified registered domain name.\n\ne.g. www.example.com -\u003e example.com\n\n\n#### public_suffix_list.split_registered_domain_name(domain_name: str) -\u003e Tuple[str, str]: ...\n\nSplit a domain name into subdomain and fully qualified registered domain name.\n\ne.g. www.example.com -\u003e (www, example.com)\n\n\n---\n\nAnd the following class:\n\n### public_suffix_list.PublicSuffixList\n\n#### PublicSuffixList(url: str = None, cache_dir: str = None, refresh_interval: datetime.timedelta = None, log: Logger = None) -\u003e None: ...\n\nInstantiate a PublicSuffixList.\n\nAccepts an optional URL to download the list from, the default is: https://publicsuffix.org/list/public_suffix_list.dat\n\nThe list cache will be stored in a file 'public_suffix_list.dat' in the cache_dir, the default cache_dir is '.'.\n\nThe refresh_interval defaults to 24 hours.\n\nAn optional logger will receive debug and error messages.\nIf a logger is not provided, fatal errors will raise exceptions.\n\n\n#### PublicSuffixList.split_domain(self, domain_name: str) -\u003e Tuple[str, str, str]: ...\n\nSplit a domain name into subdomain, registered name, and publix suffix.\n\nReturns a Tuple of (subdomain, registered name, public suffix).\n\ne.g. www.example.com -\u003e (www, example, com)\n\n\n#### PublicSuffixList.public_suffix(self, domain_name: str) -\u003e str:\n\nReturn public suffix of domain name.\n\ne.g. www.example.com -\u003e com\n\n\n#### PublicSuffixList.registered_name(self, domain_name: str) -\u003e str:\n\nReturn registered name of domain name only.\n\ne.g. www.example.com -\u003e example\n\n\n#### PublicSuffixList.registered_domain_name(self, domain_name: str) -\u003e str:\n\nReturn registered domain name.\n\ne.g. www.example.com -\u003e example.com\n\n\n#### PublicSuffixList.split_registered_domain_name(self, domain_name: str) -\u003e Tuple[str, str]:\n\nSplit a domain name into subdomain and registered domain.\n\ne.g. www.example.com -\u003e (www, example.com)\n\n\n---\n\n### pubic_suffix_list.Logger(Protocol)\n\nThe protocol for the optional logger.\n\n#### Logger.detail(self, *args) -\u003e None: ...\n\nPrint detailed debug information.\n\nUsed when downloading the list.\n\n#### Logger.warning(self, *args) -\u003e None: ...\n\nPrint a non-fatal error.\n\nUsed when the list download fails.\n\n#### Logger.error(self, *args) -\u003e None: ...\n\nPrint a fatal error.\n\nUsed when the cache is unavailable and the list is unable to be downloaded or stored.\n\n\n## Installation\n\nInstall with pip:\n\n    pip install public-suffix-list","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplinss%2Fpublic_suffix_list","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplinss%2Fpublic_suffix_list","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplinss%2Fpublic_suffix_list/lists"}