Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

datascribe-api-logo

DataScribe API Client

License: GPL v3PythonPlatforms

TestsLint

DOI

datascribe_api is a Python client for interacting with the DataScribe API. It allows users to search for data tables and their metadata, automating data retrieval and analysis workflows.

Report a Bug | Request a Feature | Documentation


Features

  • Search and retrieve data tables and metadata from the DataScribe API
  • Simple Python interface for querying endpoints
  • Automatic model mapping for API responses
  • Context manager support for resource management

Installation

You can use pip to install the datascribe_api package directly from PyPI:

pip install datascribe_api

Quick Start

Python Client Usage

To get started with the datascribe_api, you can use the following example to retrieve and print the names of data tables available to the user:

fromdatascribe_apiimportDataScribeClientwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
tables=client.get_data_tables_for_user()
fortableintables:
print(f"Table Name: {table.display_name}")

Make sure to replace the DataScribeClient initialization with your actual API key or store it in an environment variable named DATASCRIBE_API_TOKEN for authentication.

API Endpoints

Below is a list of all available endpoints in the DataScribe API Python client:

Endpoint NameHTTP PathParametersDescription
get_data_tables/data/data-tablesList all data tables (admin only)
get_data_tables_for_user/data/data-tables-for-userList data tables available to the user
get_data_table/data/data-tabletableName, startingRow, numRowsGet rows from a data table
get_data_table_rows/data/data-table-rowstableName, columns, startingRow , numRows, filtersGet rows from a data table (with columns)
get_data_table_rows_count/data/data-table-rows-counttableName, filtersGet row count for a data table
get_data_table_columns/data/data-table-columnstableNameGet columns of a data table
get_data_table_metadata/data/data-table-metadatatableNameGet metadata for a data table
get_material_by_id/materialsids, providersGet material by IDs
search_materials/materials/searchformula, elements, exclude_elements, spacegroup, props, temperature, providers, page, sizeSearch for materials

Filtering Data with the Filter Class

The datascribe_api package provides a powerful and expressive Filter class for building complex queries in a Pythonic way. Filters can be passed to API methods as dictionaries, single Filter objects, or lists of Filter objects (for AND logic).

Basic Usage

fromdatascribe_apiimportDataScribeClientfromdatascribe_api.filterimportFilterwithDataScribeClient(api_key="YOUR_API_TOKEN") asclient:
filters=Filter("age") >30rows=client.get_data_table_rows(tableName="users", columns=["age", "name"], filters=filters)
forrowinrows:
print(row)

Supported Filter Operations

  • Equality and Comparison

    Filter("age") ==25Filter("score") !=100Filter("height") >170Filter("height") >=180Filter("height") <200Filter("height") <=160
  • IN and NOT IN

    Filter("status").in_(["active", "pending"])
    Filter("role").not_in(["guest", "banned"])
  • LIKE and ILIKE (case-insensitive LIKE)

    Filter("name").like("%John%")
    Filter("email").ilike("%@gmail.com")
  • IS NULL and IS NOT NULL

    Filter("deleted_at").is_null()
    Filter("deleted_at").is_not_null()

Combining Multiple Filters (AND logic)

You can pass a list of filters to combine them with AND logic:

filters= [
Filter("age") >18,
Filter("status") =="active",
Filter("country").in_(["US", "CA"])
]
rows=client.get_data_table_rows(tableName="users", columns=["age", "status", "country"], filters=filters)

Passing Filters as Dictionaries

You can also pass filters as plain dictionaries if you prefer:

filters= {"column": "age", "operator": ">", "value": 21}
rows=client.get_data_table_rows(tableName="users", columns=["age"], filters=filters)

CLI Usage

You can also use the command-line interface to interact with the DataScribe API. Here are some examples:

# List all data tables for the authenticated user
datascribe_cli data-tables-for-user
# Retrieve rows from the data table named m3gnet_mpf
datascribe_cli data-table --table-name m3gnet_mpf

See the CLI documentation for more commands and options.


Citation

We are currently preparing a preprint for publication. If you use datascribe_api in your research, please cite the following:

Sarıtürk, D. (2025). datascribe_api. Zenodo. https://doi.org/10.5281/zenodo.17090844

BibTeX:

@software{sariturk_2025_17518243,
author = {Sarıtürk, Doğuhan},
title = {datascribe\_api},
month = nov,
year = 2025,
publisher = {Zenodo},
doi = {10.5281/zenodo.17090844},
url = {https://doi.org/10.5281/zenodo.17090844},
}

License

This project is licensed under the GNU GPLv3 License. See the LICENSE file for details.

About

Python client for the DataScribe API, featuring Pydantic models, client utilities, and CLI tools for managing and querying data tables.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages