# luban
## Why Need?
The feature-processing module is used in different scenarios, such as: model training and model inference. Usually, we use Python to train models, and feature-processing is also done in Python. However, in model inference, the shorter the inference run time, the better. So we usually use C++/java/golang or other languages to do model inference. If feature-process module is written in many different languages, they may be inconsistencies. So, we decide to develop such a module in C++, which can be used by other different languages. In addition, we use a json configuration for feature processing, so that it will be easier to use.
## Supported libraries and tools
1. c/c++ lib: libluban
2. python lib: pyluban
## Configuration
```json
{
"user_features": [
{
"name": "U1",
"expr": "A*B",
"type": 1,
"hash": false,
"padding": 0,
"dim": 1
},
{
"name": "U2",
"expr": "C[int64]+D[int64]",
"type": 0,
"hash": false,
"padding": 0,
"dim": 1
}
],
"item_features": [
{
"name": "I1",
"expr": "F[int64]+G[int64]",
"type": 0,
"hash": false,
"padding": 0,
"dim": 1
},
{
"name": "I2",
"expr": "concat(H[string],\"TEST\")",
"type": 0,
"hash": true,
"padding": 0,
"dim": 1
}
],
"groups": [
[
"U1"
],
[
"U2"
],
[
"I1",
"I2"
]
]
}
```
### features
Configure the relevant properties for each feature.
| Properties | Type | Empty | Default | Description |
| ---------- | ------------- | ----- | ------- | ------------------------------------------------------------------------------------------------------ |
| name | string | N | - | name of feature |
| expr | string | Y | "" | how to process feature |
| type | int | N | - | 0: int64,<br/>1: float3,<br/>2: string<br/>3: vector\<int64\><br/>4: vector\<float\><br/>5: vector\<string\> |
| hash | bool | Y | false | hash or not |
| padding | int64/float32 | Y | 0/0.0 | fill value |
| dim | int | Y | 1 | dim of result |
### groups
After processing, different features may be placed in different groups. Because the downstream user is pytorch, different types of data are inconvenient to put in a tensor. The final output order of the features is the same as the order configured in the group. **All features configured in groups need to be configured in the features above**.
## Parse Expression
After installing the Python tool, the `luban_parser` tool is installed by default in /usr/local/bin. This tool is used to parse the above JSON configuration and generate the configuration using the JSON format used by C++. The expressions here are similar to Python's syntax. Originally, we wanted to use antlr to customize the DSL, but after thinking about it, we thought that it could be as simple as possible. As a result, it was finally decided to parse expressions using Python's built-in ast.
### Operators
1. opr: +, -, *, /, %, **
2. math function: round, floor, ceil, floorf, ceilf, log, exp, log10, log2, sqrt, abs, sin, sinh, asin,asinh, cos, cosh, acos, acosh, tan, tanh, atan, atanh, sigmoid
3. aggravate function: min, max, variance, stddev, average, norm
4. time function: year, month, day, hour, minute, second, date, now, date_diff, date_add, date_sub, from_unixtime, unix_timestamp
5. string function: concat, substr, lower, upper, cross, reverse
6. topk function: topki, topkf, topks
7. other function: min_max, z_score, binarize, bucketize, box_cox, normalize
```c
// The following is a list of supported operations
// If it is a template type, you can add the type feature when configuring the function name
// e.g.: _add<int64_t>, _add<float>
// If you do not add type information, the float type is defaulted
// In practice, the tool does some built-in implicit data type conversions
T _add(T &a, T &b);
T _sub(T &a, T &b);
T _mul(T &a, T &b);
T _div(T &a, T &b);
int64_t _mod(int64_t &a, int64_t &b);
float _pow(float &a, float &b);
int64_t _round(float &x);
int64_t _floor(float &x);
int64_t _ceil(float &x);
float _log(float &x);
float _exp(float &x);
float _log10(float &x);
float _log2(float &x);
float _sqrt(float &x);
float _abs(float &x);
float _sin(float &x);
float _asin(float &x);
float _sinh(float &x);
float _asinh(float &x);
float _cos(float &x);
float _acos(float &x);
float _cosh(float &x);
float _acosh(float &x);
float _tan(float &x);
float _atan(float &x);
float _tanh(float &x);
float _atanh(float &x);
float _sigmoid(float &x);
T min(std::vector<float> &src);
T max(std::vector<T> &src);
float average(std::vector<T> &src);
float variance(std::vector<T> &src);
float stddev(std::vector<T> &src);
float norm(std::vector<T> &src, float &n);
std::string year();
std::string month();
std::string day();
std::string date();
std::string hour();
std::string minute();
std::string second();
int64_t now();
std::string from_unixtime(int64_t &ts, std::string &format);
int64_t unix_timestamp(std::string &t, std::string &format);
std::string date_add(std::string &s, int64_t &n);
std::string date_sub(std::string &s, int64_t &n);
int64_t date_diff(std::string &d1, std::string &d2);
std::string reverse(std::string &s);
std::string upper(std::string &s);
std::string lower(std::string &s);
std::string substr(std::string &s, int64_t &start, int64_t &len);
std::string concat(std::string &a, std::string &b);
float min_max(T &v, T &min, T &max);
float z_score(float &v, float &mean, float &stdv);
int64_t binarize(T &v, T &threshold);
int64_t bucketize(T &v, std::vector<T> &boundaries);
float box_cox(float &v, float &lambda);
std::vector<float> normalize(std::vector<T> &src, float &norm);
std::vector<T> topk(std::vector<T> &src, int64_t &k);
std::vector<std::string> cross(std::vector<std::string> &srcA,
std::vector<std::string> &srcB);
```
## Usage
1. Follow the installation prompts in the next section to compile and install the tool
2. Include header files and add libluban to dynamic link paths
3. Steps:
1. step1: Configure the JSON file
2. use `luban_parser` to process JSON configuration files and generate configuration files in JSON format
3. Use the configuration file in JSON format as a configuration input for C/C++/Golang/Python
## Install
### install On MacOS ARM
```shell
pip install pyluban
```
### Unix Like
```shell
python setup.py install --install-scripts=/usr/local/bin
pip install pyluban
```
## Examples
### Features & FeaturesList
The structure of the features is as follows:
```json
// json format
{
"A": { // key is the name of feature
"type": 0, // type listed above
"value": 10 // certain value
},
"B": {
"type": 1,
"value": 10.9
},
...
}
```
how to parse features in python
```python
import json
import pyluban
feas = {"A": {"type": 0,"value": 10},...}
feas_str = json.dumps(feas)
# arg is str
features = pyluban.Features(feas_str)
# arg is str list
features = pyluban.Features([feas_str1, feas_str2, feas_str3])
# arg is nil
features = pyluban.Features()
# create a featureslist
l = pyluban.FeatuersList()
# add a value
l.append(features)
print(l[0])
print(l)
l[0] = features
```
## Function
This is the configuration of function processing, usually, **users generally do not use**, will be used when doing unit tests, and are also explained here.
```json
{
"func":"_add<int64_t>",
"name":"X",
"flag":3,
"args": [],
"vars": ["A","B"]
}
```
| Properties | Type | Description |
| ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| func | string | function name |
| name | string | name of generated feature |
| flag | int64 | Flag bits for each parameter: In the binary bit of flag, the ith bit is 1 to indicate that the input is a variable; Otherwise, it is constant |
| args | list of dict | same structure of features |
| vars | list of str | variable name list |
## Toolkit
By configuring the class for feature processing entry, the consumer mainly uses this class to process features.
```python
import pyluban
import luban_parser
# this is the original config file
"""
{
"features": [
{
"name": "A",
"expr": "(B+C)*F",
"type": 0,
"hash": false,
"padding": 0,
"dim": 1
},
{
"name": "B",
"type": 0,
"padding": 0,
"dim": 1
},
{
"name": "C",
"type": 0,
"padding": 0,
"dim": 1
},
{
"name": "D",
"expr": "concat(\"prefix-\", E)",
"type": 0,
"hash": true,
"padding": 0,
"dim": 3
}
],
"groups": [
[
"A",
"B"
],
[
"D"
]
]
}
"""
luban_parser.parser(input_file: str, output_file: str)
# this is the output file of luban_parser
"""
{
"transforms": [
{
"func": "_add<int64_t>",
"name": "anonymous_0",
"flag": 3,
"args": [],
"vars": [
"B",
"C"
]
},
{
"func": "_mul<int64_t>",
"name": "A",
"flag": 3,
"args": [],
"vars": [
"anonymous_0",
"F"
]
},
{
"func": "concat",
"name": "D",
"flag": 2,
"args": [
{
"type": 2,
"value": "prefix-"
}
],
"vars": [
"E"
]
}
],
"groups": [
{
"id": 0,
"width": 2,
"type": 0
},
{
"id": 1,
"width": 3,
"type": 0
}
],
"features": [
{
"name": "A",
"type": 0,
"padding": 0,
"group": 0,
"offset": 0,
"hash": false,
"dim": 1
},
{
"name": "B",
"type": 0,
"padding": 0,
"group": 0,
"offset": 1,
"hash": false,
"dim": 1
},
{
"name": "D",
"type": 0,
"padding": 0,
"group": 1,
"offset": 0,
"hash": true,
"dim": 3
}
]
}
"""
# config.json is the file after configuration processing,
# and the above is an example of the file content of the configuration
toolkit = pyluban.Toolkit("config.json")
```
#### Rows
In the case of only one feature, Rows is a list object with a length of the number of groups configured above, which can be accessed via subscripts and then converted into numpy structures.
```python
# r pyluban:Rows type
r = toolkit.process(features: pyluban.Features)
for i in range(len(r)):
print(np.asarray(r[i]))
```
#### Matrices
Matrices is a list object with a length of the number of groups configured above, which can be accessed by subscripts and then converted into a numpy structure.
```python
l = pyluban.FeaturesList()
l.append(features: pyluban.Features)
m = self.toolkit.process(l)
for i in range(len(m)):
print(np.asarray(m[i]))
```
Raw data
{
"_id": null,
"home_page": "https://github.com/uopensail/luban",
"name": "pyluban",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "feature operator and hasher",
"author": "uopensail",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/8d/c2/fcb661bf329310c6d23937287a532c64cf1401939177acfe88192a89a90b/pyluban-1.1.6.tar.gz",
"platform": null,
"description": "# luban\n\n## Why Need?\n\nThe feature-processing module is used in different scenarios, such as: model training and model inference. Usually, we use Python to train models, and feature-processing is also done in Python. However, in model inference, the shorter the inference run time, the better. So we usually use C++/java/golang or other languages to do model inference. If feature-process module is written in many different languages, they may be inconsistencies. So, we decide to develop such a module in C++, which can be used by other different languages. In addition, we use a json configuration for feature processing, so that it will be easier to use.\n\n\n\n## Supported libraries and tools\n\n1. c/c++ lib: libluban\n2. python lib: pyluban\n\n\n\n## Configuration\n\n```json\n{\n \"user_features\": [\n {\n \"name\": \"U1\",\n \"expr\": \"A*B\",\n \"type\": 1,\n \"hash\": false,\n \"padding\": 0,\n \"dim\": 1\n },\n {\n \"name\": \"U2\",\n \"expr\": \"C[int64]+D[int64]\",\n \"type\": 0,\n \"hash\": false,\n \"padding\": 0,\n \"dim\": 1\n }\n ],\n \"item_features\": [\n {\n \"name\": \"I1\",\n \"expr\": \"F[int64]+G[int64]\",\n \"type\": 0,\n \"hash\": false,\n \"padding\": 0,\n \"dim\": 1\n },\n {\n \"name\": \"I2\",\n \"expr\": \"concat(H[string],\\\"TEST\\\")\",\n \"type\": 0,\n \"hash\": true,\n \"padding\": 0,\n \"dim\": 1\n }\n ],\n \"groups\": [\n [\n \"U1\"\n ],\n [\n \"U2\"\n ],\n [\n \"I1\",\n \"I2\"\n ]\n ]\n}\n```\n\n### features\n\nConfigure the relevant properties for each feature.\n\n| Properties | Type | Empty | Default | Description |\n| ---------- | ------------- | ----- | ------- | ------------------------------------------------------------------------------------------------------ |\n| name | string | N | - | name of feature |\n| expr | string | Y | \"\" | how to process feature |\n| type | int | N | - | 0: int64,<br/>1: float3,<br/>2: string<br/>3: vector\\<int64\\><br/>4: vector\\<float\\><br/>5: vector\\<string\\> |\n| hash | bool | Y | false | hash or not |\n| padding | int64/float32 | Y | 0/0.0 | fill value |\n| dim | int | Y | 1 | dim of result |\n\n### groups\n\nAfter processing, different features may be placed in different groups. Because the downstream user is pytorch, different types of data are inconvenient to put in a tensor. The final output order of the features is the same as the order configured in the group. **All features configured in groups need to be configured in the features above**.\n\n\n\n## Parse Expression\n\nAfter installing the Python tool, the\u00a0`luban_parser`\u00a0tool is installed by default in /usr/local/bin. This tool is used to parse the above JSON configuration and generate the configuration using the JSON format used by C++. The expressions here are similar to Python's syntax. Originally, we wanted to use antlr to customize the DSL, but after thinking about it, we thought that it could be as simple as possible. As a result, it was finally decided to parse expressions using Python's built-in ast.\n\n\n\n### Operators\n\n1. opr: +, -, *, /, %, **\n2. math function: round, floor, ceil, floorf, ceilf, log, exp, log10, log2, sqrt, abs, sin, sinh, asin,asinh, cos, cosh, acos, acosh, tan, tanh, atan, atanh, sigmoid\n3. aggravate function: min, max, variance, stddev, average, norm\n4. time function: year, month, day, hour, minute, second, date, now, date_diff, date_add, date_sub, from_unixtime, unix_timestamp\n5. string function: concat, substr, lower, upper, cross, reverse\n6. topk function: topki, topkf, topks\n7. other function: min_max, z_score, binarize, bucketize, box_cox, normalize\n\n\n\n```c\n// The following is a list of supported operations\n// If it is a template type, you can add the type feature when configuring the function name\n// e.g.: _add<int64_t>, _add<float>\n// If you do not add type information, the float type is defaulted\n// In practice, the tool does some built-in implicit data type conversions\n\nT _add(T &a, T &b);\nT _sub(T &a, T &b);\nT _mul(T &a, T &b);\nT _div(T &a, T &b);\nint64_t _mod(int64_t &a, int64_t &b);\nfloat _pow(float &a, float &b);\nint64_t _round(float &x);\nint64_t _floor(float &x);\nint64_t _ceil(float &x);\nfloat _log(float &x);\nfloat _exp(float &x);\nfloat _log10(float &x);\nfloat _log2(float &x);\nfloat _sqrt(float &x);\nfloat _abs(float &x);\nfloat _sin(float &x);\nfloat _asin(float &x);\nfloat _sinh(float &x);\nfloat _asinh(float &x);\nfloat _cos(float &x);\nfloat _acos(float &x);\nfloat _cosh(float &x);\nfloat _acosh(float &x);\nfloat _tan(float &x);\nfloat _atan(float &x);\nfloat _tanh(float &x);\nfloat _atanh(float &x);\nfloat _sigmoid(float &x);\nT min(std::vector<float> &src);\nT max(std::vector<T> &src);\nfloat average(std::vector<T> &src);\nfloat variance(std::vector<T> &src);\nfloat stddev(std::vector<T> &src);\nfloat norm(std::vector<T> &src, float &n);\nstd::string year();\nstd::string month();\nstd::string day();\nstd::string date();\nstd::string hour();\nstd::string minute();\nstd::string second();\nint64_t now();\nstd::string from_unixtime(int64_t &ts, std::string &format);\nint64_t unix_timestamp(std::string &t, std::string &format);\nstd::string date_add(std::string &s, int64_t &n);\nstd::string date_sub(std::string &s, int64_t &n);\nint64_t date_diff(std::string &d1, std::string &d2);\nstd::string reverse(std::string &s);\nstd::string upper(std::string &s);\nstd::string lower(std::string &s);\nstd::string substr(std::string &s, int64_t &start, int64_t &len);\nstd::string concat(std::string &a, std::string &b);\nfloat min_max(T &v, T &min, T &max);\nfloat z_score(float &v, float &mean, float &stdv);\nint64_t binarize(T &v, T &threshold);\nint64_t bucketize(T &v, std::vector<T> &boundaries);\nfloat box_cox(float &v, float &lambda);\nstd::vector<float> normalize(std::vector<T> &src, float &norm);\nstd::vector<T> topk(std::vector<T> &src, int64_t &k);\nstd::vector<std::string> cross(std::vector<std::string> &srcA,\n std::vector<std::string> &srcB);\n```\n\n## Usage\n\n1. Follow the installation prompts in the next section to compile and install the tool\n\n2. Include header files and add libluban to dynamic link paths\n\n3. Steps:\n \n 1. step1: Configure the JSON file\n 2. use\u00a0`luban_parser`\u00a0to process JSON configuration files and generate configuration files in JSON format\n 3. Use the configuration file in JSON format as a configuration input for C/C++/Golang/Python\n\n\n\n## Install\n\n### install On MacOS ARM\n\n```shell\npip install pyluban\n```\n\n### Unix Like\n\n```shell\npython setup.py install --install-scripts=/usr/local/bin\n\npip install pyluban\n```\n\n## Examples\n\n### Features & FeaturesList\n\nThe structure of the features is as follows:\n\n```json\n// json format\n{\n \"A\": { // key is the name of feature\n \"type\": 0, // type listed above\n \"value\": 10 // certain value\n },\n \"B\": {\n \"type\": 1, \n \"value\": 10.9 \n },\n ...\n}\n```\n\nhow to parse features in python\n\n```python\nimport json\nimport pyluban\nfeas = {\"A\": {\"type\": 0,\"value\": 10},...}\n\nfeas_str = json.dumps(feas)\n\n# arg is str\nfeatures = pyluban.Features(feas_str)\n\n# arg is str list\nfeatures = pyluban.Features([feas_str1, feas_str2, feas_str3])\n\n# arg is nil\nfeatures = pyluban.Features()\n\n# create a featureslist\nl = pyluban.FeatuersList()\n\n# add a value\nl.append(features)\n\nprint(l[0])\nprint(l)\n\nl[0] = features\n```\n\n## Function\n\nThis is the configuration of function processing, usually, **users generally do not use**, will be used when doing unit tests, and are also explained here.\n\n```json\n{\n \"func\":\"_add<int64_t>\",\n \"name\":\"X\",\n \"flag\":3,\n \"args\": [],\n \"vars\": [\"A\",\"B\"]\n}\n```\n\n| Properties | Type | Description |\n| ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| func | string | function name |\n| name | string | name of generated feature |\n| flag | int64 | Flag bits for each parameter: In the binary bit of flag, the ith bit is 1 to indicate that the input is a variable; Otherwise, it is constant |\n| args | list of dict | same\u00a0structure of features |\n| vars | list of str | variable name list |\n\n## Toolkit\n\nBy configuring the class for feature processing entry, the consumer mainly uses this class to process features.\n\n```python\nimport pyluban\nimport luban_parser\n# this is the original config file\n\"\"\"\n{\n \"features\": [\n {\n \"name\": \"A\",\n \"expr\": \"(B+C)*F\",\n \"type\": 0,\n \"hash\": false,\n \"padding\": 0,\n \"dim\": 1\n },\n {\n \"name\": \"B\",\n \"type\": 0,\n \"padding\": 0,\n \"dim\": 1\n },\n {\n \"name\": \"C\",\n \"type\": 0,\n \"padding\": 0,\n \"dim\": 1\n },\n {\n \"name\": \"D\",\n \"expr\": \"concat(\\\"prefix-\\\", E)\",\n \"type\": 0,\n \"hash\": true,\n \"padding\": 0,\n \"dim\": 3\n }\n ],\n \"groups\": [\n [\n \"A\",\n \"B\"\n ],\n [\n \"D\"\n ]\n ]\n}\n\"\"\"\n\nluban_parser.parser(input_file: str, output_file: str)\n\n# this is the output file of luban_parser\n\n\"\"\"\n{\n \"transforms\": [\n {\n \"func\": \"_add<int64_t>\",\n \"name\": \"anonymous_0\",\n \"flag\": 3,\n \"args\": [],\n \"vars\": [\n \"B\",\n \"C\"\n ]\n },\n {\n \"func\": \"_mul<int64_t>\",\n \"name\": \"A\",\n \"flag\": 3,\n \"args\": [],\n \"vars\": [\n \"anonymous_0\",\n \"F\"\n ]\n },\n {\n \"func\": \"concat\",\n \"name\": \"D\",\n \"flag\": 2,\n \"args\": [\n {\n \"type\": 2,\n \"value\": \"prefix-\"\n }\n ],\n \"vars\": [\n \"E\"\n ]\n }\n ],\n \"groups\": [\n {\n \"id\": 0,\n \"width\": 2,\n \"type\": 0\n },\n {\n \"id\": 1,\n \"width\": 3,\n \"type\": 0\n }\n ],\n \"features\": [\n {\n \"name\": \"A\",\n \"type\": 0,\n \"padding\": 0,\n \"group\": 0,\n \"offset\": 0,\n \"hash\": false,\n \"dim\": 1\n },\n {\n \"name\": \"B\",\n \"type\": 0,\n \"padding\": 0,\n \"group\": 0,\n \"offset\": 1,\n \"hash\": false,\n \"dim\": 1\n },\n {\n \"name\": \"D\",\n \"type\": 0,\n \"padding\": 0,\n \"group\": 1,\n \"offset\": 0,\n \"hash\": true,\n \"dim\": 3\n }\n ]\n}\n\"\"\"\n# config.json is the file after configuration processing, \n# and the above is an example of the file content of the configuration\ntoolkit = pyluban.Toolkit(\"config.json\")\n```\n\n#### Rows\n\nIn the case of only one feature, Rows is a list object with a length of the number of groups configured above, which can be accessed via subscripts and then converted into numpy structures.\n\n```python\n# r pyluban:Rows type\nr = toolkit.process(features: pyluban.Features)\n\n\nfor i in range(len(r)):\n print(np.asarray(r[i]))\n```\n\n#### Matrices\n\nMatrices is a list object with a length of the number of groups configured above, which can be accessed by subscripts and then converted into a numpy structure.\n\n```python\nl = pyluban.FeaturesList()\nl.append(features: pyluban.Features)\n\nm = self.toolkit.process(l)\n\nfor i in range(len(m)):\n print(np.asarray(m[i]))\n```\n",
"bugtrack_url": null,
"license": "License :: AGLP 3",
"summary": "Python wrapper for luban.",
"version": "1.1.6",
"project_urls": {
"Homepage": "https://github.com/uopensail/luban"
},
"split_keywords": [
"feature",
"operator",
"and",
"hasher"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dc01a013bf36642eefe37922b2b8900c0e9c297ed8063fb4dfef8092b785e069",
"md5": "4c37cf6e246ecd49bcbfa7b2c920a4e5",
"sha256": "80fac6c784e0fe400b41e68b36ea7298ea10d000ad3042f50e6aeca9c2307f44"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "4c37cf6e246ecd49bcbfa7b2c920a4e5",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 214723,
"upload_time": "2024-02-01T00:48:50",
"upload_time_iso_8601": "2024-02-01T00:48:50.722184Z",
"url": "https://files.pythonhosted.org/packages/dc/01/a013bf36642eefe37922b2b8900c0e9c297ed8063fb4dfef8092b785e069/pyluban-1.1.6-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f0237746f4444607b50998963f829aa120f8d3a1e8ad7bb882116149df00d7f8",
"md5": "f2bd5a55aeb60069df23d3cf251d674a",
"sha256": "7777b0b0b591a2ed928822e6274803a95aba1c07140e0f2d6b9138f390132340"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f2bd5a55aeb60069df23d3cf251d674a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 201862,
"upload_time": "2024-02-01T00:48:53",
"upload_time_iso_8601": "2024-02-01T00:48:53.263641Z",
"url": "https://files.pythonhosted.org/packages/f0/23/7746f4444607b50998963f829aa120f8d3a1e8ad7bb882116149df00d7f8/pyluban-1.1.6-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "038b697b1c7af1c3f6af784a97208f4baefee32ecdf9c630af41e4bdfabe96b5",
"md5": "04c30536cbd79cd29eb27d0645e63244",
"sha256": "81c5eb6b221ead93130a2fec7c306ad8e4c981f3aa3c1432f6f3f0a27d5a1a8d"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "04c30536cbd79cd29eb27d0645e63244",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 264071,
"upload_time": "2024-02-01T00:48:55",
"upload_time_iso_8601": "2024-02-01T00:48:55.292765Z",
"url": "https://files.pythonhosted.org/packages/03/8b/697b1c7af1c3f6af784a97208f4baefee32ecdf9c630af41e4bdfabe96b5/pyluban-1.1.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "df1cae28164c5b11a44ac06e57d866b951cf317852192eafcba029548d6d7db3",
"md5": "b5176d92111eca50e8f3a2cfdd504f91",
"sha256": "9b5d8a7f8177679dd91cd7afb0b098bbe9c386adc119e52b540c857e63e705a1"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b5176d92111eca50e8f3a2cfdd504f91",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 278554,
"upload_time": "2024-02-01T00:48:57",
"upload_time_iso_8601": "2024-02-01T00:48:57.379462Z",
"url": "https://files.pythonhosted.org/packages/df/1c/ae28164c5b11a44ac06e57d866b951cf317852192eafcba029548d6d7db3/pyluban-1.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "661bcddc43aeb1dd07d8f9bfa4741beea2680b9a0d22877db9183b25e9461d4c",
"md5": "2f441a9449e8decf1076c0a9e0c8c58f",
"sha256": "ea4f39387f3bdfa5ab897af5524c87611802a45bbeec096c25bdb179b122ed8a"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "2f441a9449e8decf1076c0a9e0c8c58f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 216037,
"upload_time": "2024-02-01T00:48:59",
"upload_time_iso_8601": "2024-02-01T00:48:59.368816Z",
"url": "https://files.pythonhosted.org/packages/66/1b/cddc43aeb1dd07d8f9bfa4741beea2680b9a0d22877db9183b25e9461d4c/pyluban-1.1.6-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8e471590d0c1c22b8ac5d51e51135b5798754f58ab1aece60bd88d696f8cec3f",
"md5": "423e70de4582022f31e99f207d09f990",
"sha256": "87e7f7f615b5d6652165fea25f50f688dd3d298fa4701409899485374cbad189"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "423e70de4582022f31e99f207d09f990",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 203159,
"upload_time": "2024-02-01T00:49:01",
"upload_time_iso_8601": "2024-02-01T00:49:01.009161Z",
"url": "https://files.pythonhosted.org/packages/8e/47/1590d0c1c22b8ac5d51e51135b5798754f58ab1aece60bd88d696f8cec3f/pyluban-1.1.6-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6aa88468339331f3f094c776d7613ee645599cae811d1695d2181fabdc96f113",
"md5": "5ecc42f8d2469ce541f8008e42ceabd3",
"sha256": "002503a400283a812884120b9971043e3aadbf4d129f40e2b1b3a5470809bc88"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "5ecc42f8d2469ce541f8008e42ceabd3",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 264052,
"upload_time": "2024-02-01T00:49:02",
"upload_time_iso_8601": "2024-02-01T00:49:02.461934Z",
"url": "https://files.pythonhosted.org/packages/6a/a8/8468339331f3f094c776d7613ee645599cae811d1695d2181fabdc96f113/pyluban-1.1.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "41a047f0910c8628ffabe084fc40f1c709f39cc1254cd61257d15a03547f0788",
"md5": "d8a1d23bbb28a9467d87df068033dd27",
"sha256": "7393a902b420e95509dbde93f3d56728ddec7fc86876421d7ec24cbce3d94bdc"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d8a1d23bbb28a9467d87df068033dd27",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.6",
"size": 278675,
"upload_time": "2024-02-01T00:49:04",
"upload_time_iso_8601": "2024-02-01T00:49:04.088376Z",
"url": "https://files.pythonhosted.org/packages/41/a0/47f0910c8628ffabe084fc40f1c709f39cc1254cd61257d15a03547f0788/pyluban-1.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "771f001b8a5f03a274a1e365e954e5c84e9ed3836b528911a3c500d3f126308e",
"md5": "fae982cc284cd166c0f4630ef88578df",
"sha256": "6a9996a90dadf3f3b1340e8f08bc2e6ff3a7e0d3da3138423b96bcbcf3391b55"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp312-cp312-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "fae982cc284cd166c0f4630ef88578df",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.6",
"size": 215453,
"upload_time": "2024-02-01T00:49:06",
"upload_time_iso_8601": "2024-02-01T00:49:06.138885Z",
"url": "https://files.pythonhosted.org/packages/77/1f/001b8a5f03a274a1e365e954e5c84e9ed3836b528911a3c500d3f126308e/pyluban-1.1.6-cp312-cp312-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dd977e2c76d822697be431b6c2a5ee184d79fd9b49e56716885e6ea641606ea8",
"md5": "03dc034249d4a1de17e62adbc195785d",
"sha256": "31d5d63427c4f65f57a518f16750a29eed4114259eb98d58fab7e8cdf8873164"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "03dc034249d4a1de17e62adbc195785d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.6",
"size": 201982,
"upload_time": "2024-02-01T00:49:08",
"upload_time_iso_8601": "2024-02-01T00:49:08.269778Z",
"url": "https://files.pythonhosted.org/packages/dd/97/7e2c76d822697be431b6c2a5ee184d79fd9b49e56716885e6ea641606ea8/pyluban-1.1.6-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ce1b3026f9e2c9331001535d139ab842ba6a55e5447655523110a138a2cf482f",
"md5": "8d58fff10b0d90ac4cc74988517c71f3",
"sha256": "9eacf4ff4f3d66062e5046ba36f3859e5812e856782147b17cd6535300235a7f"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "8d58fff10b0d90ac4cc74988517c71f3",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.6",
"size": 264939,
"upload_time": "2024-02-01T00:49:10",
"upload_time_iso_8601": "2024-02-01T00:49:10.235978Z",
"url": "https://files.pythonhosted.org/packages/ce/1b/3026f9e2c9331001535d139ab842ba6a55e5447655523110a138a2cf482f/pyluban-1.1.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "278d4d45da9a7a75135332ade7eb277fbc1bf57d00bd97aeed4bdaa5cc2fe283",
"md5": "c5f1c4205b7ad835e9d688c8bb532703",
"sha256": "5ddfc4b908c4f1e82c12d544cbc02d91578da86ab949712404a3060c10e0070d"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c5f1c4205b7ad835e9d688c8bb532703",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.6",
"size": 278536,
"upload_time": "2024-02-01T00:49:11",
"upload_time_iso_8601": "2024-02-01T00:49:11.697294Z",
"url": "https://files.pythonhosted.org/packages/27/8d/4d45da9a7a75135332ade7eb277fbc1bf57d00bd97aeed4bdaa5cc2fe283/pyluban-1.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e45ed2245fc5b20c0bcb91441eabe94eb85703ca70b1fde315228693593c1fd2",
"md5": "5a9abcb0e273f55ec63a60100bc12a47",
"sha256": "69d807626db836f67f251eb88b7923b6f9bd9bbfd0b6883590d654ad6ac2fffe"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp36-cp36m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "5a9abcb0e273f55ec63a60100bc12a47",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 213902,
"upload_time": "2024-02-01T00:49:13",
"upload_time_iso_8601": "2024-02-01T00:49:13.699602Z",
"url": "https://files.pythonhosted.org/packages/e4/5e/d2245fc5b20c0bcb91441eabe94eb85703ca70b1fde315228693593c1fd2/pyluban-1.1.6-cp36-cp36m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ee84710173f36ef2168c5608274048ad7876fda71a066c56007527b51f9b7edb",
"md5": "93f1b51e6bb7f82e00cff9bc1540c3e0",
"sha256": "faba14c14fd428687afc41026d5a20bbfee0fc7cd122401726bfc9a43a20fd2d"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "93f1b51e6bb7f82e00cff9bc1540c3e0",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 265390,
"upload_time": "2024-02-01T00:49:15",
"upload_time_iso_8601": "2024-02-01T00:49:15.200432Z",
"url": "https://files.pythonhosted.org/packages/ee/84/710173f36ef2168c5608274048ad7876fda71a066c56007527b51f9b7edb/pyluban-1.1.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7fffbdf3451fd60acb1e811a796d65541cf87d9750a1ac1ccbfc4a6ef5a779af",
"md5": "d138c5a91d2b5bf72c044dcd85bf0207",
"sha256": "ca26e3e819528e33d5cc09910437da039f01190c551ed9d2de85ba18b785e3d2"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d138c5a91d2b5bf72c044dcd85bf0207",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 278538,
"upload_time": "2024-02-01T00:49:16",
"upload_time_iso_8601": "2024-02-01T00:49:16.639118Z",
"url": "https://files.pythonhosted.org/packages/7f/ff/bdf3451fd60acb1e811a796d65541cf87d9750a1ac1ccbfc4a6ef5a779af/pyluban-1.1.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c3fe7ec43017c089bba07f0df9ef88d62b765eb328d93536ba9949786a0f6703",
"md5": "f58ea44de84b83da9fc8ab5b5f5e8dc8",
"sha256": "53fa8b377efc9b4904da7a327deb81dab2342a353206a712d606b8080f2fa01b"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp37-cp37m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "f58ea44de84b83da9fc8ab5b5f5e8dc8",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 214102,
"upload_time": "2024-02-01T00:49:18",
"upload_time_iso_8601": "2024-02-01T00:49:18.141416Z",
"url": "https://files.pythonhosted.org/packages/c3/fe/7ec43017c089bba07f0df9ef88d62b765eb328d93536ba9949786a0f6703/pyluban-1.1.6-cp37-cp37m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "664a51b2ac4705aa32c2c4fe2c53acdda7ef72e2aafb0bea458790ae46b9c2df",
"md5": "464ef7c6979568e1601f551deec90cb1",
"sha256": "90b7486aa83b44e4bae4d4a2651ed8e35a305011aa3f9867f6849f2d2c7a84ac"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "464ef7c6979568e1601f551deec90cb1",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 265334,
"upload_time": "2024-02-01T00:49:19",
"upload_time_iso_8601": "2024-02-01T00:49:19.562080Z",
"url": "https://files.pythonhosted.org/packages/66/4a/51b2ac4705aa32c2c4fe2c53acdda7ef72e2aafb0bea458790ae46b9c2df/pyluban-1.1.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "db2085e9b0d5240804f55853b884473dd89f510aaff02b617e454a3ce6917e6e",
"md5": "980cca427fe0d8c0ac3024d642aeba2b",
"sha256": "5b77555f9121341253a12353a84c617ee56320fd693ccc0ea88d13aed8992a88"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "980cca427fe0d8c0ac3024d642aeba2b",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 278325,
"upload_time": "2024-02-01T00:49:21",
"upload_time_iso_8601": "2024-02-01T00:49:21.247468Z",
"url": "https://files.pythonhosted.org/packages/db/20/85e9b0d5240804f55853b884473dd89f510aaff02b617e454a3ce6917e6e/pyluban-1.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "08768c5fc76375f46ad2c353ecca6b0b9d942c0065be3069b9cb1afa1a1fe211",
"md5": "a838a5c8cc55069603741899f9ccfc99",
"sha256": "a012e822ba949c7a7e11e29eba3e96448fe0db92a085a474984e617bc3f6f7d6"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp38-cp38-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "a838a5c8cc55069603741899f9ccfc99",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 214723,
"upload_time": "2024-02-01T00:49:23",
"upload_time_iso_8601": "2024-02-01T00:49:23.343628Z",
"url": "https://files.pythonhosted.org/packages/08/76/8c5fc76375f46ad2c353ecca6b0b9d942c0065be3069b9cb1afa1a1fe211/pyluban-1.1.6-cp38-cp38-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "404e4afd771a0a65905f5598ab0845e5915436391450c73d6428b26096f54d67",
"md5": "6d076bd18df0d6333090a0217239fd2f",
"sha256": "537c41e2e7a1da53995c4e975a71ae128d01f7e732d9bc1903da06802e7073cb"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "6d076bd18df0d6333090a0217239fd2f",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 201798,
"upload_time": "2024-02-01T00:49:24",
"upload_time_iso_8601": "2024-02-01T00:49:24.782473Z",
"url": "https://files.pythonhosted.org/packages/40/4e/4afd771a0a65905f5598ab0845e5915436391450c73d6428b26096f54d67/pyluban-1.1.6-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "484c22f897129085b5d546bcb356810aef0b90b877fab8a7bde160ef44a10b86",
"md5": "e8693461ae15a7b6c099cdf92c64deb4",
"sha256": "9a7db75d8b6bd3d8cc90d86e6c5fdc227bf4fa8a5434be3ede6e25fdb5a5b5af"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "e8693461ae15a7b6c099cdf92c64deb4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 264175,
"upload_time": "2024-02-01T00:49:26",
"upload_time_iso_8601": "2024-02-01T00:49:26.268574Z",
"url": "https://files.pythonhosted.org/packages/48/4c/22f897129085b5d546bcb356810aef0b90b877fab8a7bde160ef44a10b86/pyluban-1.1.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ea0ee68c858753ca8b4a87c7d31de175a12330d43059d07996580780d1c0401b",
"md5": "2d03f5a8be97336862109e568453a7c5",
"sha256": "a44794d57278d9c048103c20f66691ba66575f746c69169121641eadfba7f208"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "2d03f5a8be97336862109e568453a7c5",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 278945,
"upload_time": "2024-02-01T00:49:28",
"upload_time_iso_8601": "2024-02-01T00:49:28.982125Z",
"url": "https://files.pythonhosted.org/packages/ea/0e/e68c858753ca8b4a87c7d31de175a12330d43059d07996580780d1c0401b/pyluban-1.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f373d641bb60b90168244082b9630ed2b32a4f3cf64a36ed8c9c65440574a237",
"md5": "166b8c6912340e777e13a9bda515ac3d",
"sha256": "8a753d00bec4df9e90530f76f6d1b17c4d845af1f23bba09f001282ac79febba"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "166b8c6912340e777e13a9bda515ac3d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 214804,
"upload_time": "2024-02-01T00:49:30",
"upload_time_iso_8601": "2024-02-01T00:49:30.328918Z",
"url": "https://files.pythonhosted.org/packages/f3/73/d641bb60b90168244082b9630ed2b32a4f3cf64a36ed8c9c65440574a237/pyluban-1.1.6-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6e2932c749362b0e03cef950a9ab571648e6cc11ab30c3dec59c18eea62280f0",
"md5": "c17a1c749b447c9a3e338beff56cd13a",
"sha256": "cdbffa105a3361a22a27fda8af75ddf2c41ece3c70ad2c16bb6a6374e39ceebb"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "c17a1c749b447c9a3e338beff56cd13a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 201988,
"upload_time": "2024-02-01T00:49:31",
"upload_time_iso_8601": "2024-02-01T00:49:31.750540Z",
"url": "https://files.pythonhosted.org/packages/6e/29/32c749362b0e03cef950a9ab571648e6cc11ab30c3dec59c18eea62280f0/pyluban-1.1.6-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "eed3246ead036f593531f0ce377718d7bc96d45e1063f7c2ee9e2c56d0c8903e",
"md5": "084f47ffaa71302b33272852adf12704",
"sha256": "5fa7b21c0e2ae17e844c587c981dcda132a3c7f2724804ddf42e14b602f325ad"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "084f47ffaa71302b33272852adf12704",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 264248,
"upload_time": "2024-02-01T00:49:33",
"upload_time_iso_8601": "2024-02-01T00:49:33.196872Z",
"url": "https://files.pythonhosted.org/packages/ee/d3/246ead036f593531f0ce377718d7bc96d45e1063f7c2ee9e2c56d0c8903e/pyluban-1.1.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8cf38ea27a9f46218eac993d329d51e3dea678d6ef72a4a63956d448d9853aa7",
"md5": "5de8796597b0989784662e54eed58462",
"sha256": "ae6941821559b8615a979849150777d72b803ae447709032f9124f5bc771a8e9"
},
"downloads": -1,
"filename": "pyluban-1.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5de8796597b0989784662e54eed58462",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 278850,
"upload_time": "2024-02-01T00:49:34",
"upload_time_iso_8601": "2024-02-01T00:49:34.834100Z",
"url": "https://files.pythonhosted.org/packages/8c/f3/8ea27a9f46218eac993d329d51e3dea678d6ef72a4a63956d448d9853aa7/pyluban-1.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8dc2fcb661bf329310c6d23937287a532c64cf1401939177acfe88192a89a90b",
"md5": "7c24468ef361d4e553cace98b77ebfa9",
"sha256": "51274483bd667ba3f11719a12a9cee52c7b139d845d638c9f7b78222548ffae8"
},
"downloads": -1,
"filename": "pyluban-1.1.6.tar.gz",
"has_sig": false,
"md5_digest": "7c24468ef361d4e553cace98b77ebfa9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 188093,
"upload_time": "2024-02-01T00:49:36",
"upload_time_iso_8601": "2024-02-01T00:49:36.192690Z",
"url": "https://files.pythonhosted.org/packages/8d/c2/fcb661bf329310c6d23937287a532c64cf1401939177acfe88192a89a90b/pyluban-1.1.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-01 00:49:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "uopensail",
"github_project": "luban",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pyluban"
}