From 8e6fb07de67256bcc4466819a12db4d5fedf3a4a Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Wed, 10 May 2023 09:28:32 +0000 Subject: automatic import of python-pydbapi --- .gitignore | 1 + python-pydbapi.spec | 686 ++++++++++++++++++++++++++++++++++++++++++++++++++++ sources | 1 + 3 files changed, 688 insertions(+) create mode 100644 python-pydbapi.spec create mode 100644 sources diff --git a/.gitignore b/.gitignore index e69de29..fe3244a 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/pydbapi-0.0.106.tar.gz diff --git a/python-pydbapi.spec b/python-pydbapi.spec new file mode 100644 index 0000000..1cb0079 --- /dev/null +++ b/python-pydbapi.spec @@ -0,0 +1,686 @@ +%global _empty_manifest_terminate_build 0 +Name: python-pydbapi +Version: 0.0.106 +Release: 1 +Summary: A simple database API +License: MIT License +URL: https://pypi.org/project/pydbapi/ +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/86/d8/9581e1d319cf0ba55afea61f5aeca6190ad75c1027c6effa64bfdbb59f75/pydbapi-0.0.106.tar.gz +BuildArch: noarch + +Requires: python3-psycopg2-binary +Requires: python3-pandas +Requires: python3-pymysql +Requires: python3-colorlog +Requires: python3-tqdm + +%description +# pydbapi + +## Installation +```python +pip install pydbapi +``` + +## 支持的数据库类型 ++ sqlite +```python +from pydbapi.api import SqliteDB +db = SqliteDB(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Amazon Redshift +```python +from pydbapi.api import RedshiftDB +db = RedshiftDB(host, user, password, database, port='5439', safe_rule=True) +sql = 'select * from [schema].[table];' +row, action, result = db.execute(sql) +``` ++ Mysql +```python +from pydbapi.api import MysqlDB +db = MysqlDB(host, user, password, database, port=3306, safe_rule=True, isdoris=False) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Snowflake(删除) +```python +from pydbapi.api import SnowflakeDB +db = SnowflakeDB(user, password, account, warehouse, database, schema, safe_rule=True) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + ++ instance模式 +```python +from pydbapi.api import SqliteDB +db = SqliteDB.get_instance(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + +## Column +`from pydbapi.col import ColumnModel` ++ ColumnModel + + 代码 + `col = ColumnModel(newname, coltype='varchar', sqlexpr=None, func=None, order=0)` + + params + * `newname`: 新命名; + * `coltype`: 类型 + * `sqlexpr`: 查询sql表达式 + * `func`: 查询函数,暂时支持'min', 'max', 'sum', 'count' + * `order`: 排序 + ++ ColumnsModel + + 代码 + `cols = ColumnsModel(ColumnModel, ColumnModel, ……)` + + property + * `func_cols`: 返回col列表 + * `nonfunc_cols`: 返回col列表 + * `new_cols`: 返回拼接字符串 + * `create_cols`: 返回拼接字符串 + * `select_cols`: 返回拼接字符串 + * `group_cols`: 返回拼接字符串 + * `order_cols`: 返回拼接字符串 + + mothed + * get_column_by_name + - `cols.get_column_by_name(name)` + - 返回`ColumnModel` +## 支持的操作 ++ execute[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.execute(sql, count=None, ehandling=None, verbose=0)` + + params + * `count`: 返回结果的数量; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) ++ select + + 代码 + `db.select(tablename, columns, condition=None, verbose=0)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `condition`: sql where 中的条件 ++ create + + sqlite/redshift + + 代码 + `db.create(tablename, columns, indexes=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引,sqlite暂不支持索引 + - `verbose`: 是否打印执行进度。 + + mysql + + 代码 + `db.create(tablename, columns, indexes=None, index_part=128, ismultiple_index=True, partition=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引 + - `index_part`: 索引part + - `ismultiple_index`: 多重索引 + - `partition`: 分区 + - `verbose`: 是否打印执行进度。 ++ insert[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.insert(tablename, columns, inserttype='value', values=None, chunksize=1000, fromtable=None, condition=None)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `inserttype`: 插入数据类型,支持value、select + * `values`: inserttype='value',插入的数值; + * `chunksize`: inserttype='value', 每个批次插入的量级; + * `fromtable`: inserttype='select',数据来源表; + * `condition`: inserttype='select',数据来源条件; ++ drop[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.drop(tablename)` + + params + * `tablename`: 表名; ++ delete[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.delete(tablename, condition)` + + params + * `tablename`: 表名; + * `condition`: 插入的数值; ++ get_columns + + 代码 + `db.get_columns(tablename)` + + params + * `tablename`: 表名; ++ add_columns + + 代码 + `db.add_columns(tablename, columns)` + + params + * `tablename`: 表名; + * `columns`: 列内容; ++ get_filesqls[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.get_filesqls(filepath, **kw)` + + params + * `filepath`: sql文件路径; + * `kw`: sql文件中需要替换的参数,会替换sqlfile中的arguments; ++ file_exec[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.file_exec(filepath, ehandling=None, verbose=0, **kw)` + + params + * `filepath`: sql文件路径; 文件名以`test`开始或者结尾会打印sql执行的步骤; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) + * `kw`: sql文件中需要替换的参数 在sql文件中用`$param`, 会替换sqlfile中的arguments; + + sql文件格式(在desc中增加`verbose`会打印sql执行的步骤;) + ```sql + #【arguments】# + ts = '2020-06-28' + date = today + date_max = date + timedelta(days=10) + #【arguments】# + ### + --【desc1 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2 where name = $name; + ### + ### + --【desc2 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2; + ### + ``` + + arguments + * 支持python表达式(datetime、date、timedelta) + * 支持全局变量和当前sqlfile设置过的变量 + * now:获取执行的时间 + * today: 获取执行的日期 + +## 支持的的settings[【conf/settings.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/conf/settings.py) ++ AUTO_RULES + 可以自动执行表名(表名包含即可) ++ REDSHIFT_AUTO_RULES + Amazon Redshift 可以自动执行表名(表名包含即可) + +## 调用日志格式 +1. 调用基础日志格式(已添加至工程init) +```python +import logging.config +from pydbapi.conf.settings import LOGGING_CONFIG +logging.config.dictConfig(LOGGING_CONFIG) +``` + + +2. 查看每步sql可以使用如下日志格式(如果还出错,同时加上上面的内容) +```python +import logging +dblogger = logging.getLogger('pydbapi.db.base') +dblogger.setLevel(logging.DEBUG) +``` + + +%package -n python3-pydbapi +Summary: A simple database API +Provides: python-pydbapi +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-pydbapi +# pydbapi + +## Installation +```python +pip install pydbapi +``` + +## 支持的数据库类型 ++ sqlite +```python +from pydbapi.api import SqliteDB +db = SqliteDB(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Amazon Redshift +```python +from pydbapi.api import RedshiftDB +db = RedshiftDB(host, user, password, database, port='5439', safe_rule=True) +sql = 'select * from [schema].[table];' +row, action, result = db.execute(sql) +``` ++ Mysql +```python +from pydbapi.api import MysqlDB +db = MysqlDB(host, user, password, database, port=3306, safe_rule=True, isdoris=False) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Snowflake(删除) +```python +from pydbapi.api import SnowflakeDB +db = SnowflakeDB(user, password, account, warehouse, database, schema, safe_rule=True) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + ++ instance模式 +```python +from pydbapi.api import SqliteDB +db = SqliteDB.get_instance(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + +## Column +`from pydbapi.col import ColumnModel` ++ ColumnModel + + 代码 + `col = ColumnModel(newname, coltype='varchar', sqlexpr=None, func=None, order=0)` + + params + * `newname`: 新命名; + * `coltype`: 类型 + * `sqlexpr`: 查询sql表达式 + * `func`: 查询函数,暂时支持'min', 'max', 'sum', 'count' + * `order`: 排序 + ++ ColumnsModel + + 代码 + `cols = ColumnsModel(ColumnModel, ColumnModel, ……)` + + property + * `func_cols`: 返回col列表 + * `nonfunc_cols`: 返回col列表 + * `new_cols`: 返回拼接字符串 + * `create_cols`: 返回拼接字符串 + * `select_cols`: 返回拼接字符串 + * `group_cols`: 返回拼接字符串 + * `order_cols`: 返回拼接字符串 + + mothed + * get_column_by_name + - `cols.get_column_by_name(name)` + - 返回`ColumnModel` +## 支持的操作 ++ execute[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.execute(sql, count=None, ehandling=None, verbose=0)` + + params + * `count`: 返回结果的数量; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) ++ select + + 代码 + `db.select(tablename, columns, condition=None, verbose=0)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `condition`: sql where 中的条件 ++ create + + sqlite/redshift + + 代码 + `db.create(tablename, columns, indexes=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引,sqlite暂不支持索引 + - `verbose`: 是否打印执行进度。 + + mysql + + 代码 + `db.create(tablename, columns, indexes=None, index_part=128, ismultiple_index=True, partition=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引 + - `index_part`: 索引part + - `ismultiple_index`: 多重索引 + - `partition`: 分区 + - `verbose`: 是否打印执行进度。 ++ insert[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.insert(tablename, columns, inserttype='value', values=None, chunksize=1000, fromtable=None, condition=None)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `inserttype`: 插入数据类型,支持value、select + * `values`: inserttype='value',插入的数值; + * `chunksize`: inserttype='value', 每个批次插入的量级; + * `fromtable`: inserttype='select',数据来源表; + * `condition`: inserttype='select',数据来源条件; ++ drop[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.drop(tablename)` + + params + * `tablename`: 表名; ++ delete[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.delete(tablename, condition)` + + params + * `tablename`: 表名; + * `condition`: 插入的数值; ++ get_columns + + 代码 + `db.get_columns(tablename)` + + params + * `tablename`: 表名; ++ add_columns + + 代码 + `db.add_columns(tablename, columns)` + + params + * `tablename`: 表名; + * `columns`: 列内容; ++ get_filesqls[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.get_filesqls(filepath, **kw)` + + params + * `filepath`: sql文件路径; + * `kw`: sql文件中需要替换的参数,会替换sqlfile中的arguments; ++ file_exec[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.file_exec(filepath, ehandling=None, verbose=0, **kw)` + + params + * `filepath`: sql文件路径; 文件名以`test`开始或者结尾会打印sql执行的步骤; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) + * `kw`: sql文件中需要替换的参数 在sql文件中用`$param`, 会替换sqlfile中的arguments; + + sql文件格式(在desc中增加`verbose`会打印sql执行的步骤;) + ```sql + #【arguments】# + ts = '2020-06-28' + date = today + date_max = date + timedelta(days=10) + #【arguments】# + ### + --【desc1 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2 where name = $name; + ### + ### + --【desc2 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2; + ### + ``` + + arguments + * 支持python表达式(datetime、date、timedelta) + * 支持全局变量和当前sqlfile设置过的变量 + * now:获取执行的时间 + * today: 获取执行的日期 + +## 支持的的settings[【conf/settings.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/conf/settings.py) ++ AUTO_RULES + 可以自动执行表名(表名包含即可) ++ REDSHIFT_AUTO_RULES + Amazon Redshift 可以自动执行表名(表名包含即可) + +## 调用日志格式 +1. 调用基础日志格式(已添加至工程init) +```python +import logging.config +from pydbapi.conf.settings import LOGGING_CONFIG +logging.config.dictConfig(LOGGING_CONFIG) +``` + + +2. 查看每步sql可以使用如下日志格式(如果还出错,同时加上上面的内容) +```python +import logging +dblogger = logging.getLogger('pydbapi.db.base') +dblogger.setLevel(logging.DEBUG) +``` + + +%package help +Summary: Development documents and examples for pydbapi +Provides: python3-pydbapi-doc +%description help +# pydbapi + +## Installation +```python +pip install pydbapi +``` + +## 支持的数据库类型 ++ sqlite +```python +from pydbapi.api import SqliteDB +db = SqliteDB(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Amazon Redshift +```python +from pydbapi.api import RedshiftDB +db = RedshiftDB(host, user, password, database, port='5439', safe_rule=True) +sql = 'select * from [schema].[table];' +row, action, result = db.execute(sql) +``` ++ Mysql +```python +from pydbapi.api import MysqlDB +db = MysqlDB(host, user, password, database, port=3306, safe_rule=True, isdoris=False) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` ++ Snowflake(删除) +```python +from pydbapi.api import SnowflakeDB +db = SnowflakeDB(user, password, account, warehouse, database, schema, safe_rule=True) +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + ++ instance模式 +```python +from pydbapi.api import SqliteDB +db = SqliteDB.get_instance(database=None) # 或者传入路径 +sql = 'select * from [table];' +row, action, result = db.execute(sql) +``` + +## Column +`from pydbapi.col import ColumnModel` ++ ColumnModel + + 代码 + `col = ColumnModel(newname, coltype='varchar', sqlexpr=None, func=None, order=0)` + + params + * `newname`: 新命名; + * `coltype`: 类型 + * `sqlexpr`: 查询sql表达式 + * `func`: 查询函数,暂时支持'min', 'max', 'sum', 'count' + * `order`: 排序 + ++ ColumnsModel + + 代码 + `cols = ColumnsModel(ColumnModel, ColumnModel, ……)` + + property + * `func_cols`: 返回col列表 + * `nonfunc_cols`: 返回col列表 + * `new_cols`: 返回拼接字符串 + * `create_cols`: 返回拼接字符串 + * `select_cols`: 返回拼接字符串 + * `group_cols`: 返回拼接字符串 + * `order_cols`: 返回拼接字符串 + + mothed + * get_column_by_name + - `cols.get_column_by_name(name)` + - 返回`ColumnModel` +## 支持的操作 ++ execute[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.execute(sql, count=None, ehandling=None, verbose=0)` + + params + * `count`: 返回结果的数量; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) ++ select + + 代码 + `db.select(tablename, columns, condition=None, verbose=0)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `condition`: sql where 中的条件 ++ create + + sqlite/redshift + + 代码 + `db.create(tablename, columns, indexes=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引,sqlite暂不支持索引 + - `verbose`: 是否打印执行进度。 + + mysql + + 代码 + `db.create(tablename, columns, indexes=None, index_part=128, ismultiple_index=True, partition=None, verbose=0)` + + params + - `tablename`: 表名; + - `columns`: 列内容; + - `indexes`: 索引 + - `index_part`: 索引part + - `ismultiple_index`: 多重索引 + - `partition`: 分区 + - `verbose`: 是否打印执行进度。 ++ insert[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.insert(tablename, columns, inserttype='value', values=None, chunksize=1000, fromtable=None, condition=None)` + + params + * `tablename`: 表名; + * `columns`: 列内容; + * `inserttype`: 插入数据类型,支持value、select + * `values`: inserttype='value',插入的数值; + * `chunksize`: inserttype='value', 每个批次插入的量级; + * `fromtable`: inserttype='select',数据来源表; + * `condition`: inserttype='select',数据来源条件; ++ drop[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.drop(tablename)` + + params + * `tablename`: 表名; ++ delete[【db/base.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/base.py) + + 代码 + `db.delete(tablename, condition)` + + params + * `tablename`: 表名; + * `condition`: 插入的数值; ++ get_columns + + 代码 + `db.get_columns(tablename)` + + params + * `tablename`: 表名; ++ add_columns + + 代码 + `db.add_columns(tablename, columns)` + + params + * `tablename`: 表名; + * `columns`: 列内容; ++ get_filesqls[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.get_filesqls(filepath, **kw)` + + params + * `filepath`: sql文件路径; + * `kw`: sql文件中需要替换的参数,会替换sqlfile中的arguments; ++ file_exec[【db/fileexec.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/db/fileexec.py) + + 代码 + `db.file_exec(filepath, ehandling=None, verbose=0, **kw)` + + params + * `filepath`: sql文件路径; 文件名以`test`开始或者结尾会打印sql执行的步骤; + * `ehandling`: sql执行出错的时候处理方式, default: None + * `verbose`: 执行的进度展示方式(0:不打印, 1:文字进度, 2:进度条) + * `kw`: sql文件中需要替换的参数 在sql文件中用`$param`, 会替换sqlfile中的arguments; + + sql文件格式(在desc中增加`verbose`会打印sql执行的步骤;) + ```sql + #【arguments】# + ts = '2020-06-28' + date = today + date_max = date + timedelta(days=10) + #【arguments】# + ### + --【desc1 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2 where name = $name; + ### + ### + --【desc2 [verbose]】 #sql描述 + --step1 + sql1; + --step2 + sql2; + ### + ``` + + arguments + * 支持python表达式(datetime、date、timedelta) + * 支持全局变量和当前sqlfile设置过的变量 + * now:获取执行的时间 + * today: 获取执行的日期 + +## 支持的的settings[【conf/settings.py】](https://github.com/longfengpili/pydbapi/blob/master/pydbapi/conf/settings.py) ++ AUTO_RULES + 可以自动执行表名(表名包含即可) ++ REDSHIFT_AUTO_RULES + Amazon Redshift 可以自动执行表名(表名包含即可) + +## 调用日志格式 +1. 调用基础日志格式(已添加至工程init) +```python +import logging.config +from pydbapi.conf.settings import LOGGING_CONFIG +logging.config.dictConfig(LOGGING_CONFIG) +``` + + +2. 查看每步sql可以使用如下日志格式(如果还出错,同时加上上面的内容) +```python +import logging +dblogger = logging.getLogger('pydbapi.db.base') +dblogger.setLevel(logging.DEBUG) +``` + + +%prep +%autosetup -n pydbapi-0.0.106 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-pydbapi -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 10 2023 Python_Bot - 0.0.106-1 +- Package Spec generated diff --git a/sources b/sources new file mode 100644 index 0000000..d337b22 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +3eb4d1aabc13f03b881a135ec4e4d396 pydbapi-0.0.106.tar.gz -- cgit v1.2.3