Name | hikepy JSON |
Version |
1.0.1
JSON |
| download |
home_page | None |
Summary | hikesoft python framework power by wantao |
upload_time | 2024-11-18 07:23:12 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | Copyright (c) 2016 The Python Packaging Authority (PyPA) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
keywords |
hikepy
framework
setuptools
development
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# FastApi快速开发框架
本项目是基于fastapi为基础实现的开发框架。主要特点是简化代码量,内置ORM、Mongo、Cache等多种常见开发工具。结构简洁开包即用,框架自动扫描引入业务代码。
----
## 框架结构
```python
app--------------------------------应用包
modules------------------------业务模块
base-----------------------业务聚合1
models.py--------------业务数据模型
routers.py-------------Rest api接口
service.py-------------业务逻辑
foo------------------------业务聚合2
foo2-----------------------业务聚合3
foo3-----------------------业务聚合4
assets-----------------------------应用资源
etc----------------------------应用配置
logs---------------------------应用日志
app.py-----------------------------启动程序
```
## 配置文件
配置环境区分
```python
python app.py 环境(dev prod 其他环境)
```
每个环境会生成对应的配置文件
```python
appinfo:
contact:
email: hnck2000@126.com
name: wantao
url: https://github.com/
description: "应用介绍"
summary: "应用简介"
title: "应用名称"
version: 0.0.1
cache:
enable: false
host: 127.0.0.1
password: ''
port: 6379
custom: {}#自定义配置
database:
enable: true
max_overflow: 10
pool_size: 5
pool_timeout: 30
url: mysql+aiomysql://root:root@127.0.0.1/test?charset=utf8mb4
mogodb:
enable: true
url: mongodb://admin:admin@127.0.0.1:27017
database: test
env: dev
ip: 127.0.0.1
port: 8081
```
通过引入config使用全局配置数据
```python
from hikepy import config
```
## Routers
Routers文件是当前业务集合的所有接口程序部分,接口定义完全使用fastapi规范和语法
### 接口启用权限验证
```python
from hikepy import AuthInfo,HkAuth
async def read_users(authInfo:AuthInfo=Depends(HkAuth())):
```
通过引入HkAuth()依赖对该接口实现安全验证,请求此接口必须在Header中带有ticket=Token
### 生成token
```python
from hikepy import AuthInfo,HkAuth,create_token
return create_token(AuthInfo(user_id="test"))
```
通过create_token创建AuthInfo对象创建token
## Service
service.py是业务集合中所有的核心业务代码。
### 定义业务方法
```python
from hikepy import service
@service
async def foo():
```
通过@service装饰器定义业务方法,框架会自动扫描带有@service的方法
### 使用SQL
```python
from hikepy import service
from hikepy.tools import Sql
@service
async def foo(db:Sql=None):
```
通过在业务类方法上定义Sql类型提示来使用sql功能,框架会自动创建封装sql工具类,直接使用即可,例如:db.execute()
Sql工具类基于sqlalchemy封装,支持所有的sqlalchemy方法,封装了例如分页查询等方法db.page(select(TestModel))
关于事物嵌套,主方法调用子方法默认不开启事物嵌套,子方法会使用独立事物,如果要开启,在主方法调用子方法是需要给子方法传递db:Sql参数
### 使用Cache
```python
from hikepy import service
from redis import Redis
@service
async def foo(cache:Redis=None):
```
通过在业务类方法上定义Redis类型提示来使用cache功能, Redis未做封装直接使用python的Redis客户端
### 使用MogoDB
```python
from hikepy import service
from hikepy.tools import Mogo
@service
async def foo(mogo:Mogo=None):
```
通过在业务类方法上定义Mogo类型提示来使用mogo功能, mogo:Mogo是基于motor封装的mogo工具类,使用过程中采用异步模式
## Models
models.py是业务集合中所有用到的数据模型对象,数据模型以pydantic为基础进行封装。
```python
class HkBaseModel(BaseModel):
"""pydantic基础类"""
```
HkBaseModel是所有数据模型的基类,所有自定义模型应继承
```python
class SqlModel(Base):
"""所有数据库模型都需要集成此类"""
# 定义为抽象类
__abstract__ = True
# 默认字段
id = Column(String(50),primary_key=True,comment="主角")
create_user = Column(String(50),nullable=True,comment="创建人")
create_time = Column(DATETIME,default=datetime.now, comment="创建时间")
update_user = Column(String(50),nullable=True, comment="更新人")
update_time = Column(DATETIME,default=datetime.now, comment="更新时间")
is_delete = Column(CHAR(1), default="N", comment="删除标识:0-正常 1-已删除")
```
SqlModel是所有ORM数据模型的基类,所有自定义模型应继承,定为数据表ORM模型时继承,已经内置了ID等属性,所有自定义类不在设置主键字段
```python
class PageList(Generic[T],HkBaseModel):
"""分页查询返回结果封装类"""
```
分页查询对象封装类型,分页查询会返回此类型
```python
class AuthInfo(HkBaseModel):
"""jwt用户信息"""
```
JWT的playload装载内容对象
```python
class CommonModel(HkBaseModel):
"""通用参数类"""
keyword:str=Field(default="",description="关键字")
page_size:int=Field(default=20,description="每页数量")
current_page:int=Field(default=1,description="当前页码")
order_by:str=Field(default="",description="排序字段")
```
通用查询参数封装类,用于从前端接收get/post传参,内置了一些常用的参数,使用时可以继承此类
## 常用工具
本项目是基于fastapi为基础实现的开发框架。主要特点是简化代码量,内置ORM、Mongo、Cache等多种常见开发工具。结构简洁开包即用,框架自动扫描引入业务代码。
### 全局主键生成器
```python
from hikepy import config
id=config.id()
```
通过config.id()方法生成全局唯一主键
Raw data
{
"_id": null,
"home_page": null,
"name": "hikepy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "wantao <hnck2000@126.com>",
"keywords": "hikepy, framework, setuptools, development",
"author": null,
"author_email": "wantao <hnck2000@126.com>",
"download_url": "https://files.pythonhosted.org/packages/de/dd/87e19ad9aaf43686d08b3ad1189709f7061cd52da4419e2ff5b75994de69/hikepy-1.0.1.tar.gz",
"platform": null,
"description": "# FastApi\u5feb\u901f\u5f00\u53d1\u6846\u67b6\r\n\r\n\u672c\u9879\u76ee\u662f\u57fa\u4e8efastapi\u4e3a\u57fa\u7840\u5b9e\u73b0\u7684\u5f00\u53d1\u6846\u67b6\u3002\u4e3b\u8981\u7279\u70b9\u662f\u7b80\u5316\u4ee3\u7801\u91cf\uff0c\u5185\u7f6eORM\u3001Mongo\u3001Cache\u7b49\u591a\u79cd\u5e38\u89c1\u5f00\u53d1\u5de5\u5177\u3002\u7ed3\u6784\u7b80\u6d01\u5f00\u5305\u5373\u7528\uff0c\u6846\u67b6\u81ea\u52a8\u626b\u63cf\u5f15\u5165\u4e1a\u52a1\u4ee3\u7801\u3002\r\n\r\n----\r\n\r\n## \u6846\u67b6\u7ed3\u6784\r\n\r\n```python\r\napp--------------------------------\u5e94\u7528\u5305\r\n modules------------------------\u4e1a\u52a1\u6a21\u5757\r\n base-----------------------\u4e1a\u52a1\u805a\u54081\r\n models.py--------------\u4e1a\u52a1\u6570\u636e\u6a21\u578b\r\n routers.py-------------Rest api\u63a5\u53e3\r\n service.py-------------\u4e1a\u52a1\u903b\u8f91\r\n foo------------------------\u4e1a\u52a1\u805a\u54082\r\n foo2-----------------------\u4e1a\u52a1\u805a\u54083\r\n foo3-----------------------\u4e1a\u52a1\u805a\u54084\r\nassets-----------------------------\u5e94\u7528\u8d44\u6e90\r\n etc----------------------------\u5e94\u7528\u914d\u7f6e\r\n logs---------------------------\u5e94\u7528\u65e5\u5fd7\r\napp.py-----------------------------\u542f\u52a8\u7a0b\u5e8f \r\n```\r\n\r\n## \u914d\u7f6e\u6587\u4ef6\r\n\r\n\u914d\u7f6e\u73af\u5883\u533a\u5206\r\n```python\r\npython app.py \u73af\u5883(dev prod \u5176\u4ed6\u73af\u5883)\r\n```\r\n\u6bcf\u4e2a\u73af\u5883\u4f1a\u751f\u6210\u5bf9\u5e94\u7684\u914d\u7f6e\u6587\u4ef6\r\n\r\n```python\r\nappinfo:\r\n contact:\r\n email: hnck2000@126.com\r\n name: wantao\r\n url: https://github.com/\r\n description: \"\u5e94\u7528\u4ecb\u7ecd\"\r\n summary: \"\u5e94\u7528\u7b80\u4ecb\"\r\n title: \"\u5e94\u7528\u540d\u79f0\"\r\n version: 0.0.1\r\ncache:\r\n enable: false\r\n host: 127.0.0.1\r\n password: ''\r\n port: 6379\r\ncustom: {}#\u81ea\u5b9a\u4e49\u914d\u7f6e\r\ndatabase:\r\n enable: true\r\n max_overflow: 10\r\n pool_size: 5\r\n pool_timeout: 30\r\n url: mysql+aiomysql://root:root@127.0.0.1/test?charset=utf8mb4\r\nmogodb:\r\n enable: true\r\n url: mongodb://admin:admin@127.0.0.1:27017\r\n database: test \r\nenv: dev\r\nip: 127.0.0.1\r\nport: 8081\r\n\r\n```\r\n\u901a\u8fc7\u5f15\u5165config\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u6570\u636e\r\n```python\r\nfrom hikepy import config\r\n```\r\n\r\n## Routers\r\n\r\nRouters\u6587\u4ef6\u662f\u5f53\u524d\u4e1a\u52a1\u96c6\u5408\u7684\u6240\u6709\u63a5\u53e3\u7a0b\u5e8f\u90e8\u5206\uff0c\u63a5\u53e3\u5b9a\u4e49\u5b8c\u5168\u4f7f\u7528fastapi\u89c4\u8303\u548c\u8bed\u6cd5\r\n\r\n### \u63a5\u53e3\u542f\u7528\u6743\u9650\u9a8c\u8bc1\r\n\r\n```python\r\nfrom hikepy import AuthInfo,HkAuth\r\n\r\nasync def read_users(authInfo:AuthInfo=Depends(HkAuth())):\r\n```\r\n\u901a\u8fc7\u5f15\u5165HkAuth()\u4f9d\u8d56\u5bf9\u8be5\u63a5\u53e3\u5b9e\u73b0\u5b89\u5168\u9a8c\u8bc1,\u8bf7\u6c42\u6b64\u63a5\u53e3\u5fc5\u987b\u5728Header\u4e2d\u5e26\u6709ticket=Token\r\n\r\n### \u751f\u6210token\r\n```python\r\nfrom hikepy import AuthInfo,HkAuth,create_token\r\n\r\nreturn create_token(AuthInfo(user_id=\"test\"))\r\n```\r\n\u901a\u8fc7create_token\u521b\u5efaAuthInfo\u5bf9\u8c61\u521b\u5efatoken\r\n\r\n## Service\r\n\r\nservice.py\u662f\u4e1a\u52a1\u96c6\u5408\u4e2d\u6240\u6709\u7684\u6838\u5fc3\u4e1a\u52a1\u4ee3\u7801\u3002\r\n\r\n### \u5b9a\u4e49\u4e1a\u52a1\u65b9\u6cd5\r\n```python\r\nfrom hikepy import service\r\n\r\n@service\r\nasync def foo():\r\n```\r\n\u901a\u8fc7@service\u88c5\u9970\u5668\u5b9a\u4e49\u4e1a\u52a1\u65b9\u6cd5\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u626b\u63cf\u5e26\u6709@service\u7684\u65b9\u6cd5\r\n\r\n### \u4f7f\u7528SQL\r\n```python\r\nfrom hikepy import service\r\nfrom hikepy.tools import Sql\r\n\r\n@service\r\nasync def foo(db:Sql=None):\r\n```\r\n\u901a\u8fc7\u5728\u4e1a\u52a1\u7c7b\u65b9\u6cd5\u4e0a\u5b9a\u4e49Sql\u7c7b\u578b\u63d0\u793a\u6765\u4f7f\u7528sql\u529f\u80fd\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u521b\u5efa\u5c01\u88c5sql\u5de5\u5177\u7c7b\uff0c\u76f4\u63a5\u4f7f\u7528\u5373\u53ef\uff0c\u4f8b\u5982\uff1adb.execute()\r\n\r\nSql\u5de5\u5177\u7c7b\u57fa\u4e8esqlalchemy\u5c01\u88c5\uff0c\u652f\u6301\u6240\u6709\u7684sqlalchemy\u65b9\u6cd5\uff0c\u5c01\u88c5\u4e86\u4f8b\u5982\u5206\u9875\u67e5\u8be2\u7b49\u65b9\u6cd5db.page(select(TestModel))\r\n\r\n\u5173\u4e8e\u4e8b\u7269\u5d4c\u5957\uff0c\u4e3b\u65b9\u6cd5\u8c03\u7528\u5b50\u65b9\u6cd5\u9ed8\u8ba4\u4e0d\u5f00\u542f\u4e8b\u7269\u5d4c\u5957\uff0c\u5b50\u65b9\u6cd5\u4f1a\u4f7f\u7528\u72ec\u7acb\u4e8b\u7269\uff0c\u5982\u679c\u8981\u5f00\u542f\uff0c\u5728\u4e3b\u65b9\u6cd5\u8c03\u7528\u5b50\u65b9\u6cd5\u662f\u9700\u8981\u7ed9\u5b50\u65b9\u6cd5\u4f20\u9012db\uff1aSql\u53c2\u6570\r\n\r\n### \u4f7f\u7528Cache\r\n```python\r\nfrom hikepy import service\r\nfrom redis import Redis\r\n\r\n@service\r\nasync def foo(cache:Redis=None):\r\n```\r\n\u901a\u8fc7\u5728\u4e1a\u52a1\u7c7b\u65b9\u6cd5\u4e0a\u5b9a\u4e49Redis\u7c7b\u578b\u63d0\u793a\u6765\u4f7f\u7528cache\u529f\u80fd\uff0c Redis\u672a\u505a\u5c01\u88c5\u76f4\u63a5\u4f7f\u7528python\u7684Redis\u5ba2\u6237\u7aef\r\n\r\n### \u4f7f\u7528MogoDB\r\n```python\r\nfrom hikepy import service\r\nfrom hikepy.tools import Mogo\r\n@service\r\nasync def foo(mogo:Mogo=None):\r\n```\r\n\u901a\u8fc7\u5728\u4e1a\u52a1\u7c7b\u65b9\u6cd5\u4e0a\u5b9a\u4e49Mogo\u7c7b\u578b\u63d0\u793a\u6765\u4f7f\u7528mogo\u529f\u80fd\uff0c mogo:Mogo\u662f\u57fa\u4e8emotor\u5c01\u88c5\u7684mogo\u5de5\u5177\u7c7b\uff0c\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u91c7\u7528\u5f02\u6b65\u6a21\u5f0f\r\n\r\n## Models\r\n\r\nmodels.py\u662f\u4e1a\u52a1\u96c6\u5408\u4e2d\u6240\u6709\u7528\u5230\u7684\u6570\u636e\u6a21\u578b\u5bf9\u8c61,\u6570\u636e\u6a21\u578b\u4ee5pydantic\u4e3a\u57fa\u7840\u8fdb\u884c\u5c01\u88c5\u3002\r\n\r\n```python\r\nclass HkBaseModel(BaseModel):\r\n \"\"\"pydantic\u57fa\u7840\u7c7b\"\"\"\r\n```\r\nHkBaseModel\u662f\u6240\u6709\u6570\u636e\u6a21\u578b\u7684\u57fa\u7c7b\uff0c\u6240\u6709\u81ea\u5b9a\u4e49\u6a21\u578b\u5e94\u7ee7\u627f\r\n\r\n```python\r\nclass SqlModel(Base):\r\n \"\"\"\u6240\u6709\u6570\u636e\u5e93\u6a21\u578b\u90fd\u9700\u8981\u96c6\u6210\u6b64\u7c7b\"\"\"\r\n # \u5b9a\u4e49\u4e3a\u62bd\u8c61\u7c7b\r\n __abstract__ = True\r\n # \u9ed8\u8ba4\u5b57\u6bb5\r\n id = Column(String(50),primary_key=True,comment=\"\u4e3b\u89d2\")\r\n create_user = Column(String(50),nullable=True,comment=\"\u521b\u5efa\u4eba\")\r\n create_time = Column(DATETIME,default=datetime.now, comment=\"\u521b\u5efa\u65f6\u95f4\")\r\n update_user = Column(String(50),nullable=True, comment=\"\u66f4\u65b0\u4eba\")\r\n update_time = Column(DATETIME,default=datetime.now, comment=\"\u66f4\u65b0\u65f6\u95f4\")\r\n is_delete = Column(CHAR(1), default=\"N\", comment=\"\u5220\u9664\u6807\u8bc6\uff1a0-\u6b63\u5e38 1-\u5df2\u5220\u9664\")\r\n```\r\nSqlModel\u662f\u6240\u6709ORM\u6570\u636e\u6a21\u578b\u7684\u57fa\u7c7b\uff0c\u6240\u6709\u81ea\u5b9a\u4e49\u6a21\u578b\u5e94\u7ee7\u627f\uff0c\u5b9a\u4e3a\u6570\u636e\u8868ORM\u6a21\u578b\u65f6\u7ee7\u627f\uff0c\u5df2\u7ecf\u5185\u7f6e\u4e86ID\u7b49\u5c5e\u6027\uff0c\u6240\u6709\u81ea\u5b9a\u4e49\u7c7b\u4e0d\u5728\u8bbe\u7f6e\u4e3b\u952e\u5b57\u6bb5\r\n\r\n```python\r\nclass PageList(Generic[T],HkBaseModel):\r\n \"\"\"\u5206\u9875\u67e5\u8be2\u8fd4\u56de\u7ed3\u679c\u5c01\u88c5\u7c7b\"\"\"\r\n```\r\n\u5206\u9875\u67e5\u8be2\u5bf9\u8c61\u5c01\u88c5\u7c7b\u578b,\u5206\u9875\u67e5\u8be2\u4f1a\u8fd4\u56de\u6b64\u7c7b\u578b\r\n\r\n```python\r\nclass AuthInfo(HkBaseModel):\r\n \"\"\"jwt\u7528\u6237\u4fe1\u606f\"\"\"\r\n```\r\nJWT\u7684playload\u88c5\u8f7d\u5185\u5bb9\u5bf9\u8c61\r\n\r\n```python\r\nclass CommonModel(HkBaseModel):\r\n \"\"\"\u901a\u7528\u53c2\u6570\u7c7b\"\"\"\r\n keyword:str=Field(default=\"\",description=\"\u5173\u952e\u5b57\")\r\n page_size:int=Field(default=20,description=\"\u6bcf\u9875\u6570\u91cf\")\r\n current_page:int=Field(default=1,description=\"\u5f53\u524d\u9875\u7801\")\r\n order_by:str=Field(default=\"\",description=\"\u6392\u5e8f\u5b57\u6bb5\")\r\n```\r\n\u901a\u7528\u67e5\u8be2\u53c2\u6570\u5c01\u88c5\u7c7b\uff0c\u7528\u4e8e\u4ece\u524d\u7aef\u63a5\u6536get/post\u4f20\u53c2\uff0c\u5185\u7f6e\u4e86\u4e00\u4e9b\u5e38\u7528\u7684\u53c2\u6570\uff0c\u4f7f\u7528\u65f6\u53ef\u4ee5\u7ee7\u627f\u6b64\u7c7b\r\n\r\n## \u5e38\u7528\u5de5\u5177\r\n\r\n\u672c\u9879\u76ee\u662f\u57fa\u4e8efastapi\u4e3a\u57fa\u7840\u5b9e\u73b0\u7684\u5f00\u53d1\u6846\u67b6\u3002\u4e3b\u8981\u7279\u70b9\u662f\u7b80\u5316\u4ee3\u7801\u91cf\uff0c\u5185\u7f6eORM\u3001Mongo\u3001Cache\u7b49\u591a\u79cd\u5e38\u89c1\u5f00\u53d1\u5de5\u5177\u3002\u7ed3\u6784\u7b80\u6d01\u5f00\u5305\u5373\u7528\uff0c\u6846\u67b6\u81ea\u52a8\u626b\u63cf\u5f15\u5165\u4e1a\u52a1\u4ee3\u7801\u3002\r\n\r\n### \u5168\u5c40\u4e3b\u952e\u751f\u6210\u5668\r\n\r\n```python\r\nfrom hikepy import config\r\n\r\nid=config.id()\r\n```\r\n\r\n\u901a\u8fc7config.id()\u65b9\u6cd5\u751f\u6210\u5168\u5c40\u552f\u4e00\u4e3b\u952e\r\n",
"bugtrack_url": null,
"license": "Copyright (c) 2016 The Python Packaging Authority (PyPA) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
"summary": "hikesoft python framework power by wantao",
"version": "1.0.1",
"project_urls": {
"Bug Reports": "https://github.com/pypa/sampleproject/issues",
"Funding": "https://donate.pypi.org",
"Homepage": "https://github.com/pypa/sampleproject",
"Say Thanks!": "http://saythanks.io/to/example",
"Source": "https://github.com/pypa/sampleproject/"
},
"split_keywords": [
"hikepy",
" framework",
" setuptools",
" development"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dedd87e19ad9aaf43686d08b3ad1189709f7061cd52da4419e2ff5b75994de69",
"md5": "a0e57932f46781c6c4505b0bf1f95d93",
"sha256": "7e30c5c4fc62ff49ab98d5465509509f30170b8b937059897c789015164a35ca"
},
"downloads": -1,
"filename": "hikepy-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "a0e57932f46781c6c4505b0bf1f95d93",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 19510,
"upload_time": "2024-11-18T07:23:12",
"upload_time_iso_8601": "2024-11-18T07:23:12.030861Z",
"url": "https://files.pythonhosted.org/packages/de/dd/87e19ad9aaf43686d08b3ad1189709f7061cd52da4419e2ff5b75994de69/hikepy-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-18 07:23:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pypa",
"github_project": "sampleproject",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "hikepy"
}