arxivql


Namearxivql JSON
Version 0.2.2 PyPI version JSON
download
home_pagehttps://github.com/romazu/arxivql
SummaryA pythonic query builder for arXiv search API
upload_time2024-10-29 12:13:43
maintainerNone
docs_urlNone
authorRoman Zubov
requires_python<4.0,>=3.7
licenseMIT
keywords arxiv api academic articles query language dsl
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # arXiv Query Language

The arXiv search API enables filtering articles based on various **fields** such as "title", "author", "category", etc.
Queries follow the format `{field_prefix}:{value}`, e.g., `ti:AlexNet`.
The query language supports combining field filters using logical operators AND, OR, ANDNOT.
Constructing these queries manually presents two challenges:
1. Writing syntactically correct query strings with abbreviated field prefixes
2. Navigating numerous arXiv category identifiers

This repository provides a pythonic query builder to address both challenges.
See the [arxiv documentation](https://info.arxiv.org/help/api/user-manual.html#query_details) for the official Search API details.
See the [arXiv Search API behavior](#important-arxiv-search-api-behavior) section for API behavior details and caveats.

## Installation
```shell
pip install arxivql
```

## Query
The `Query` class provides constructors for all supported arXiv fields and methods to combine them.

### Field Constructors

```python
from arxivql import Query as Q

# Single word search
print(Q.title('word'))
# Output:
# ti:word

# Exact phrase and author name searches
print(Q.abstract('some words'))
print(Q.author("Ilya Sutskever"))
# Output:
# abs:"some words"
# au:"Ilya Sutskever"
```
Multi-word field values are automatically double-quoted for exact phrase matching.
For ANY word matching, pass a **list** to the constructor:
```python
Q.abstract(["Syntactic", "natural language processing", "synthetic corpus"])
# Output:
# abs:(Syntactic "natural language processing" "synthetic corpus")
```
For ALL words matching, pass a **tuple** to the constructor:
```python
Q.abstract(("Syntactic", "natural language processing", "synthetic corpus"))
# Output:
# abs:(Syntactic AND "natural language processing" AND "synthetic corpus")
```
Note: All searches are case-insensitive.


### Logical Operations
Complex queries can be constructed by combining field filters using regular python logic operators:
```python
a1 = Q.author("Ilya Sutskever")
a2 = Q.author(("Geoffrey", "Hinton"))
c1 = Q.category("cs.NE")  # See taxonomy section for preferred category construction
c2 = Q.category("cs.CL")

# AND operator
q1 = a1 & a2 & c1
# Output:
# ((au:"Ilya Sutskever" AND au:(Geoffrey AND Hinton)) AND cat:cs.NE)

# OR operator
q2 = (a1 | a2) & (c1 | c2)
# Output:
# ((au:"Ilya Sutskever" OR au:(Geoffrey AND Hinton)) AND (cat:cs.NE OR cat:cs.CL))

# ANDNOT operator
q3 = a1 & ~a2
# Output:
# (au:"Ilya Sutskever" ANDNOT au:(Geoffrey AND Hinton))
```
The following operations raise exceptions due to arXiv API limitations:
```python
~a1       # Error: standalone NOT operator not supported
a1 | ~a2  # Error: ORNOT operator not supported
```

### Wildcards
Wildcards (`?` and `*`) can be used in queries as usual. See the [arXiv Search API behavior](#important-arxiv-search-api-behavior) section for more details.

### Category Taxonomy
The `Taxonomy` class provides a structured interface for managing arXiv categories.
Basic usage:

```python
from arxivql import Taxonomy as T

print(T.cs.AI)
print(Q.category(T.cs.AI))
print(Q.category(T.cs))
print(Q.category((T.cs.LG, T.stat.ML)) & Q.title("LLM"))
# Output:
# cs.AI
# cat:cs.AI
# cat:cs.*
# (cat:(cs.LG AND stat.ML) AND ti:LLM)
```
Note the wildcard syntax in archive-level queries (e.g., `T.cs`).

The Taxonomy class provides comprehensive category information:
```python
category = T.astro_ph.HE
print("id:          ", category.id)
print("name:        ", category.name)
print("group_name:  ", category.group_name)
print("archive_id:  ", category.archive_id)
print("archive_name:", category.archive_name)
print("description: ", category.description)
# Output:
# id:           astro-ph.HE
# name:         High Energy Astrophysical Phenomena
# group_name:   Physics
# archive_id:   astro-ph
# archive_name: Astrophysics
# description:  Cosmic ray production, acceleration, propagation, detection. Gamma ray astronomy and bursts, X-rays, charged particles, supernovae and other explosive phenomena, stellar remnants and accretion systems, jets, microquasars, neutron stars, pulsars, black holes
```

The library also provides useful category catalog:

```python
from arxivql.taxonomy import catalog, categories_by_id

print(len(categories_by_id.keys()))
# Output:
# 157

print(len(catalog.all_categories))
# Output:
# 157

print(len(catalog.all_archives))
print(Q.category(catalog.all_archives))
# Output:
# 20
# cat:(cs.* econ.* eess.* math.* q-bio.* q-fin.* stat.* astro-ph* cond-mat* nlin.* physics.* gr-qc hep-ex hep-lat hep-ph hep-th math-ph nucl-ex nucl-th quant-ph)

# Broad Machine Learning categories, see official classification guide
# https://blog.arxiv.org/2019/12/05/arxiv-machine-learning-classification-guide
print(len(catalog.ml_broad))
print(Q.category(catalog.ml_broad))
# Output:
# 16
# cat:(cs.LG stat.ML math.OC cs.CV cs.CL eess.AS cs.IR cs.HC cs.SI cs.CY cs.GR cs.SY cs.AI cs.MM cs.ET cs.NE)

# Core Machine Learning categories according to Andrej Karpathy's `arxiv sanity preserver` project:
# https://github.com/karpathy/arxiv-sanity-preserver
print(len(catalog.ml_karpathy))
print(Q.category(catalog.ml_karpathy))
# Output:
# 6
# cat:(cs.CV cs.AI cs.CL cs.LG cs.NE stat.ML)
```

### Usage with Python arXiv Client
Constructed queries can be directly used in [python arXiv API wrapper](https://pypi.org/project/arxiv):

```python
# pip install arxiv

import arxiv
from arxivql import Query as Q, Taxonomy as T

query = Q.author("Ilya Sutskever") & Q.title("autoencoders") & ~Q.category(T.cs.AI)
search = arxiv.Search(query=query)
client = arxiv.Client()
results = list(client.results(search))

print(f"query = {query}")
for result in results:
    print(result.get_short_id(), result.title)

# Output:
# query = ((au:"Ilya Sutskever" AND ti:autoencoders) ANDNOT cat:cs.AI)
# 1611.02731v2 Variational Lossy Autoencoder
```

## Important arXiv Search API Behavior
- Category searches consider all listed categories, not only primary ones.

- arXiv supports two wildcard characters: `?` and `*`.
  - `?` replaces one character in a word
  - `*` replaces zero or more characters in a word
  - They don't match the first character of the term, i.e., `au:??tskever` fails, but `au:Sutske???` is okay
  - Categories can also be "wildcarded", i.e., `cat:cs.?I` is a valid filter
  - `?` and `*` can be combined, e.g., `cat:q-?i*` is valid and matches both `q-bio` and `q-fin`

- Quoted items imply exact sequence matching:
  - For text fields, this means standard phrase matching
  - For categories, order matters: `cat:"hep-th cs.AI"` differs from `cat:"cs.AI hep-th"`. Article categories are ordered in arXiv API.
  - Queries like `cat:"cs.* hep-th"` or `cat:"cs.*"` return no results as they search for literal category names, and, e.g., literal `cs.*` category does not exist.
  - Double quotes are special characters and should be carefully handled. E.g., `"""` finds nothing, and `""2"""` is equivalent to `"2"` and `2`.
  - This library raises exceptions for most such problematic queries. 

- Spaces between terms or fields imply OR operations:
  `cat:hep-th cat:cs.AI` equals `cat:hep-th OR cat:cs.AI`

- Parentheses serve two purposes:
  1. Grouping logical operations
  2. Defining field scope, e.g., `ti:(some words)` treats spaces as OR operations.
  Examples:
     - `cat:(cs.AI hep-th)` matches articles with either category
     - `cat:(cs.* hep-th)` functions as expected with wildcards

- Explicit operators in field scopes are supported:
  `ti:(some OR words)` and `ti:(some AND words)` are valid

- The `id_list` parameter (and legacy `id:` field filter) in the arXiv Search API is used internally to filter over the "major" article IDs (`2410.21276`), not the "version" IDs (`2410.21276v1`).
  - When used with a non-empty query:
    ```python
    # pip install arxiv
    
    arxiv.Search(query="au:Sutskever", id_list=["2303.08774v6"])  # zero results
    arxiv.Search(query="au:Sutskever", id_list=["2303.08774"])    # -> 2303.08774v6 (latest)
    ```
  - BUT if the query is left empty, `id_list` and `id:` can be used to search for the exact article version:
    ```python
    arxiv.Search(id_list=["2303.08774"])     # -> 2303.08774v6 (latest)
    arxiv.Search(id_list=["2303.08774v4"])   # -> 2303.08774v4
    arxiv.Search(id_list=["2303.08774v5"])   # -> 2303.08774v5
    arxiv.Search(id_list=["2303.08774v99"])  # -> obscure error
    ```

# arXiv Categories Taxonomy
The arXiv taxonomy consists of three hierarchical levels: group → archive → category.
For complete details, consult the [arXiv Category Taxonomy](https://arxiv.org/category_taxonomy) and [arXiv Catchup Interface](https://arxiv.org/catchup).

## Category
Categories represent the finest granularity of classification.
Category identifiers typically follow the pattern `{archive}.{category}`, with some exceptions noted below.
Example: In `astro-ph.HE`, the hierarchy is:
- Group: `Physics`
- Archive: `Astrophysics`
- Category: `High Energy Astrophysical Phenomena`
- Queryable ID: `astro-ph.HE`

<img src="https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_astro-ph.HE-fs8.png" width="35%">

## Group
Groups constitute the top level of taxonomy, currently including:
- Computer Science
- Economics
- Electrical Engineering and Systems Science
- Mathematics
- Physics
- Quantitative Biology
- Quantitative Finance
- Statistics

## Archive
Archives form the intermediate level, with each belonging to exactly one group.

Special cases:
1. Single-archive groups:
   - When a group contains only one archive, they share the same name
   - Example: `q-fin.CP` category has `Quantitative Finance` → `Quantitative Finance` → `Computational Finance`

   <img src="https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_q-fin.CP-fs8.png" width="35%">

2. Single-category archives:
   - When an archive contains only one category, the archive name is omitted from the identifier
   - Example: `hep-th` category has `Physics` → `High Energy Physics - Theory` → `High Energy Physics - Theory`

   <img src="https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_hep-th-fs8.png" width="35%">

Note: The `Physics` group contains a `Physics` archive alongside other archives, which may cause confusion.
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/romazu/arxivql",
    "name": "arxivql",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.7",
    "maintainer_email": null,
    "keywords": "arxiv, api, academic, articles, query, language, dsl",
    "author": "Roman Zubov",
    "author_email": "romazu@protonmail.com",
    "download_url": "https://files.pythonhosted.org/packages/9a/18/e24cf15f2d8bb7b4a9b5de08d97385b38ce3962ca30a20f7133a6a0eef7d/arxivql-0.2.2.tar.gz",
    "platform": null,
    "description": "# arXiv Query Language\n\nThe arXiv search API enables filtering articles based on various **fields** such as \"title\", \"author\", \"category\", etc.\nQueries follow the format `{field_prefix}:{value}`, e.g., `ti:AlexNet`.\nThe query language supports combining field filters using logical operators AND, OR, ANDNOT.\nConstructing these queries manually presents two challenges:\n1. Writing syntactically correct query strings with abbreviated field prefixes\n2. Navigating numerous arXiv category identifiers\n\nThis repository provides a pythonic query builder to address both challenges.\nSee the [arxiv documentation](https://info.arxiv.org/help/api/user-manual.html#query_details) for the official Search API details.\nSee the [arXiv Search API behavior](#important-arxiv-search-api-behavior) section for API behavior details and caveats.\n\n## Installation\n```shell\npip install arxivql\n```\n\n## Query\nThe `Query` class provides constructors for all supported arXiv fields and methods to combine them.\n\n### Field Constructors\n\n```python\nfrom arxivql import Query as Q\n\n# Single word search\nprint(Q.title('word'))\n# Output:\n# ti:word\n\n# Exact phrase and author name searches\nprint(Q.abstract('some words'))\nprint(Q.author(\"Ilya Sutskever\"))\n# Output:\n# abs:\"some words\"\n# au:\"Ilya Sutskever\"\n```\nMulti-word field values are automatically double-quoted for exact phrase matching.\nFor ANY word matching, pass a **list** to the constructor:\n```python\nQ.abstract([\"Syntactic\", \"natural language processing\", \"synthetic corpus\"])\n# Output:\n# abs:(Syntactic \"natural language processing\" \"synthetic corpus\")\n```\nFor ALL words matching, pass a **tuple** to the constructor:\n```python\nQ.abstract((\"Syntactic\", \"natural language processing\", \"synthetic corpus\"))\n# Output:\n# abs:(Syntactic AND \"natural language processing\" AND \"synthetic corpus\")\n```\nNote: All searches are case-insensitive.\n\n\n### Logical Operations\nComplex queries can be constructed by combining field filters using regular python logic operators:\n```python\na1 = Q.author(\"Ilya Sutskever\")\na2 = Q.author((\"Geoffrey\", \"Hinton\"))\nc1 = Q.category(\"cs.NE\")  # See taxonomy section for preferred category construction\nc2 = Q.category(\"cs.CL\")\n\n# AND operator\nq1 = a1 & a2 & c1\n# Output:\n# ((au:\"Ilya Sutskever\" AND au:(Geoffrey AND Hinton)) AND cat:cs.NE)\n\n# OR operator\nq2 = (a1 | a2) & (c1 | c2)\n# Output:\n# ((au:\"Ilya Sutskever\" OR au:(Geoffrey AND Hinton)) AND (cat:cs.NE OR cat:cs.CL))\n\n# ANDNOT operator\nq3 = a1 & ~a2\n# Output:\n# (au:\"Ilya Sutskever\" ANDNOT au:(Geoffrey AND Hinton))\n```\nThe following operations raise exceptions due to arXiv API limitations:\n```python\n~a1       # Error: standalone NOT operator not supported\na1 | ~a2  # Error: ORNOT operator not supported\n```\n\n### Wildcards\nWildcards (`?` and `*`) can be used in queries as usual. See the [arXiv Search API behavior](#important-arxiv-search-api-behavior) section for more details.\n\n### Category Taxonomy\nThe `Taxonomy` class provides a structured interface for managing arXiv categories.\nBasic usage:\n\n```python\nfrom arxivql import Taxonomy as T\n\nprint(T.cs.AI)\nprint(Q.category(T.cs.AI))\nprint(Q.category(T.cs))\nprint(Q.category((T.cs.LG, T.stat.ML)) & Q.title(\"LLM\"))\n# Output:\n# cs.AI\n# cat:cs.AI\n# cat:cs.*\n# (cat:(cs.LG AND stat.ML) AND ti:LLM)\n```\nNote the wildcard syntax in archive-level queries (e.g., `T.cs`).\n\nThe Taxonomy class provides comprehensive category information:\n```python\ncategory = T.astro_ph.HE\nprint(\"id:          \", category.id)\nprint(\"name:        \", category.name)\nprint(\"group_name:  \", category.group_name)\nprint(\"archive_id:  \", category.archive_id)\nprint(\"archive_name:\", category.archive_name)\nprint(\"description: \", category.description)\n# Output:\n# id:           astro-ph.HE\n# name:         High Energy Astrophysical Phenomena\n# group_name:   Physics\n# archive_id:   astro-ph\n# archive_name: Astrophysics\n# description:  Cosmic ray production, acceleration, propagation, detection. Gamma ray astronomy and bursts, X-rays, charged particles, supernovae and other explosive phenomena, stellar remnants and accretion systems, jets, microquasars, neutron stars, pulsars, black holes\n```\n\nThe library also provides useful category catalog:\n\n```python\nfrom arxivql.taxonomy import catalog, categories_by_id\n\nprint(len(categories_by_id.keys()))\n# Output:\n# 157\n\nprint(len(catalog.all_categories))\n# Output:\n# 157\n\nprint(len(catalog.all_archives))\nprint(Q.category(catalog.all_archives))\n# Output:\n# 20\n# cat:(cs.* econ.* eess.* math.* q-bio.* q-fin.* stat.* astro-ph* cond-mat* nlin.* physics.* gr-qc hep-ex hep-lat hep-ph hep-th math-ph nucl-ex nucl-th quant-ph)\n\n# Broad Machine Learning categories, see official classification guide\n# https://blog.arxiv.org/2019/12/05/arxiv-machine-learning-classification-guide\nprint(len(catalog.ml_broad))\nprint(Q.category(catalog.ml_broad))\n# Output:\n# 16\n# cat:(cs.LG stat.ML math.OC cs.CV cs.CL eess.AS cs.IR cs.HC cs.SI cs.CY cs.GR cs.SY cs.AI cs.MM cs.ET cs.NE)\n\n# Core Machine Learning categories according to Andrej Karpathy's `arxiv sanity preserver` project:\n# https://github.com/karpathy/arxiv-sanity-preserver\nprint(len(catalog.ml_karpathy))\nprint(Q.category(catalog.ml_karpathy))\n# Output:\n# 6\n# cat:(cs.CV cs.AI cs.CL cs.LG cs.NE stat.ML)\n```\n\n### Usage with Python arXiv Client\nConstructed queries can be directly used in [python arXiv API wrapper](https://pypi.org/project/arxiv):\n\n```python\n# pip install arxiv\n\nimport arxiv\nfrom arxivql import Query as Q, Taxonomy as T\n\nquery = Q.author(\"Ilya Sutskever\") & Q.title(\"autoencoders\") & ~Q.category(T.cs.AI)\nsearch = arxiv.Search(query=query)\nclient = arxiv.Client()\nresults = list(client.results(search))\n\nprint(f\"query = {query}\")\nfor result in results:\n    print(result.get_short_id(), result.title)\n\n# Output:\n# query = ((au:\"Ilya Sutskever\" AND ti:autoencoders) ANDNOT cat:cs.AI)\n# 1611.02731v2 Variational Lossy Autoencoder\n```\n\n## Important arXiv Search API Behavior\n- Category searches consider all listed categories, not only primary ones.\n\n- arXiv supports two wildcard characters: `?` and `*`.\n  - `?` replaces one character in a word\n  - `*` replaces zero or more characters in a word\n  - They don't match the first character of the term, i.e., `au:??tskever` fails, but `au:Sutske???` is okay\n  - Categories can also be \"wildcarded\", i.e., `cat:cs.?I` is a valid filter\n  - `?` and `*` can be combined, e.g., `cat:q-?i*` is valid and matches both `q-bio` and `q-fin`\n\n- Quoted items imply exact sequence matching:\n  - For text fields, this means standard phrase matching\n  - For categories, order matters: `cat:\"hep-th cs.AI\"` differs from `cat:\"cs.AI hep-th\"`. Article categories are ordered in arXiv API.\n  - Queries like `cat:\"cs.* hep-th\"` or `cat:\"cs.*\"` return no results as they search for literal category names, and, e.g., literal `cs.*` category does not exist.\n  - Double quotes are special characters and should be carefully handled. E.g., `\"\"\"` finds nothing, and `\"\"2\"\"\"` is equivalent to `\"2\"` and `2`.\n  - This library raises exceptions for most such problematic queries. \n\n- Spaces between terms or fields imply OR operations:\n  `cat:hep-th cat:cs.AI` equals `cat:hep-th OR cat:cs.AI`\n\n- Parentheses serve two purposes:\n  1. Grouping logical operations\n  2. Defining field scope, e.g., `ti:(some words)` treats spaces as OR operations.\n  Examples:\n     - `cat:(cs.AI hep-th)` matches articles with either category\n     - `cat:(cs.* hep-th)` functions as expected with wildcards\n\n- Explicit operators in field scopes are supported:\n  `ti:(some OR words)` and `ti:(some AND words)` are valid\n\n- The `id_list` parameter (and legacy `id:` field filter) in the arXiv Search API is used internally to filter over the \"major\" article IDs (`2410.21276`), not the \"version\" IDs (`2410.21276v1`).\n  - When used with a non-empty query:\n    ```python\n    # pip install arxiv\n    \n    arxiv.Search(query=\"au:Sutskever\", id_list=[\"2303.08774v6\"])  # zero results\n    arxiv.Search(query=\"au:Sutskever\", id_list=[\"2303.08774\"])    # -> 2303.08774v6 (latest)\n    ```\n  - BUT if the query is left empty, `id_list` and `id:` can be used to search for the exact article version:\n    ```python\n    arxiv.Search(id_list=[\"2303.08774\"])     # -> 2303.08774v6 (latest)\n    arxiv.Search(id_list=[\"2303.08774v4\"])   # -> 2303.08774v4\n    arxiv.Search(id_list=[\"2303.08774v5\"])   # -> 2303.08774v5\n    arxiv.Search(id_list=[\"2303.08774v99\"])  # -> obscure error\n    ```\n\n# arXiv Categories Taxonomy\nThe arXiv taxonomy consists of three hierarchical levels: group \u2192 archive \u2192 category.\nFor complete details, consult the [arXiv Category Taxonomy](https://arxiv.org/category_taxonomy) and [arXiv Catchup Interface](https://arxiv.org/catchup).\n\n## Category\nCategories represent the finest granularity of classification.\nCategory identifiers typically follow the pattern `{archive}.{category}`, with some exceptions noted below.\nExample: In `astro-ph.HE`, the hierarchy is:\n- Group: `Physics`\n- Archive: `Astrophysics`\n- Category: `High Energy Astrophysical Phenomena`\n- Queryable ID: `astro-ph.HE`\n\n<img src=\"https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_astro-ph.HE-fs8.png\" width=\"35%\">\n\n## Group\nGroups constitute the top level of taxonomy, currently including:\n- Computer Science\n- Economics\n- Electrical Engineering and Systems Science\n- Mathematics\n- Physics\n- Quantitative Biology\n- Quantitative Finance\n- Statistics\n\n## Archive\nArchives form the intermediate level, with each belonging to exactly one group.\n\nSpecial cases:\n1. Single-archive groups:\n   - When a group contains only one archive, they share the same name\n   - Example: `q-fin.CP` category has `Quantitative Finance` \u2192 `Quantitative Finance` \u2192 `Computational Finance`\n\n   <img src=\"https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_q-fin.CP-fs8.png\" width=\"35%\">\n\n2. Single-category archives:\n   - When an archive contains only one category, the archive name is omitted from the identifier\n   - Example: `hep-th` category has `Physics` \u2192 `High Energy Physics - Theory` \u2192 `High Energy Physics - Theory`\n\n   <img src=\"https://raw.githubusercontent.com/romazu/arxivql/main/assets/images/taxonomy_hep-th-fs8.png\" width=\"35%\">\n\nNote: The `Physics` group contains a `Physics` archive alongside other archives, which may cause confusion.",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A pythonic query builder for arXiv search API",
    "version": "0.2.2",
    "project_urls": {
        "Homepage": "https://github.com/romazu/arxivql",
        "Repository": "https://github.com/romazu/arxivql"
    },
    "split_keywords": [
        "arxiv",
        " api",
        " academic",
        " articles",
        " query",
        " language",
        " dsl"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "518de8a79929656f80fb0a1d2b6c3ba7b7cd1d13a56d79e4db58483aaa0c9c37",
                "md5": "72063969ef07e4df282d0e6845563055",
                "sha256": "acdf16fb999c17a633b8301dec46fb6c83988bb7bc9e895d1adfdb6eb3c242c5"
            },
            "downloads": -1,
            "filename": "arxivql-0.2.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "72063969ef07e4df282d0e6845563055",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.7",
            "size": 24179,
            "upload_time": "2024-10-29T12:13:41",
            "upload_time_iso_8601": "2024-10-29T12:13:41.910635Z",
            "url": "https://files.pythonhosted.org/packages/51/8d/e8a79929656f80fb0a1d2b6c3ba7b7cd1d13a56d79e4db58483aaa0c9c37/arxivql-0.2.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9a18e24cf15f2d8bb7b4a9b5de08d97385b38ce3962ca30a20f7133a6a0eef7d",
                "md5": "dfa48da45cdaacffdffad404990e21af",
                "sha256": "ad7c552db86f1271d402f6720a7f554db7ae6da4e470d59d4eb5420c5ed88cd5"
            },
            "downloads": -1,
            "filename": "arxivql-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "dfa48da45cdaacffdffad404990e21af",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.7",
            "size": 26699,
            "upload_time": "2024-10-29T12:13:43",
            "upload_time_iso_8601": "2024-10-29T12:13:43.434068Z",
            "url": "https://files.pythonhosted.org/packages/9a/18/e24cf15f2d8bb7b4a9b5de08d97385b38ce3962ca30a20f7133a6a0eef7d/arxivql-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-29 12:13:43",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "romazu",
    "github_project": "arxivql",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "arxivql"
}
        
Elapsed time: 0.37485s