diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-15 03:27:53 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-15 03:27:53 +0000 |
commit | 5db7f66993f71d1b30cf80312d62021026c56adc (patch) | |
tree | f0daffc8560e6be2427ba02525590ee598f6c64c | |
parent | 880f9fdf3f944d9fb27588b4adaa75ecff588a0d (diff) |
automatic import of python-gspread-asyncio
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-gspread-asyncio.spec | 356 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 358 insertions, 0 deletions
@@ -0,0 +1 @@ +/gspread_asyncio-1.8.1.tar.gz diff --git a/python-gspread-asyncio.spec b/python-gspread-asyncio.spec new file mode 100644 index 0000000..dbe6031 --- /dev/null +++ b/python-gspread-asyncio.spec @@ -0,0 +1,356 @@ +%global _empty_manifest_terminate_build 0 +Name: python-gspread-asyncio +Version: 1.8.1 +Release: 1 +Summary: asyncio wrapper for burnash's Google Spreadsheet API library, gspread +License: MIT +URL: https://github.com/dgilman/gspread_asyncio +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/e5/7c/230958d09cc2bcf06b89d0ffb50ee032d570c97554099cfd36ec1bbd1f46/gspread_asyncio-1.8.1.tar.gz +BuildArch: noarch + +Requires: python3-requests +Requires: python3-gspread + +%description +# gspread_asyncio + +An [asyncio wrapper](https://docs.python.org/3/library/asyncio.html) for [burnash's excellent Google Spreadsheet API library](https://github.com/burnash/gspread). `gspread_asyncio` isn't just a plain asyncio wrapper around the `gspread` API, it implements several useful and helpful features on top of those APIs. It's useful for long-running processes and one-off scripts. + +Requires Python >= 3.7. + +[](https://gspread-asyncio.readthedocs.io/en/latest/?badge=latest)  + + +## Features + +* Complete async wrapping of the `gspread` API. All `gspread` API calls are run off the main thread in a threadpool executor. +* Internal caching and reuse of `gspread` `Client`/`Spreadsheet`/`Worksheet` objects. +* Automatic renewal of expired credentials. +* Automatic retries of spurious failures from Google's servers (HTTP 5xx). +* Automatic rate limiting with defaults set to Google's default API limits. +* Many methods that don't need to return a value can optionally return an already-scheduled `Future` (the `nowait` kwarg). You can ignore that future, allowing forward progress on your calling coroutine while the asyncio event loop schedules and runs the Google Spreadsheet API call at a later time for you. + +## Example usage + +```python +import asyncio + +import gspread_asyncio + +# from google-auth package +from google.oauth2.service_account import Credentials + +# First, set up a callback function that fetches our credentials off the disk. +# gspread_asyncio needs this to re-authenticate when credentials expire. + +def get_creds(): + # To obtain a service account JSON file, follow these steps: + # https://gspread.readthedocs.io/en/latest/oauth2.html#for-bots-using-service-account + creds = Credentials.from_service_account_file("serviceacct_spreadsheet.json") + scoped = creds.with_scopes([ + "https://spreadsheets.google.com/feeds", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/drive", + ]) + return scoped + +# Create an AsyncioGspreadClientManager object which +# will give us access to the Spreadsheet API. + +agcm = gspread_asyncio.AsyncioGspreadClientManager(get_creds) + +# Here's an example of how you use the API: + +async def example(agcm): + # Always authorize first. + # If you have a long-running program call authorize() repeatedly. + agc = await agcm.authorize() + + ss = await agc.create("Test Spreadsheet") + print("Spreadsheet URL: https://docs.google.com/spreadsheets/d/{0}".format(ss.id)) + print("Open the URL in your browser to see gspread_asyncio in action!") + + # Allow anyone with the URL to write to this spreadsheet. + await agc.insert_permission(ss.id, None, perm_type="anyone", role="writer") + + # Create a new spreadsheet but also grab a reference to the default one. + ws = await ss.add_worksheet("My Test Worksheet", 10, 5) + zero_ws = await ss.get_worksheet(0) + + # Write some stuff to both spreadsheets. + for row in range(1, 11): + for col in range(1, 6): + val = "{0}/{1}".format(row, col) + await ws.update_cell(row, col, val + " ws") + await zero_ws.update_cell(row, col, val + " zero ws") + print("All done!") + +# Turn on debugging if you're new to asyncio! +asyncio.run(example(agcm), debug=True) +``` + +## Observational notes and gotchas + +* This module does not define its own exceptions, it propagates instances of `gspread.exceptions.GSpreadException`. +* Always call `AsyncioGspreadClientManager.authorize()`, `AsyncioGspreadClient.open_*()` and `AsyncioGspreadSpreadsheet.get_worksheet()` before doing any work on a spreadsheet. These methods keep an internal cache so it is painless to call them many times, even inside of a loop. This makes sure you always have a valid set of authentication credentials from Google. +* The only object you should store in your application is the `AsyncioGspreadClientManager` (`agcm`). +* Right now the `gspread` library does not support bulk appends of rows or bulk changes of cells. When this is done `gspread_asyncio` will support batching of these Google API calls without any changes to the Python `gspread_asyncio` API. +* I came up with the default 1.1 second delay between API calls (the `gspread_delay` kwarg) after extensive experimentation. The official API rate limit is one call every second but however Google measures these things introduces a tiny bit of jitter that will get you rate blocked if you ride that limit exactly. +* Google's service reliability on these endpoints is surprisingly bad. There are frequent HTTP 500s and the retry logic will save your butt in long-running scripts or short, one-shot, one-off ones. +* Experimentation also found that Google's credentials expire after an hour and the default `reauth_interval` of 45 minutes takes care of that just fine. + +## License + +MIT + +## Sponsorship + +Development of gspread_asyncio is sponsored by [Pro Football History.com, your source for NFL coaching biographies.](https://pro-football-history.com) + + +%package -n python3-gspread-asyncio +Summary: asyncio wrapper for burnash's Google Spreadsheet API library, gspread +Provides: python-gspread-asyncio +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-gspread-asyncio +# gspread_asyncio + +An [asyncio wrapper](https://docs.python.org/3/library/asyncio.html) for [burnash's excellent Google Spreadsheet API library](https://github.com/burnash/gspread). `gspread_asyncio` isn't just a plain asyncio wrapper around the `gspread` API, it implements several useful and helpful features on top of those APIs. It's useful for long-running processes and one-off scripts. + +Requires Python >= 3.7. + +[](https://gspread-asyncio.readthedocs.io/en/latest/?badge=latest)  + + +## Features + +* Complete async wrapping of the `gspread` API. All `gspread` API calls are run off the main thread in a threadpool executor. +* Internal caching and reuse of `gspread` `Client`/`Spreadsheet`/`Worksheet` objects. +* Automatic renewal of expired credentials. +* Automatic retries of spurious failures from Google's servers (HTTP 5xx). +* Automatic rate limiting with defaults set to Google's default API limits. +* Many methods that don't need to return a value can optionally return an already-scheduled `Future` (the `nowait` kwarg). You can ignore that future, allowing forward progress on your calling coroutine while the asyncio event loop schedules and runs the Google Spreadsheet API call at a later time for you. + +## Example usage + +```python +import asyncio + +import gspread_asyncio + +# from google-auth package +from google.oauth2.service_account import Credentials + +# First, set up a callback function that fetches our credentials off the disk. +# gspread_asyncio needs this to re-authenticate when credentials expire. + +def get_creds(): + # To obtain a service account JSON file, follow these steps: + # https://gspread.readthedocs.io/en/latest/oauth2.html#for-bots-using-service-account + creds = Credentials.from_service_account_file("serviceacct_spreadsheet.json") + scoped = creds.with_scopes([ + "https://spreadsheets.google.com/feeds", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/drive", + ]) + return scoped + +# Create an AsyncioGspreadClientManager object which +# will give us access to the Spreadsheet API. + +agcm = gspread_asyncio.AsyncioGspreadClientManager(get_creds) + +# Here's an example of how you use the API: + +async def example(agcm): + # Always authorize first. + # If you have a long-running program call authorize() repeatedly. + agc = await agcm.authorize() + + ss = await agc.create("Test Spreadsheet") + print("Spreadsheet URL: https://docs.google.com/spreadsheets/d/{0}".format(ss.id)) + print("Open the URL in your browser to see gspread_asyncio in action!") + + # Allow anyone with the URL to write to this spreadsheet. + await agc.insert_permission(ss.id, None, perm_type="anyone", role="writer") + + # Create a new spreadsheet but also grab a reference to the default one. + ws = await ss.add_worksheet("My Test Worksheet", 10, 5) + zero_ws = await ss.get_worksheet(0) + + # Write some stuff to both spreadsheets. + for row in range(1, 11): + for col in range(1, 6): + val = "{0}/{1}".format(row, col) + await ws.update_cell(row, col, val + " ws") + await zero_ws.update_cell(row, col, val + " zero ws") + print("All done!") + +# Turn on debugging if you're new to asyncio! +asyncio.run(example(agcm), debug=True) +``` + +## Observational notes and gotchas + +* This module does not define its own exceptions, it propagates instances of `gspread.exceptions.GSpreadException`. +* Always call `AsyncioGspreadClientManager.authorize()`, `AsyncioGspreadClient.open_*()` and `AsyncioGspreadSpreadsheet.get_worksheet()` before doing any work on a spreadsheet. These methods keep an internal cache so it is painless to call them many times, even inside of a loop. This makes sure you always have a valid set of authentication credentials from Google. +* The only object you should store in your application is the `AsyncioGspreadClientManager` (`agcm`). +* Right now the `gspread` library does not support bulk appends of rows or bulk changes of cells. When this is done `gspread_asyncio` will support batching of these Google API calls without any changes to the Python `gspread_asyncio` API. +* I came up with the default 1.1 second delay between API calls (the `gspread_delay` kwarg) after extensive experimentation. The official API rate limit is one call every second but however Google measures these things introduces a tiny bit of jitter that will get you rate blocked if you ride that limit exactly. +* Google's service reliability on these endpoints is surprisingly bad. There are frequent HTTP 500s and the retry logic will save your butt in long-running scripts or short, one-shot, one-off ones. +* Experimentation also found that Google's credentials expire after an hour and the default `reauth_interval` of 45 minutes takes care of that just fine. + +## License + +MIT + +## Sponsorship + +Development of gspread_asyncio is sponsored by [Pro Football History.com, your source for NFL coaching biographies.](https://pro-football-history.com) + + +%package help +Summary: Development documents and examples for gspread-asyncio +Provides: python3-gspread-asyncio-doc +%description help +# gspread_asyncio + +An [asyncio wrapper](https://docs.python.org/3/library/asyncio.html) for [burnash's excellent Google Spreadsheet API library](https://github.com/burnash/gspread). `gspread_asyncio` isn't just a plain asyncio wrapper around the `gspread` API, it implements several useful and helpful features on top of those APIs. It's useful for long-running processes and one-off scripts. + +Requires Python >= 3.7. + +[](https://gspread-asyncio.readthedocs.io/en/latest/?badge=latest)  + + +## Features + +* Complete async wrapping of the `gspread` API. All `gspread` API calls are run off the main thread in a threadpool executor. +* Internal caching and reuse of `gspread` `Client`/`Spreadsheet`/`Worksheet` objects. +* Automatic renewal of expired credentials. +* Automatic retries of spurious failures from Google's servers (HTTP 5xx). +* Automatic rate limiting with defaults set to Google's default API limits. +* Many methods that don't need to return a value can optionally return an already-scheduled `Future` (the `nowait` kwarg). You can ignore that future, allowing forward progress on your calling coroutine while the asyncio event loop schedules and runs the Google Spreadsheet API call at a later time for you. + +## Example usage + +```python +import asyncio + +import gspread_asyncio + +# from google-auth package +from google.oauth2.service_account import Credentials + +# First, set up a callback function that fetches our credentials off the disk. +# gspread_asyncio needs this to re-authenticate when credentials expire. + +def get_creds(): + # To obtain a service account JSON file, follow these steps: + # https://gspread.readthedocs.io/en/latest/oauth2.html#for-bots-using-service-account + creds = Credentials.from_service_account_file("serviceacct_spreadsheet.json") + scoped = creds.with_scopes([ + "https://spreadsheets.google.com/feeds", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/drive", + ]) + return scoped + +# Create an AsyncioGspreadClientManager object which +# will give us access to the Spreadsheet API. + +agcm = gspread_asyncio.AsyncioGspreadClientManager(get_creds) + +# Here's an example of how you use the API: + +async def example(agcm): + # Always authorize first. + # If you have a long-running program call authorize() repeatedly. + agc = await agcm.authorize() + + ss = await agc.create("Test Spreadsheet") + print("Spreadsheet URL: https://docs.google.com/spreadsheets/d/{0}".format(ss.id)) + print("Open the URL in your browser to see gspread_asyncio in action!") + + # Allow anyone with the URL to write to this spreadsheet. + await agc.insert_permission(ss.id, None, perm_type="anyone", role="writer") + + # Create a new spreadsheet but also grab a reference to the default one. + ws = await ss.add_worksheet("My Test Worksheet", 10, 5) + zero_ws = await ss.get_worksheet(0) + + # Write some stuff to both spreadsheets. + for row in range(1, 11): + for col in range(1, 6): + val = "{0}/{1}".format(row, col) + await ws.update_cell(row, col, val + " ws") + await zero_ws.update_cell(row, col, val + " zero ws") + print("All done!") + +# Turn on debugging if you're new to asyncio! +asyncio.run(example(agcm), debug=True) +``` + +## Observational notes and gotchas + +* This module does not define its own exceptions, it propagates instances of `gspread.exceptions.GSpreadException`. +* Always call `AsyncioGspreadClientManager.authorize()`, `AsyncioGspreadClient.open_*()` and `AsyncioGspreadSpreadsheet.get_worksheet()` before doing any work on a spreadsheet. These methods keep an internal cache so it is painless to call them many times, even inside of a loop. This makes sure you always have a valid set of authentication credentials from Google. +* The only object you should store in your application is the `AsyncioGspreadClientManager` (`agcm`). +* Right now the `gspread` library does not support bulk appends of rows or bulk changes of cells. When this is done `gspread_asyncio` will support batching of these Google API calls without any changes to the Python `gspread_asyncio` API. +* I came up with the default 1.1 second delay between API calls (the `gspread_delay` kwarg) after extensive experimentation. The official API rate limit is one call every second but however Google measures these things introduces a tiny bit of jitter that will get you rate blocked if you ride that limit exactly. +* Google's service reliability on these endpoints is surprisingly bad. There are frequent HTTP 500s and the retry logic will save your butt in long-running scripts or short, one-shot, one-off ones. +* Experimentation also found that Google's credentials expire after an hour and the default `reauth_interval` of 45 minutes takes care of that just fine. + +## License + +MIT + +## Sponsorship + +Development of gspread_asyncio is sponsored by [Pro Football History.com, your source for NFL coaching biographies.](https://pro-football-history.com) + + +%prep +%autosetup -n gspread-asyncio-1.8.1 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-gspread-asyncio -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 1.8.1-1 +- Package Spec generated @@ -0,0 +1 @@ +eec3551c731026cb60b4bc25cde3ef56 gspread_asyncio-1.8.1.tar.gz |