{"id":47323911,"url":"https://github.com/kusen-alpha/gggifcheck","last_synced_at":"2026-03-17T18:43:52.304Z","repository":{"id":152818722,"uuid":"626479299","full_name":"kusen-alpha/gggifcheck","owner":"kusen-alpha","description":"通用条目字段检查，适应于各种场景的使用，只需要略微进行适配。","archived":false,"fork":false,"pushed_at":"2025-06-26T08:12:57.000Z","size":19,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-25T15:58:57.999Z","etag":null,"topics":["check","field","field-check","fields","item","item-check","items"],"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/kusen-alpha.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":"2023-04-11T14:49:14.000Z","updated_at":"2025-06-26T08:13:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"7050e120-22b5-48db-aa8b-443b0c0b3cae","html_url":"https://github.com/kusen-alpha/gggifcheck","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/kusen-alpha/gggifcheck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kusen-alpha%2Fgggifcheck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kusen-alpha%2Fgggifcheck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kusen-alpha%2Fgggifcheck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kusen-alpha%2Fgggifcheck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kusen-alpha","download_url":"https://codeload.github.com/kusen-alpha/gggifcheck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kusen-alpha%2Fgggifcheck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30628508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"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":["check","field","field-check","fields","item","item-check","items"],"created_at":"2026-03-17T18:43:51.637Z","updated_at":"2026-03-17T18:43:52.295Z","avatar_url":"https://github.com/kusen-alpha.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gggifcheck\n\n通用条目字段检查(General General General Item Field Check)\n，是基于Python编写通用检查工具，适应于各种场景的使用，只需要略微进行适配。\n\n## 使用方法\n\n### 安装\n\n    pip install gggifcheck\n\n### 使用CheckField\n\n```python\nfrom gggifcheck.fields import StringCheckField\n\n# 方式1\ns = StringCheckField(key='s', value='aa', min_length=1, max_length=2,\n                     contains=['a'], excludes=['b'])\nprint(s.value)\n# 方式2\ns = StringCheckField(min_length=1, max_length=2, contains=['a'], excludes=['b'])\ns.input('s', 'aa')\nprint(s.value)\n```\n    \n### 使用CheckItem\n\n```python\nfrom gggifcheck import fields, items\n\n\nclass TestCheckItem(items.CheckItem):\n    a = fields.StringCheckField(min_length=1, \n        max_length=2, contains=['a'], excludes=['b'])\n    b = fields.StringCheckField(min_length=1, \n        max_length=2, contains=['a'], excludes=['c'])\n\n\nitem = TestCheckItem()\nitem['a'] = 'aa'\nitem['b'] = 'ab'\nprint(dict(item))\n```\n\n## 使用案例\n\n### 结合scrapy\n\n```python\n# 对scrapy Item进行改写\nimport scrapy\nfrom gggifcheck import fields\nfrom gggifcheck.items import CheckItem\n\n\nclass ScrapyCheckItem(scrapy.Item, CheckItem):\n\n    def __init__(self, *args, **kwargs):\n        self._values = {}\n        self._base_values = {}\n        self._checked = False\n        if args or kwargs:\n            for k, v in dict(*args, **kwargs).items():\n                self[k] = v\n\n    def __getitem__(self, key):\n        if key in self.fields and key not in self._values:\n            value = None\n            for field1, field2 in self.relate_process_default:\n                value = self[field2]\n                break\n            self[key] = value\n        return self._values[key]\n\n    def __setitem__(self, key, value):\n        if key in self.fields:\n            self._base_values[key] = value\n            field = self.fields[key]\n            check_field = field.get('check_field')\n            if isinstance(check_field, fields.CheckField):\n                fe = check_field.from_instance()\n                fe.input(key, value)\n                self._values[key] = fe.value\n            else:\n                self._values[key] = value\n        else:\n            raise KeyError(\n                f\"{self.__class__.__name__} does not support field: {key}\")\n\n    def __setattr__(self, name, value):\n        if name.startswith('_'):\n            self.__dict__[name] = value\n        else:\n            raise AttributeError(\n                f\"Use item[{name!r}] = {value!r} to set field value\")\n\n    def keys(self):\n        if not self._checked:  # 默认只检查一次，无论是否检查异常\n            self._checked = True\n            self._process_and_check()\n            _ = [self[field] for field in self.fields]\n        return self._values.keys()\n\n    def checked(self, _checked):\n        self._checked = _checked\n\n# 示例\nclass PostItem(ScrapyCheckItem):\n    id = scrapy.Field(\n        check_field=fields.MD5CheckField(nullable=False))\n    channel = scrapy.Field(\n        check_field=fields.IntegerCheckField(\n            nullable=False, min_value=1, max_value=6))\n\n\nitem = PostItem()\nitem['id'] = '81dc9bdb52d04dc20036dbd8313ed055'\nitem['channel'] = 1\nprint(dict(item))\n```\n\n## 关于作者\n\n1. 邮箱：1194542196@qq.com\n2. 目前还需要很多需要改进的地方，可以私信作者，你们的提供越多，本库才能更完善。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkusen-alpha%2Fgggifcheck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkusen-alpha%2Fgggifcheck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkusen-alpha%2Fgggifcheck/lists"}