summaryrefslogtreecommitdiff
path: root/python-couchdb2.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-05 07:48:28 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-05 07:48:28 +0000
commit409cda4461088970da3b9f61d860286a45e6d989 (patch)
treec44a2f5f13717dc88e04f656ae7285dd3ffce95c /python-couchdb2.spec
parent9f68356d2e26aab81a7529035738fd91c0780e8e (diff)
automatic import of python-couchdb2openeuler20.03
Diffstat (limited to 'python-couchdb2.spec')
-rw-r--r--python-couchdb2.spec2528
1 files changed, 2528 insertions, 0 deletions
diff --git a/python-couchdb2.spec b/python-couchdb2.spec
new file mode 100644
index 0000000..4a43dc3
--- /dev/null
+++ b/python-couchdb2.spec
@@ -0,0 +1,2528 @@
+%global _empty_manifest_terminate_build 0
+Name: python-CouchDB2
+Version: 1.13.0
+Release: 1
+Summary: C
+License: MIT
+URL: https://github.com/pekrau/CouchDB2
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/1a/c0/aad8f6be8b2ebd71e95454296aa2390d6beb81d5f7a0bc4b3804509f3278/CouchDB2-1.13.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-requests
+Requires: python3-tqdm
+
+%description
+# CouchDB2
+
+CouchDB v2.x Python 3 interface in a single module.
+Also a command line tool; [see below](#command-line-tool).
+
+Most, but not all, features of this module work with CouchDB version < 2.0.
+
+## Installation
+
+The CouchDB2 module is available at [PyPi](https://pypi.org/project/CouchDB2/).
+It can be installed using [pip](https://pip.pypa.io/en/stable/):
+
+```
+$ pip install couchdb2
+```
+
+The module relies on `requests`: http://docs.python-requests.org/en/master/
+and `tqdm`: https://tqdm.github.io/
+
+## Example code
+
+```python
+import couchdb2
+
+server = couchdb2.Server() # Arguments required according to local setup
+db = server.create("test")
+
+doc1 = {"_id": "myid", "name": "mydoc", "level": 4}
+db.put(doc1)
+doc = db["myid"]
+assert doc == doc1
+
+doc2 = {"name": "another", "level": 0}
+db.put(doc2)
+print(doc2)
+# {"_id": "66b5...", "_rev": "1-f3ac...", "name": "another", "level": 0}
+
+db.put_design("mydesign",
+ {"views":
+ {"name": {"map": "function (doc) {emit(doc.name, null);}"}
+ }
+ })
+result = db.view("mydesign", "name", key="another", include_docs=True)
+assert len(result) == 1
+print(result[0].doc) # Same printout as above, using OrderedDict
+
+db.destroy()
+```
+
+## News
+
+- 1.12.0
+ - Added progressbar to `dump` and `undump`, using `tqdm`.
+ - Corrected bug fetching attachments with names having "weird" characters.
+ - Corrected bug creating partitioned database; thanks to https://github.com/N-Vlahovic
+- 1.11.0
+ - Added `db.changes()`. **But not adequately tested!**
+ - Corrected returned value from `set_replicate`: JSON data rather than
+ response from `requests`.
+ - Refactored code: Got rid of `object_pairs_hook=dict` in `json()`.
+ `response.json()` on a separate line everywhere.
+- 1.10.0
+ - Changed to unittest for the test script. Got rid of package `pytest`.
+ Added some tests.
+ - Improved the documentation in source and README.
+ - Fixed setup.py.
+ - Added `__del__` to Server class.
+ - Simplified `get_scheduler_docs`.
+ - Hid module-level functions which are just help functions for the
+ command-line tool.
+ - Removed `CouchDB version >= 2.0` from some methods incorrectly
+ marked as such.
+ - Changed signatures of class Database methods `__init__`, `create`,
+ `find` and `explain`.
+- 1.9.5
+ - Added `__str__` to Server class.
+- 1.9.4
+ - Added `update` parameter on views; thanks to https://github.com/rbarreiro
+ - Added `n` and `q` parameters when creating a database; thanks to
+ https://github.com/elChapoSing
+- 1.9.3
+ - Handle `get_attachment` rev/If-Match issue; thanks to https://github.com/seb4itik
+- 1.9.2
+ - Added retrieve of conflicts; thanks to https://github.com/seb4itik
+- 1.9.1
+ - Added `ca_file` parameter for HTTPS; thanks to https://github.com/seb4itik
+- 1.9.0
+ - Changed `put_attachment` and `delete_attachment` to update the input
+ `doc` by the new `_rev` value.
+- 1.8.5
+ - Added `ids()`: Return an iterator over all document identifiers.
+- 1.8.4
+ - Added `get_bulk(ids)`: Get several documents in one operation.
+
+## `class Server`
+```python
+server = Server(href="http://localhost:5984/",
+ username=None, password=None,
+ use_session=True, ca_file=None)
+```
+An instance of the class is a connection to the CouchDB server.
+
+- `href` is the URL to the CouchDB server itself.
+- `username` and `password` specify the CouchDB user account to use.
+- If `use_session` is `True`, then an authenticated session is used
+ transparently. Otherwise, the values of `username` and `password` are
+ sent with each request.
+- `ca_file` is a path to a file or a directory containing CAs if
+ you need to access databases in HTTPS.
+
+### `server.version`
+
+Property attribute providing the version of the CouchDB server software.
+
+### `server.user_context`
+
+Property attribute providing the user context of the connection.
+
+### `__str__`
+```python
+str(server)
+```
+Returns a simple string representation of the server interface.
+
+### `__len__`
+```python
+len(server)
+```
+Returns the number of user-defined databases.
+
+### `__iter__`
+```python
+for db in server: ...
+```
+Returns an iterator over all user-defined databases on the server.
+
+### `__getitem__`
+```python
+db = server[name]
+```
+Gets the named database.
+
+### `__contains__`
+```python
+if name in server: ...
+```
+Does the named database exist?
+
+### `__call__`
+```python
+data = server()
+```
+Returns meta information about the server.
+
+### `__del__`
+
+Clean-up: Closes the `requests` session.
+
+Not for explicit use; it is automatically called when the Python
+garbage collection mechanism deletes the instance.
+
+### `server.up()`
+
+Is the server up and running, ready to respond to requests?
+Returns a boolean.
+
+*CouchDB version >= 2.0*
+
+### `server.get(name, check=True)`
+
+Gets the named database. Returns an instance of class `Database`.
+
+Raises `NotFoundError` if `check` is `True` and the database does not exist.
+
+### `server.create(name, n=3, q=8, partitioned=False)`
+
+Creates the named database. Raises `CreationError` if it already exists.
+
+- `name`: The name of the database.
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `server.get_config(nodename="_local")`
+
+Gets the named node's configuration.
+
+### `server.get_active_tasks()`
+
+Returns a list of running tasks.
+
+### `server.get_cluster_setup(ensure_dbs_exists=None)`
+
+Returns the status of the node or cluster.
+
+`ensure_dbs_exists` is a list system databases to ensure exist on the
+node/cluster. Defaults to `["_users","_replicator"]`.
+
+*CouchDB version >= 2.0*
+
+### `server.set_cluster_setup(doc)`
+
+Configures a node as a single node, as part of a cluster, or finalise a
+cluster.
+
+See the CouchDB documentation for the contents of `doc`.
+
+*CouchDB version >= 2.0*
+
+### `server.get_membership()`
+
+Returns data about the nodes that are part of the cluster.
+
+*CouchDB version >= 2.0*
+
+### `server.set_replicate(doc)`
+
+Request, configure, or stop, a replication operation.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `server.get_scheduler_jobs(limit=None, skip=None)`
+
+Gets a list of replication jobs.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by replication ID.
+
+### `server.get_scheduler_docs(limit=None, skip=None)`
+
+Gets information about replication document states.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by document ID.
+
+### `server.get_node_stats(nodename="_local")`
+
+Returns statistics for the running server.
+
+### `server.get_node_system(nodename="_local")`
+
+Returns various system-level statistics for the running server.
+
+## `class Database`
+```python
+db = Database(server, name, check=True)
+```
+
+An instance of the class is an interface to a CouchDB database.
+
+- `server`: An instance of Server.
+- `name`: The name of the database.
+- If `check` is `True`, then raise `NotFoundError` if the the database
+ does not exist.
+
+### `__str__`
+```python
+str(db)
+```
+Returns the name of the CouchDB database.
+
+### `__len__`
+```python
+len(db)
+```
+Returns the number of documents in the database.
+
+### `__contains__`
+```python
+if identifier in db: ...
+```
+Does a document with the given identifier exist in the database?
+
+### `__iter__`
+```python
+for doc in db: ...
+```
+Returns an iterator over all documents in the database.
+
+### `__getitem__`
+```python
+doc = db[id]
+```
+Returns the document with the given id.
+
+### `db.exists()`
+
+Does the database exist? Returns a boolean.
+
+### `db.check()`
+
+Raises `NotFoundError` if the database does not exist.
+
+### `db.create(n=3, q=8, partitioned=False)`
+
+Creates the database. Raises `CreationError` if it already exists.
+
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `db.destroy()`
+
+Deletes the database and all its contents.
+
+### `db.get_info()`
+
+Returns a dictionary with information about the database.
+
+### `db.get_security()`
+
+Returns a dictionary with security information for the database.
+
+### `db.set_security(doc)`
+
+Sets the security information for the database.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `db.compact(finish=False, callback=None)`
+
+Compacts the CouchDB database by rewriting the disk database file
+and removing old revisions of documents.
+
+- If `finish` is `True`, then return only when compaction is done.
+- In addition, if defined, the function `callback(seconds)` is called
+ every second until compaction is done.
+
+### `db.compact_design(designname)`
+
+Compacts the view indexes associated with the named design document.
+
+### `db.view_cleanup()`
+
+Removes unnecessary view index files due to changed views in
+design documents of the database.
+
+### `db.get(id, default=None, rev=None, revs_info=False, conflicts=False)`
+
+Returns the document with the given identifier, or the `default` value
+if not found.
+
+- `rev`: Retrieves document of specified revision, if specified.
+- `revs_info`: Whether to include detailed information for all known
+ document revisions.
+- `conflicts`: Whether to include information about conflicts in
+ the document in the `_conflicts` attribute.
+
+### `db.get_bulk(ids)`
+
+Gets several documents in one operation, given a list of document identifiers,
+each of which is a string (the document `_id`), or a tuple of the
+document `(_id, _rev)`.
+
+Returns a list of documents. If no document is found for a specified
+`_id` or `(_id, _rev`), `None` is returned in that slot of the list.
+
+### `db.ids()`
+```python
+for identifier in db.ids(): ...
+```
+
+Returns an iterator over all document identifiers.
+
+### `db.put(doc)`
+
+Inserts or updates the document.
+
+If the document is already in the database, the `_rev` item must
+be present in the document; its value will be updated.
+
+If the document does not contain an item `_id`, it is added
+having a UUID4 hex value. The `_rev` item will also be added.
+
+### `db.update(docs)`
+
+Performs a bulk update or insertion of the given documents using a
+single HTTP request.
+
+Returns an iterable (list) over the resulting documents.
+
+`docs` is a sequence of dictionaries or `Document` objects, or
+objects providing an `items()` method that can be used to convert
+them to a dictionary.
+
+The return value of this method is a list containing a tuple for every
+element in the `docs` sequence. Each tuple is of the form
+`(success, docid, rev_or_exc)`, where `success` is a boolean
+indicating whether the update succeeded, `docid` is the ID of the
+document, and `rev_or_exc` is either the new document revision, or
+an exception instance (e.g. `ResourceConflict`) if the update failed.
+
+If an object in the documents list is not a dictionary, this method
+looks for an `items()` method that can be used to convert the object
+to a dictionary.
+
+### `db.delete(doc)`
+
+Deletes the document, which must contain the `_id` and `_rev` items.
+
+### `db.purge(docs)`
+
+Performs purging (complete removal) of the given list of documents.
+
+Uses a single HTTP request to purge all given documents. Purged
+documents do not leave any meta-data in the storage and are not
+replicated.
+
+### `db.get_designs()`
+
+Returns the design documents for the database.
+
+**NOTE:** *CouchDB version >= 2.2*
+
+### `db.get_design(designname)`
+
+Gets the named design document.
+
+### `db.put_design(designname, doc, rebuild=True)`
+
+Inserts or updates the design document under the given name.
+
+If the existing design document is identical, no action is taken and
+`False` is returned, else the document is updated and `True` is returned.
+
+If `rebuild` is `True`, force view indexes to be rebuilt after update
+by accessing the view. This may take some time.
+
+Example of doc:
+```
+ {"views":
+ {"name":
+ {"map": "function (doc) {emit(doc.name, null);}"},
+ "name_sum":
+ {"map": "function (doc) {emit(doc.name, 1);}",
+ "reduce": "_sum"},
+ "name_count":
+ {"map": "function (doc) {emit(doc.name, null);}",
+ "reduce": "_count"}
+ }}
+```
+
+More info: http://docs.couchdb.org/en/latest/api/ddoc/common.html
+
+### `db.view(designname, viewname, **kwargs)`
+
+Query a view index to obtain data and/or documents.
+
+Keyword arguments (default value is `None` unless specified):
+
+- `key`: Return only rows that match the specified key.
+- `keys`: Return only rows where they key matches one of those specified as a list.
+- `startkey`: Return rows starting with the specified key.
+- `endkey`: Stop returning rows when the specified key is reached.
+- `skip`: Skip the number of rows before starting to return rows.
+- `limit`: Limit the number of rows returned.
+- `sorted=True`: Sort the rows by the key of each returned row. The items
+ `total_rows` and `offset` are not available if set to `False`.
+- `descending=False`: Return the rows in descending order.
+- `group=False`: Group the results using the reduce function of the design
+ document to a group or a single row. If set to `True` implies `reduce`
+ to `True` and defaults the `group_level` to the maximum.
+- `group_level`: Specify the group level to use. Implies `group` is `True`.
+- `reduce`: If set to `False` then do not use the reduce function if there is
+ one defined in the design document. Default is to use the reduce function
+ if defined.
+- `include_docs=False`: If `True`, include the document for each row. This
+ will force `reduce` to `False`.
+- `update="true"`: Whether ir not the view should be updated prior to
+ returning the result. Supported value are `"true"`, `"false"` and `"lazy"`.
+
+Returns an instance of [class ViewResult](#class-viewresultrows-offset-total_rows),
+containing the following attributes:
+
+- `rows`: The list of `Row` objects.
+- `offset`: The offset used for the set of rows.
+- `total_rows`: The total number of rows selected.
+
+A Row object contains the following attributes:
+
+- `id`: The identifier of the document, if any.
+- `key`: The key for the index row.
+- `value`: The value for the index row.
+- `doc`: The document, if any.
+
+### `db.get_indexes()`
+
+Returns a list of all Mango indexes in the database.
+
+*CouchDB version >= 2.0*
+
+### `db.put_index(fields, ddoc=None, name=None, selector=None)`
+
+Stores a Mango index specification.
+
+- `fields`: A list of fields to index.
+- `ddoc`: The design document name. Generated if none given.
+- `name`: The name of the index. Generated if none given.
+- `selector`: A partial filter selector, which may be omitted.
+
+Returns a dictionary with items `id` (design document name; sic!),
+`name` (index name) and `result` (`created` or `exists`).
+
+*CouchDB version >= 2.0*
+
+### `db.delete_index(designname, name)`
+
+Deletes the named index in the design document of the given name.
+
+*CouchDB version >= 2.0*
+
+### `db.find(selector, **kwargs)`
+```python
+data = db.find(selector, limit=25, skip=None, sort=None, fields=None,
+ use_index=None, bookmark=None, update=True, conflicts=False)
+```
+Selects documents according to the Mango index `selector`.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `use_index`: String or list of strings specifying the index(es) to use.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+- `update`: Whether to update the index prior to returning the result.
+- `conflicts`: Whether to include conflicted documents.
+
+Returns a dictionary with items `docs`, `warning`, `execution_stats`
+and `bookmark`.
+
+*CouchDB version >= 2.0*
+
+### `db.explain(selector, **kwargs)`
+```python
+data = db.explain(selector, use_index=None, limit=None, skip=None,
+ sort=None, fields=None, bookmark=None)
+```
+Returns info on which index is being used by the query.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+
+*CouchDB version >= 2.0*
+
+### `db.get_attachment(doc, filename)`
+
+Returns a file-like object containing the content of the specified attachment.
+
+### `db.put_attachment(doc, content, filename=None, content_type=None)`
+
+Adds or updates the given file as an attachment to the given document
+in the database.
+
+- `content` is a string or a file-like object.
+- If `filename` is not provided, then an attempt is made to get it from
+ the `content` object. If this fails, `ValueError` is raised.
+- If `content_type` is not provided, then an attempt to guess it from
+ the filename extension is made. If that does not work, it is
+ set to `"application/octet-stream"`
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.delete_attachment(doc, filename)`
+
+Deletes the attachment.
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.dump(filepath, callback=None, exclude_designs=False, progressbar=False)`
+
+Dumps the entire database to a `tar` file.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files written out.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `exclude_designs` is True, design document will be excluded from the dump.
+
+If `progressbar` is True, display a progress bar.
+
+If the filepath ends with `.gz`, then the tar file is gzip compressed.
+The `_rev` item of each document is included in the dump.
+
+### `db.undump(filepath, callback=None, progressbar=False)`
+
+Loads the `tar` file given by the path. It must have been produced by `db.dump`.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files read from the file.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `progressbar` is True, display a progress bar.
+
+**NOTE**: The documents are just added to the database, ignoring any
+`_rev` items. This means that no document with the same identifier
+may exist in the database.
+
+## `CouchDB2Exception`
+
+The Base CouchDB2 exception, from which all others derive.
+
+## `NotFoundError`
+
+No such entity (e.g. database or document) exists.
+
+## `BadRequestError`
+
+Invalid request; bad name, body or headers.
+
+## `CreationError`
+
+Could not create the entity; it exists already.
+
+## `RevisionError`
+
+Wrong or missing `_rev` item in the document to save.
+
+## `AuthorizationError`
+
+Current user not authorized to perform the operation.
+
+## `ContentTypeError`
+
+Bad `Content-Type` value in the request.
+
+## `ServerError`
+
+Internal CouchDB server error.
+
+## `class ViewResult(rows, offset, total_rows)`
+
+An instance of this class is returned as result from `db.view()`.
+Instances of this class are not supposed to be created by client software.
+
+Attributes:
+
+- `rows`: the list of `Row` objects.
+- `offset`: the offset used for the set of rows.
+- `total_rows`: the total number of rows selected.
+
+### `__len__`
+```python
+len(viewresult)
+```
+Return the number of rows in the view result.
+
+### `__iter__`
+```python
+for row in viewresult: ...
+```
+Return an iterator over all rows in the view result.
+
+### `__getitem__`
+```python
+row = viewresult[i]
+```
+Return the indexed view result row.
+
+### `vr.json()`
+
+Return the view result data in a JSON-like representation.
+
+## `class Row(id, key, value, doc)`
+
+Named-tuple object returned in ViewResult list attribute `rows`.
+
+Attributes:
+
+- `id`: the identifier of the document, if any. Alias for `row[0]`.
+- `key`: the key for the index row. Alias for `row[1]`.
+- `value`: the value for the index row. Alias for `row[2]`.
+- `doc`: the document, if any. Alias for `row[3]`.
+
+## Utility functions at the module level
+
+### `read_settings(filepath, settings=None)`
+
+Read the settings lookup from a JSON format file.
+
+If `settings` is given, then return an updated copy of it,
+else copy the default settings, update, and return it.
+
+## Command line tool
+
+The module is also a command line tool for interacting with the CouchDB server.
+It is installed if `pip` is used to install this module.
+
+Settings for the command line tool are updated from the following sources,
+each in the order given and if it exists:
+
+1) Default values are
+ ```
+ {
+ "SERVER": "http://localhost:5984",
+ "DATABASE": null,
+ "USERNAME": null,
+ "PASSWORD": null
+ }
+ ```
+2) Read from the JSON file `~/.couchdb2` (in your home directory).
+3) Read from the JSON file `settings.json` (in the current working directory).
+4) Read from the JSON file given by command line option `--settings FILEPATH`.
+5) From environment variables.
+6) From command line arguments.
+
+### Options
+
+To show available command options:
+
+```
+$ couchdb2 -h
+usage: couchdb2 [options]
+
+CouchDB v2.x command line tool, leveraging Python module CouchDB2.
+
+optional arguments:
+ -h, --help show this help message and exit
+ --settings FILEPATH Settings file in JSON format.
+ -S SERVER, --server SERVER
+ CouchDB server URL, including port number.
+ -d DATABASE, --database DATABASE
+ Database to operate on.
+ -u USERNAME, --username USERNAME
+ CouchDB user account name.
+ -p PASSWORD, --password PASSWORD
+ CouchDB user account password.
+ -q, --password_question
+ Ask for the password by interactive input.
+ --ca_file FILE_OR_DIRPATH
+ File or directory containing CAs.
+ -o FILEPATH, --output FILEPATH
+ Write output to the given file (JSON format).
+ --indent INT Indentation level for JSON format output file.
+ -y, --yes Do not ask for confirmation (delete, destroy, undump).
+ -v, --verbose Print more information.
+ -s, --silent Print no information.
+
+server operations:
+ -V, --version Output CouchDB server version.
+ --list Output a list of the databases on the server.
+
+Database operations.:
+ --create Create the database.
+ --destroy Delete the database and all its contents.
+ --compact Compact the database; may take some time.
+ --compact_design DDOC
+ Compact the view indexes for the named design doc.
+ --view_cleanup Remove view index files no longer required.
+ --info Output information about the database.
+ --security Output security information for the database.
+ --set_security FILEPATH
+ Set security information for the database from the
+ JSON file.
+ --list_designs List design documents for the database.
+ --design DDOC Output the named design document.
+ --put_design DDOC FILEPATH
+ Store the named design document from the file.
+ --delete_design DDOC Delete the named design document.
+ --dump FILEPATH Create a dump file of the database.
+ --undump FILEPATH Load a dump file into the database.
+
+Document operations.:
+ -G DOCID, --get DOCID
+ Output the document with the given identifier.
+ -P FILEPATH, --put FILEPATH
+ Store the document; arg is literal doc or filepath.
+ --delete DOCID Delete the document with the given identifier.
+
+attachments to document:
+ --attach DOCID FILEPATH
+ Attach the specified file to the given document.
+ --detach DOCID FILENAME
+ Remove the attached file from the given document.
+ --get_attach DOCID FILENAME
+ Get the attached file from the given document; write
+ to same filepath or that given by '-o'.
+
+query a design view, returning rows:
+ --view SPEC Design view '{design}/{view}' to query.
+ --key KEY Key value selecting view rows.
+ --startkey KEY Start key value selecting range of view rows.
+ --endkey KEY End key value selecting range of view rows.
+ --startkey_docid DOCID
+ Return rows starting with the specified document.
+ --endkey_docid DOCID Stop returning rows when specified document reached.
+ --group Group the results using the 'reduce' function.
+ --group_level INT Specify the group level to use.
+ --noreduce Do not use the 'reduce' function of the view.
+ --limit INT Limit the number of returned rows.
+ --skip INT Skip this number of rows before returning result.
+ --descending Sort rows in descending order (swap start/end keys!).
+ --include_docs Include documents in result.
+```
+
+
+
+
+%package -n python3-CouchDB2
+Summary: C
+Provides: python-CouchDB2
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-CouchDB2
+# CouchDB2
+
+CouchDB v2.x Python 3 interface in a single module.
+Also a command line tool; [see below](#command-line-tool).
+
+Most, but not all, features of this module work with CouchDB version < 2.0.
+
+## Installation
+
+The CouchDB2 module is available at [PyPi](https://pypi.org/project/CouchDB2/).
+It can be installed using [pip](https://pip.pypa.io/en/stable/):
+
+```
+$ pip install couchdb2
+```
+
+The module relies on `requests`: http://docs.python-requests.org/en/master/
+and `tqdm`: https://tqdm.github.io/
+
+## Example code
+
+```python
+import couchdb2
+
+server = couchdb2.Server() # Arguments required according to local setup
+db = server.create("test")
+
+doc1 = {"_id": "myid", "name": "mydoc", "level": 4}
+db.put(doc1)
+doc = db["myid"]
+assert doc == doc1
+
+doc2 = {"name": "another", "level": 0}
+db.put(doc2)
+print(doc2)
+# {"_id": "66b5...", "_rev": "1-f3ac...", "name": "another", "level": 0}
+
+db.put_design("mydesign",
+ {"views":
+ {"name": {"map": "function (doc) {emit(doc.name, null);}"}
+ }
+ })
+result = db.view("mydesign", "name", key="another", include_docs=True)
+assert len(result) == 1
+print(result[0].doc) # Same printout as above, using OrderedDict
+
+db.destroy()
+```
+
+## News
+
+- 1.12.0
+ - Added progressbar to `dump` and `undump`, using `tqdm`.
+ - Corrected bug fetching attachments with names having "weird" characters.
+ - Corrected bug creating partitioned database; thanks to https://github.com/N-Vlahovic
+- 1.11.0
+ - Added `db.changes()`. **But not adequately tested!**
+ - Corrected returned value from `set_replicate`: JSON data rather than
+ response from `requests`.
+ - Refactored code: Got rid of `object_pairs_hook=dict` in `json()`.
+ `response.json()` on a separate line everywhere.
+- 1.10.0
+ - Changed to unittest for the test script. Got rid of package `pytest`.
+ Added some tests.
+ - Improved the documentation in source and README.
+ - Fixed setup.py.
+ - Added `__del__` to Server class.
+ - Simplified `get_scheduler_docs`.
+ - Hid module-level functions which are just help functions for the
+ command-line tool.
+ - Removed `CouchDB version >= 2.0` from some methods incorrectly
+ marked as such.
+ - Changed signatures of class Database methods `__init__`, `create`,
+ `find` and `explain`.
+- 1.9.5
+ - Added `__str__` to Server class.
+- 1.9.4
+ - Added `update` parameter on views; thanks to https://github.com/rbarreiro
+ - Added `n` and `q` parameters when creating a database; thanks to
+ https://github.com/elChapoSing
+- 1.9.3
+ - Handle `get_attachment` rev/If-Match issue; thanks to https://github.com/seb4itik
+- 1.9.2
+ - Added retrieve of conflicts; thanks to https://github.com/seb4itik
+- 1.9.1
+ - Added `ca_file` parameter for HTTPS; thanks to https://github.com/seb4itik
+- 1.9.0
+ - Changed `put_attachment` and `delete_attachment` to update the input
+ `doc` by the new `_rev` value.
+- 1.8.5
+ - Added `ids()`: Return an iterator over all document identifiers.
+- 1.8.4
+ - Added `get_bulk(ids)`: Get several documents in one operation.
+
+## `class Server`
+```python
+server = Server(href="http://localhost:5984/",
+ username=None, password=None,
+ use_session=True, ca_file=None)
+```
+An instance of the class is a connection to the CouchDB server.
+
+- `href` is the URL to the CouchDB server itself.
+- `username` and `password` specify the CouchDB user account to use.
+- If `use_session` is `True`, then an authenticated session is used
+ transparently. Otherwise, the values of `username` and `password` are
+ sent with each request.
+- `ca_file` is a path to a file or a directory containing CAs if
+ you need to access databases in HTTPS.
+
+### `server.version`
+
+Property attribute providing the version of the CouchDB server software.
+
+### `server.user_context`
+
+Property attribute providing the user context of the connection.
+
+### `__str__`
+```python
+str(server)
+```
+Returns a simple string representation of the server interface.
+
+### `__len__`
+```python
+len(server)
+```
+Returns the number of user-defined databases.
+
+### `__iter__`
+```python
+for db in server: ...
+```
+Returns an iterator over all user-defined databases on the server.
+
+### `__getitem__`
+```python
+db = server[name]
+```
+Gets the named database.
+
+### `__contains__`
+```python
+if name in server: ...
+```
+Does the named database exist?
+
+### `__call__`
+```python
+data = server()
+```
+Returns meta information about the server.
+
+### `__del__`
+
+Clean-up: Closes the `requests` session.
+
+Not for explicit use; it is automatically called when the Python
+garbage collection mechanism deletes the instance.
+
+### `server.up()`
+
+Is the server up and running, ready to respond to requests?
+Returns a boolean.
+
+*CouchDB version >= 2.0*
+
+### `server.get(name, check=True)`
+
+Gets the named database. Returns an instance of class `Database`.
+
+Raises `NotFoundError` if `check` is `True` and the database does not exist.
+
+### `server.create(name, n=3, q=8, partitioned=False)`
+
+Creates the named database. Raises `CreationError` if it already exists.
+
+- `name`: The name of the database.
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `server.get_config(nodename="_local")`
+
+Gets the named node's configuration.
+
+### `server.get_active_tasks()`
+
+Returns a list of running tasks.
+
+### `server.get_cluster_setup(ensure_dbs_exists=None)`
+
+Returns the status of the node or cluster.
+
+`ensure_dbs_exists` is a list system databases to ensure exist on the
+node/cluster. Defaults to `["_users","_replicator"]`.
+
+*CouchDB version >= 2.0*
+
+### `server.set_cluster_setup(doc)`
+
+Configures a node as a single node, as part of a cluster, or finalise a
+cluster.
+
+See the CouchDB documentation for the contents of `doc`.
+
+*CouchDB version >= 2.0*
+
+### `server.get_membership()`
+
+Returns data about the nodes that are part of the cluster.
+
+*CouchDB version >= 2.0*
+
+### `server.set_replicate(doc)`
+
+Request, configure, or stop, a replication operation.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `server.get_scheduler_jobs(limit=None, skip=None)`
+
+Gets a list of replication jobs.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by replication ID.
+
+### `server.get_scheduler_docs(limit=None, skip=None)`
+
+Gets information about replication document states.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by document ID.
+
+### `server.get_node_stats(nodename="_local")`
+
+Returns statistics for the running server.
+
+### `server.get_node_system(nodename="_local")`
+
+Returns various system-level statistics for the running server.
+
+## `class Database`
+```python
+db = Database(server, name, check=True)
+```
+
+An instance of the class is an interface to a CouchDB database.
+
+- `server`: An instance of Server.
+- `name`: The name of the database.
+- If `check` is `True`, then raise `NotFoundError` if the the database
+ does not exist.
+
+### `__str__`
+```python
+str(db)
+```
+Returns the name of the CouchDB database.
+
+### `__len__`
+```python
+len(db)
+```
+Returns the number of documents in the database.
+
+### `__contains__`
+```python
+if identifier in db: ...
+```
+Does a document with the given identifier exist in the database?
+
+### `__iter__`
+```python
+for doc in db: ...
+```
+Returns an iterator over all documents in the database.
+
+### `__getitem__`
+```python
+doc = db[id]
+```
+Returns the document with the given id.
+
+### `db.exists()`
+
+Does the database exist? Returns a boolean.
+
+### `db.check()`
+
+Raises `NotFoundError` if the database does not exist.
+
+### `db.create(n=3, q=8, partitioned=False)`
+
+Creates the database. Raises `CreationError` if it already exists.
+
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `db.destroy()`
+
+Deletes the database and all its contents.
+
+### `db.get_info()`
+
+Returns a dictionary with information about the database.
+
+### `db.get_security()`
+
+Returns a dictionary with security information for the database.
+
+### `db.set_security(doc)`
+
+Sets the security information for the database.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `db.compact(finish=False, callback=None)`
+
+Compacts the CouchDB database by rewriting the disk database file
+and removing old revisions of documents.
+
+- If `finish` is `True`, then return only when compaction is done.
+- In addition, if defined, the function `callback(seconds)` is called
+ every second until compaction is done.
+
+### `db.compact_design(designname)`
+
+Compacts the view indexes associated with the named design document.
+
+### `db.view_cleanup()`
+
+Removes unnecessary view index files due to changed views in
+design documents of the database.
+
+### `db.get(id, default=None, rev=None, revs_info=False, conflicts=False)`
+
+Returns the document with the given identifier, or the `default` value
+if not found.
+
+- `rev`: Retrieves document of specified revision, if specified.
+- `revs_info`: Whether to include detailed information for all known
+ document revisions.
+- `conflicts`: Whether to include information about conflicts in
+ the document in the `_conflicts` attribute.
+
+### `db.get_bulk(ids)`
+
+Gets several documents in one operation, given a list of document identifiers,
+each of which is a string (the document `_id`), or a tuple of the
+document `(_id, _rev)`.
+
+Returns a list of documents. If no document is found for a specified
+`_id` or `(_id, _rev`), `None` is returned in that slot of the list.
+
+### `db.ids()`
+```python
+for identifier in db.ids(): ...
+```
+
+Returns an iterator over all document identifiers.
+
+### `db.put(doc)`
+
+Inserts or updates the document.
+
+If the document is already in the database, the `_rev` item must
+be present in the document; its value will be updated.
+
+If the document does not contain an item `_id`, it is added
+having a UUID4 hex value. The `_rev` item will also be added.
+
+### `db.update(docs)`
+
+Performs a bulk update or insertion of the given documents using a
+single HTTP request.
+
+Returns an iterable (list) over the resulting documents.
+
+`docs` is a sequence of dictionaries or `Document` objects, or
+objects providing an `items()` method that can be used to convert
+them to a dictionary.
+
+The return value of this method is a list containing a tuple for every
+element in the `docs` sequence. Each tuple is of the form
+`(success, docid, rev_or_exc)`, where `success` is a boolean
+indicating whether the update succeeded, `docid` is the ID of the
+document, and `rev_or_exc` is either the new document revision, or
+an exception instance (e.g. `ResourceConflict`) if the update failed.
+
+If an object in the documents list is not a dictionary, this method
+looks for an `items()` method that can be used to convert the object
+to a dictionary.
+
+### `db.delete(doc)`
+
+Deletes the document, which must contain the `_id` and `_rev` items.
+
+### `db.purge(docs)`
+
+Performs purging (complete removal) of the given list of documents.
+
+Uses a single HTTP request to purge all given documents. Purged
+documents do not leave any meta-data in the storage and are not
+replicated.
+
+### `db.get_designs()`
+
+Returns the design documents for the database.
+
+**NOTE:** *CouchDB version >= 2.2*
+
+### `db.get_design(designname)`
+
+Gets the named design document.
+
+### `db.put_design(designname, doc, rebuild=True)`
+
+Inserts or updates the design document under the given name.
+
+If the existing design document is identical, no action is taken and
+`False` is returned, else the document is updated and `True` is returned.
+
+If `rebuild` is `True`, force view indexes to be rebuilt after update
+by accessing the view. This may take some time.
+
+Example of doc:
+```
+ {"views":
+ {"name":
+ {"map": "function (doc) {emit(doc.name, null);}"},
+ "name_sum":
+ {"map": "function (doc) {emit(doc.name, 1);}",
+ "reduce": "_sum"},
+ "name_count":
+ {"map": "function (doc) {emit(doc.name, null);}",
+ "reduce": "_count"}
+ }}
+```
+
+More info: http://docs.couchdb.org/en/latest/api/ddoc/common.html
+
+### `db.view(designname, viewname, **kwargs)`
+
+Query a view index to obtain data and/or documents.
+
+Keyword arguments (default value is `None` unless specified):
+
+- `key`: Return only rows that match the specified key.
+- `keys`: Return only rows where they key matches one of those specified as a list.
+- `startkey`: Return rows starting with the specified key.
+- `endkey`: Stop returning rows when the specified key is reached.
+- `skip`: Skip the number of rows before starting to return rows.
+- `limit`: Limit the number of rows returned.
+- `sorted=True`: Sort the rows by the key of each returned row. The items
+ `total_rows` and `offset` are not available if set to `False`.
+- `descending=False`: Return the rows in descending order.
+- `group=False`: Group the results using the reduce function of the design
+ document to a group or a single row. If set to `True` implies `reduce`
+ to `True` and defaults the `group_level` to the maximum.
+- `group_level`: Specify the group level to use. Implies `group` is `True`.
+- `reduce`: If set to `False` then do not use the reduce function if there is
+ one defined in the design document. Default is to use the reduce function
+ if defined.
+- `include_docs=False`: If `True`, include the document for each row. This
+ will force `reduce` to `False`.
+- `update="true"`: Whether ir not the view should be updated prior to
+ returning the result. Supported value are `"true"`, `"false"` and `"lazy"`.
+
+Returns an instance of [class ViewResult](#class-viewresultrows-offset-total_rows),
+containing the following attributes:
+
+- `rows`: The list of `Row` objects.
+- `offset`: The offset used for the set of rows.
+- `total_rows`: The total number of rows selected.
+
+A Row object contains the following attributes:
+
+- `id`: The identifier of the document, if any.
+- `key`: The key for the index row.
+- `value`: The value for the index row.
+- `doc`: The document, if any.
+
+### `db.get_indexes()`
+
+Returns a list of all Mango indexes in the database.
+
+*CouchDB version >= 2.0*
+
+### `db.put_index(fields, ddoc=None, name=None, selector=None)`
+
+Stores a Mango index specification.
+
+- `fields`: A list of fields to index.
+- `ddoc`: The design document name. Generated if none given.
+- `name`: The name of the index. Generated if none given.
+- `selector`: A partial filter selector, which may be omitted.
+
+Returns a dictionary with items `id` (design document name; sic!),
+`name` (index name) and `result` (`created` or `exists`).
+
+*CouchDB version >= 2.0*
+
+### `db.delete_index(designname, name)`
+
+Deletes the named index in the design document of the given name.
+
+*CouchDB version >= 2.0*
+
+### `db.find(selector, **kwargs)`
+```python
+data = db.find(selector, limit=25, skip=None, sort=None, fields=None,
+ use_index=None, bookmark=None, update=True, conflicts=False)
+```
+Selects documents according to the Mango index `selector`.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `use_index`: String or list of strings specifying the index(es) to use.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+- `update`: Whether to update the index prior to returning the result.
+- `conflicts`: Whether to include conflicted documents.
+
+Returns a dictionary with items `docs`, `warning`, `execution_stats`
+and `bookmark`.
+
+*CouchDB version >= 2.0*
+
+### `db.explain(selector, **kwargs)`
+```python
+data = db.explain(selector, use_index=None, limit=None, skip=None,
+ sort=None, fields=None, bookmark=None)
+```
+Returns info on which index is being used by the query.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+
+*CouchDB version >= 2.0*
+
+### `db.get_attachment(doc, filename)`
+
+Returns a file-like object containing the content of the specified attachment.
+
+### `db.put_attachment(doc, content, filename=None, content_type=None)`
+
+Adds or updates the given file as an attachment to the given document
+in the database.
+
+- `content` is a string or a file-like object.
+- If `filename` is not provided, then an attempt is made to get it from
+ the `content` object. If this fails, `ValueError` is raised.
+- If `content_type` is not provided, then an attempt to guess it from
+ the filename extension is made. If that does not work, it is
+ set to `"application/octet-stream"`
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.delete_attachment(doc, filename)`
+
+Deletes the attachment.
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.dump(filepath, callback=None, exclude_designs=False, progressbar=False)`
+
+Dumps the entire database to a `tar` file.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files written out.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `exclude_designs` is True, design document will be excluded from the dump.
+
+If `progressbar` is True, display a progress bar.
+
+If the filepath ends with `.gz`, then the tar file is gzip compressed.
+The `_rev` item of each document is included in the dump.
+
+### `db.undump(filepath, callback=None, progressbar=False)`
+
+Loads the `tar` file given by the path. It must have been produced by `db.dump`.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files read from the file.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `progressbar` is True, display a progress bar.
+
+**NOTE**: The documents are just added to the database, ignoring any
+`_rev` items. This means that no document with the same identifier
+may exist in the database.
+
+## `CouchDB2Exception`
+
+The Base CouchDB2 exception, from which all others derive.
+
+## `NotFoundError`
+
+No such entity (e.g. database or document) exists.
+
+## `BadRequestError`
+
+Invalid request; bad name, body or headers.
+
+## `CreationError`
+
+Could not create the entity; it exists already.
+
+## `RevisionError`
+
+Wrong or missing `_rev` item in the document to save.
+
+## `AuthorizationError`
+
+Current user not authorized to perform the operation.
+
+## `ContentTypeError`
+
+Bad `Content-Type` value in the request.
+
+## `ServerError`
+
+Internal CouchDB server error.
+
+## `class ViewResult(rows, offset, total_rows)`
+
+An instance of this class is returned as result from `db.view()`.
+Instances of this class are not supposed to be created by client software.
+
+Attributes:
+
+- `rows`: the list of `Row` objects.
+- `offset`: the offset used for the set of rows.
+- `total_rows`: the total number of rows selected.
+
+### `__len__`
+```python
+len(viewresult)
+```
+Return the number of rows in the view result.
+
+### `__iter__`
+```python
+for row in viewresult: ...
+```
+Return an iterator over all rows in the view result.
+
+### `__getitem__`
+```python
+row = viewresult[i]
+```
+Return the indexed view result row.
+
+### `vr.json()`
+
+Return the view result data in a JSON-like representation.
+
+## `class Row(id, key, value, doc)`
+
+Named-tuple object returned in ViewResult list attribute `rows`.
+
+Attributes:
+
+- `id`: the identifier of the document, if any. Alias for `row[0]`.
+- `key`: the key for the index row. Alias for `row[1]`.
+- `value`: the value for the index row. Alias for `row[2]`.
+- `doc`: the document, if any. Alias for `row[3]`.
+
+## Utility functions at the module level
+
+### `read_settings(filepath, settings=None)`
+
+Read the settings lookup from a JSON format file.
+
+If `settings` is given, then return an updated copy of it,
+else copy the default settings, update, and return it.
+
+## Command line tool
+
+The module is also a command line tool for interacting with the CouchDB server.
+It is installed if `pip` is used to install this module.
+
+Settings for the command line tool are updated from the following sources,
+each in the order given and if it exists:
+
+1) Default values are
+ ```
+ {
+ "SERVER": "http://localhost:5984",
+ "DATABASE": null,
+ "USERNAME": null,
+ "PASSWORD": null
+ }
+ ```
+2) Read from the JSON file `~/.couchdb2` (in your home directory).
+3) Read from the JSON file `settings.json` (in the current working directory).
+4) Read from the JSON file given by command line option `--settings FILEPATH`.
+5) From environment variables.
+6) From command line arguments.
+
+### Options
+
+To show available command options:
+
+```
+$ couchdb2 -h
+usage: couchdb2 [options]
+
+CouchDB v2.x command line tool, leveraging Python module CouchDB2.
+
+optional arguments:
+ -h, --help show this help message and exit
+ --settings FILEPATH Settings file in JSON format.
+ -S SERVER, --server SERVER
+ CouchDB server URL, including port number.
+ -d DATABASE, --database DATABASE
+ Database to operate on.
+ -u USERNAME, --username USERNAME
+ CouchDB user account name.
+ -p PASSWORD, --password PASSWORD
+ CouchDB user account password.
+ -q, --password_question
+ Ask for the password by interactive input.
+ --ca_file FILE_OR_DIRPATH
+ File or directory containing CAs.
+ -o FILEPATH, --output FILEPATH
+ Write output to the given file (JSON format).
+ --indent INT Indentation level for JSON format output file.
+ -y, --yes Do not ask for confirmation (delete, destroy, undump).
+ -v, --verbose Print more information.
+ -s, --silent Print no information.
+
+server operations:
+ -V, --version Output CouchDB server version.
+ --list Output a list of the databases on the server.
+
+Database operations.:
+ --create Create the database.
+ --destroy Delete the database and all its contents.
+ --compact Compact the database; may take some time.
+ --compact_design DDOC
+ Compact the view indexes for the named design doc.
+ --view_cleanup Remove view index files no longer required.
+ --info Output information about the database.
+ --security Output security information for the database.
+ --set_security FILEPATH
+ Set security information for the database from the
+ JSON file.
+ --list_designs List design documents for the database.
+ --design DDOC Output the named design document.
+ --put_design DDOC FILEPATH
+ Store the named design document from the file.
+ --delete_design DDOC Delete the named design document.
+ --dump FILEPATH Create a dump file of the database.
+ --undump FILEPATH Load a dump file into the database.
+
+Document operations.:
+ -G DOCID, --get DOCID
+ Output the document with the given identifier.
+ -P FILEPATH, --put FILEPATH
+ Store the document; arg is literal doc or filepath.
+ --delete DOCID Delete the document with the given identifier.
+
+attachments to document:
+ --attach DOCID FILEPATH
+ Attach the specified file to the given document.
+ --detach DOCID FILENAME
+ Remove the attached file from the given document.
+ --get_attach DOCID FILENAME
+ Get the attached file from the given document; write
+ to same filepath or that given by '-o'.
+
+query a design view, returning rows:
+ --view SPEC Design view '{design}/{view}' to query.
+ --key KEY Key value selecting view rows.
+ --startkey KEY Start key value selecting range of view rows.
+ --endkey KEY End key value selecting range of view rows.
+ --startkey_docid DOCID
+ Return rows starting with the specified document.
+ --endkey_docid DOCID Stop returning rows when specified document reached.
+ --group Group the results using the 'reduce' function.
+ --group_level INT Specify the group level to use.
+ --noreduce Do not use the 'reduce' function of the view.
+ --limit INT Limit the number of returned rows.
+ --skip INT Skip this number of rows before returning result.
+ --descending Sort rows in descending order (swap start/end keys!).
+ --include_docs Include documents in result.
+```
+
+
+
+
+%package help
+Summary: Development documents and examples for CouchDB2
+Provides: python3-CouchDB2-doc
+%description help
+# CouchDB2
+
+CouchDB v2.x Python 3 interface in a single module.
+Also a command line tool; [see below](#command-line-tool).
+
+Most, but not all, features of this module work with CouchDB version < 2.0.
+
+## Installation
+
+The CouchDB2 module is available at [PyPi](https://pypi.org/project/CouchDB2/).
+It can be installed using [pip](https://pip.pypa.io/en/stable/):
+
+```
+$ pip install couchdb2
+```
+
+The module relies on `requests`: http://docs.python-requests.org/en/master/
+and `tqdm`: https://tqdm.github.io/
+
+## Example code
+
+```python
+import couchdb2
+
+server = couchdb2.Server() # Arguments required according to local setup
+db = server.create("test")
+
+doc1 = {"_id": "myid", "name": "mydoc", "level": 4}
+db.put(doc1)
+doc = db["myid"]
+assert doc == doc1
+
+doc2 = {"name": "another", "level": 0}
+db.put(doc2)
+print(doc2)
+# {"_id": "66b5...", "_rev": "1-f3ac...", "name": "another", "level": 0}
+
+db.put_design("mydesign",
+ {"views":
+ {"name": {"map": "function (doc) {emit(doc.name, null);}"}
+ }
+ })
+result = db.view("mydesign", "name", key="another", include_docs=True)
+assert len(result) == 1
+print(result[0].doc) # Same printout as above, using OrderedDict
+
+db.destroy()
+```
+
+## News
+
+- 1.12.0
+ - Added progressbar to `dump` and `undump`, using `tqdm`.
+ - Corrected bug fetching attachments with names having "weird" characters.
+ - Corrected bug creating partitioned database; thanks to https://github.com/N-Vlahovic
+- 1.11.0
+ - Added `db.changes()`. **But not adequately tested!**
+ - Corrected returned value from `set_replicate`: JSON data rather than
+ response from `requests`.
+ - Refactored code: Got rid of `object_pairs_hook=dict` in `json()`.
+ `response.json()` on a separate line everywhere.
+- 1.10.0
+ - Changed to unittest for the test script. Got rid of package `pytest`.
+ Added some tests.
+ - Improved the documentation in source and README.
+ - Fixed setup.py.
+ - Added `__del__` to Server class.
+ - Simplified `get_scheduler_docs`.
+ - Hid module-level functions which are just help functions for the
+ command-line tool.
+ - Removed `CouchDB version >= 2.0` from some methods incorrectly
+ marked as such.
+ - Changed signatures of class Database methods `__init__`, `create`,
+ `find` and `explain`.
+- 1.9.5
+ - Added `__str__` to Server class.
+- 1.9.4
+ - Added `update` parameter on views; thanks to https://github.com/rbarreiro
+ - Added `n` and `q` parameters when creating a database; thanks to
+ https://github.com/elChapoSing
+- 1.9.3
+ - Handle `get_attachment` rev/If-Match issue; thanks to https://github.com/seb4itik
+- 1.9.2
+ - Added retrieve of conflicts; thanks to https://github.com/seb4itik
+- 1.9.1
+ - Added `ca_file` parameter for HTTPS; thanks to https://github.com/seb4itik
+- 1.9.0
+ - Changed `put_attachment` and `delete_attachment` to update the input
+ `doc` by the new `_rev` value.
+- 1.8.5
+ - Added `ids()`: Return an iterator over all document identifiers.
+- 1.8.4
+ - Added `get_bulk(ids)`: Get several documents in one operation.
+
+## `class Server`
+```python
+server = Server(href="http://localhost:5984/",
+ username=None, password=None,
+ use_session=True, ca_file=None)
+```
+An instance of the class is a connection to the CouchDB server.
+
+- `href` is the URL to the CouchDB server itself.
+- `username` and `password` specify the CouchDB user account to use.
+- If `use_session` is `True`, then an authenticated session is used
+ transparently. Otherwise, the values of `username` and `password` are
+ sent with each request.
+- `ca_file` is a path to a file or a directory containing CAs if
+ you need to access databases in HTTPS.
+
+### `server.version`
+
+Property attribute providing the version of the CouchDB server software.
+
+### `server.user_context`
+
+Property attribute providing the user context of the connection.
+
+### `__str__`
+```python
+str(server)
+```
+Returns a simple string representation of the server interface.
+
+### `__len__`
+```python
+len(server)
+```
+Returns the number of user-defined databases.
+
+### `__iter__`
+```python
+for db in server: ...
+```
+Returns an iterator over all user-defined databases on the server.
+
+### `__getitem__`
+```python
+db = server[name]
+```
+Gets the named database.
+
+### `__contains__`
+```python
+if name in server: ...
+```
+Does the named database exist?
+
+### `__call__`
+```python
+data = server()
+```
+Returns meta information about the server.
+
+### `__del__`
+
+Clean-up: Closes the `requests` session.
+
+Not for explicit use; it is automatically called when the Python
+garbage collection mechanism deletes the instance.
+
+### `server.up()`
+
+Is the server up and running, ready to respond to requests?
+Returns a boolean.
+
+*CouchDB version >= 2.0*
+
+### `server.get(name, check=True)`
+
+Gets the named database. Returns an instance of class `Database`.
+
+Raises `NotFoundError` if `check` is `True` and the database does not exist.
+
+### `server.create(name, n=3, q=8, partitioned=False)`
+
+Creates the named database. Raises `CreationError` if it already exists.
+
+- `name`: The name of the database.
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `server.get_config(nodename="_local")`
+
+Gets the named node's configuration.
+
+### `server.get_active_tasks()`
+
+Returns a list of running tasks.
+
+### `server.get_cluster_setup(ensure_dbs_exists=None)`
+
+Returns the status of the node or cluster.
+
+`ensure_dbs_exists` is a list system databases to ensure exist on the
+node/cluster. Defaults to `["_users","_replicator"]`.
+
+*CouchDB version >= 2.0*
+
+### `server.set_cluster_setup(doc)`
+
+Configures a node as a single node, as part of a cluster, or finalise a
+cluster.
+
+See the CouchDB documentation for the contents of `doc`.
+
+*CouchDB version >= 2.0*
+
+### `server.get_membership()`
+
+Returns data about the nodes that are part of the cluster.
+
+*CouchDB version >= 2.0*
+
+### `server.set_replicate(doc)`
+
+Request, configure, or stop, a replication operation.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `server.get_scheduler_jobs(limit=None, skip=None)`
+
+Gets a list of replication jobs.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by replication ID.
+
+### `server.get_scheduler_docs(limit=None, skip=None)`
+
+Gets information about replication document states.
+
+- `limit`: How many results to return.
+- `skip`: How many result to skip starting at the beginning,
+ ordered by document ID.
+
+### `server.get_node_stats(nodename="_local")`
+
+Returns statistics for the running server.
+
+### `server.get_node_system(nodename="_local")`
+
+Returns various system-level statistics for the running server.
+
+## `class Database`
+```python
+db = Database(server, name, check=True)
+```
+
+An instance of the class is an interface to a CouchDB database.
+
+- `server`: An instance of Server.
+- `name`: The name of the database.
+- If `check` is `True`, then raise `NotFoundError` if the the database
+ does not exist.
+
+### `__str__`
+```python
+str(db)
+```
+Returns the name of the CouchDB database.
+
+### `__len__`
+```python
+len(db)
+```
+Returns the number of documents in the database.
+
+### `__contains__`
+```python
+if identifier in db: ...
+```
+Does a document with the given identifier exist in the database?
+
+### `__iter__`
+```python
+for doc in db: ...
+```
+Returns an iterator over all documents in the database.
+
+### `__getitem__`
+```python
+doc = db[id]
+```
+Returns the document with the given id.
+
+### `db.exists()`
+
+Does the database exist? Returns a boolean.
+
+### `db.check()`
+
+Raises `NotFoundError` if the database does not exist.
+
+### `db.create(n=3, q=8, partitioned=False)`
+
+Creates the database. Raises `CreationError` if it already exists.
+
+- `n`: The number of replicas.
+- `q`: The number of shards.
+- `partitioned`: Whether to create a partitioned database.
+
+### `db.destroy()`
+
+Deletes the database and all its contents.
+
+### `db.get_info()`
+
+Returns a dictionary with information about the database.
+
+### `db.get_security()`
+
+Returns a dictionary with security information for the database.
+
+### `db.set_security(doc)`
+
+Sets the security information for the database.
+
+See the CouchDB documentation for the contents of `doc`.
+
+### `db.compact(finish=False, callback=None)`
+
+Compacts the CouchDB database by rewriting the disk database file
+and removing old revisions of documents.
+
+- If `finish` is `True`, then return only when compaction is done.
+- In addition, if defined, the function `callback(seconds)` is called
+ every second until compaction is done.
+
+### `db.compact_design(designname)`
+
+Compacts the view indexes associated with the named design document.
+
+### `db.view_cleanup()`
+
+Removes unnecessary view index files due to changed views in
+design documents of the database.
+
+### `db.get(id, default=None, rev=None, revs_info=False, conflicts=False)`
+
+Returns the document with the given identifier, or the `default` value
+if not found.
+
+- `rev`: Retrieves document of specified revision, if specified.
+- `revs_info`: Whether to include detailed information for all known
+ document revisions.
+- `conflicts`: Whether to include information about conflicts in
+ the document in the `_conflicts` attribute.
+
+### `db.get_bulk(ids)`
+
+Gets several documents in one operation, given a list of document identifiers,
+each of which is a string (the document `_id`), or a tuple of the
+document `(_id, _rev)`.
+
+Returns a list of documents. If no document is found for a specified
+`_id` or `(_id, _rev`), `None` is returned in that slot of the list.
+
+### `db.ids()`
+```python
+for identifier in db.ids(): ...
+```
+
+Returns an iterator over all document identifiers.
+
+### `db.put(doc)`
+
+Inserts or updates the document.
+
+If the document is already in the database, the `_rev` item must
+be present in the document; its value will be updated.
+
+If the document does not contain an item `_id`, it is added
+having a UUID4 hex value. The `_rev` item will also be added.
+
+### `db.update(docs)`
+
+Performs a bulk update or insertion of the given documents using a
+single HTTP request.
+
+Returns an iterable (list) over the resulting documents.
+
+`docs` is a sequence of dictionaries or `Document` objects, or
+objects providing an `items()` method that can be used to convert
+them to a dictionary.
+
+The return value of this method is a list containing a tuple for every
+element in the `docs` sequence. Each tuple is of the form
+`(success, docid, rev_or_exc)`, where `success` is a boolean
+indicating whether the update succeeded, `docid` is the ID of the
+document, and `rev_or_exc` is either the new document revision, or
+an exception instance (e.g. `ResourceConflict`) if the update failed.
+
+If an object in the documents list is not a dictionary, this method
+looks for an `items()` method that can be used to convert the object
+to a dictionary.
+
+### `db.delete(doc)`
+
+Deletes the document, which must contain the `_id` and `_rev` items.
+
+### `db.purge(docs)`
+
+Performs purging (complete removal) of the given list of documents.
+
+Uses a single HTTP request to purge all given documents. Purged
+documents do not leave any meta-data in the storage and are not
+replicated.
+
+### `db.get_designs()`
+
+Returns the design documents for the database.
+
+**NOTE:** *CouchDB version >= 2.2*
+
+### `db.get_design(designname)`
+
+Gets the named design document.
+
+### `db.put_design(designname, doc, rebuild=True)`
+
+Inserts or updates the design document under the given name.
+
+If the existing design document is identical, no action is taken and
+`False` is returned, else the document is updated and `True` is returned.
+
+If `rebuild` is `True`, force view indexes to be rebuilt after update
+by accessing the view. This may take some time.
+
+Example of doc:
+```
+ {"views":
+ {"name":
+ {"map": "function (doc) {emit(doc.name, null);}"},
+ "name_sum":
+ {"map": "function (doc) {emit(doc.name, 1);}",
+ "reduce": "_sum"},
+ "name_count":
+ {"map": "function (doc) {emit(doc.name, null);}",
+ "reduce": "_count"}
+ }}
+```
+
+More info: http://docs.couchdb.org/en/latest/api/ddoc/common.html
+
+### `db.view(designname, viewname, **kwargs)`
+
+Query a view index to obtain data and/or documents.
+
+Keyword arguments (default value is `None` unless specified):
+
+- `key`: Return only rows that match the specified key.
+- `keys`: Return only rows where they key matches one of those specified as a list.
+- `startkey`: Return rows starting with the specified key.
+- `endkey`: Stop returning rows when the specified key is reached.
+- `skip`: Skip the number of rows before starting to return rows.
+- `limit`: Limit the number of rows returned.
+- `sorted=True`: Sort the rows by the key of each returned row. The items
+ `total_rows` and `offset` are not available if set to `False`.
+- `descending=False`: Return the rows in descending order.
+- `group=False`: Group the results using the reduce function of the design
+ document to a group or a single row. If set to `True` implies `reduce`
+ to `True` and defaults the `group_level` to the maximum.
+- `group_level`: Specify the group level to use. Implies `group` is `True`.
+- `reduce`: If set to `False` then do not use the reduce function if there is
+ one defined in the design document. Default is to use the reduce function
+ if defined.
+- `include_docs=False`: If `True`, include the document for each row. This
+ will force `reduce` to `False`.
+- `update="true"`: Whether ir not the view should be updated prior to
+ returning the result. Supported value are `"true"`, `"false"` and `"lazy"`.
+
+Returns an instance of [class ViewResult](#class-viewresultrows-offset-total_rows),
+containing the following attributes:
+
+- `rows`: The list of `Row` objects.
+- `offset`: The offset used for the set of rows.
+- `total_rows`: The total number of rows selected.
+
+A Row object contains the following attributes:
+
+- `id`: The identifier of the document, if any.
+- `key`: The key for the index row.
+- `value`: The value for the index row.
+- `doc`: The document, if any.
+
+### `db.get_indexes()`
+
+Returns a list of all Mango indexes in the database.
+
+*CouchDB version >= 2.0*
+
+### `db.put_index(fields, ddoc=None, name=None, selector=None)`
+
+Stores a Mango index specification.
+
+- `fields`: A list of fields to index.
+- `ddoc`: The design document name. Generated if none given.
+- `name`: The name of the index. Generated if none given.
+- `selector`: A partial filter selector, which may be omitted.
+
+Returns a dictionary with items `id` (design document name; sic!),
+`name` (index name) and `result` (`created` or `exists`).
+
+*CouchDB version >= 2.0*
+
+### `db.delete_index(designname, name)`
+
+Deletes the named index in the design document of the given name.
+
+*CouchDB version >= 2.0*
+
+### `db.find(selector, **kwargs)`
+```python
+data = db.find(selector, limit=25, skip=None, sort=None, fields=None,
+ use_index=None, bookmark=None, update=True, conflicts=False)
+```
+Selects documents according to the Mango index `selector`.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `use_index`: String or list of strings specifying the index(es) to use.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+- `update`: Whether to update the index prior to returning the result.
+- `conflicts`: Whether to include conflicted documents.
+
+Returns a dictionary with items `docs`, `warning`, `execution_stats`
+and `bookmark`.
+
+*CouchDB version >= 2.0*
+
+### `db.explain(selector, **kwargs)`
+```python
+data = db.explain(selector, use_index=None, limit=None, skip=None,
+ sort=None, fields=None, bookmark=None)
+```
+Returns info on which index is being used by the query.
+
+- `selector`: The Mango index. For more information on selector syntax,
+ see https://docs.couchdb.org/en/latest/api/database/find.html#find-selectors
+- `limit`: Maximum number of results returned.
+- `skip`: Skip the given number of results.
+- `sort`: A list of dictionaries specifying the order of the results,
+ where the field name is the key and the direction is the value;
+ either `"asc"` or `"desc"`.
+- `fields`: List specifying which fields of each result document should
+ be returned. If omitted, return the entire document.
+- `bookmark`: A string that marks the end the previous set of results.
+ If given, the next set of results will be returned.
+
+*CouchDB version >= 2.0*
+
+### `db.get_attachment(doc, filename)`
+
+Returns a file-like object containing the content of the specified attachment.
+
+### `db.put_attachment(doc, content, filename=None, content_type=None)`
+
+Adds or updates the given file as an attachment to the given document
+in the database.
+
+- `content` is a string or a file-like object.
+- If `filename` is not provided, then an attempt is made to get it from
+ the `content` object. If this fails, `ValueError` is raised.
+- If `content_type` is not provided, then an attempt to guess it from
+ the filename extension is made. If that does not work, it is
+ set to `"application/octet-stream"`
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.delete_attachment(doc, filename)`
+
+Deletes the attachment.
+
+Returns the new revision of the document, in addition to updating
+the `_rev` field in the document.
+
+### `db.dump(filepath, callback=None, exclude_designs=False, progressbar=False)`
+
+Dumps the entire database to a `tar` file.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files written out.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `exclude_designs` is True, design document will be excluded from the dump.
+
+If `progressbar` is True, display a progress bar.
+
+If the filepath ends with `.gz`, then the tar file is gzip compressed.
+The `_rev` item of each document is included in the dump.
+
+### `db.undump(filepath, callback=None, progressbar=False)`
+
+Loads the `tar` file given by the path. It must have been produced by `db.dump`.
+
+Returns a tuple `(ndocs, nfiles)` giving the number of documents
+and attached files read from the file.
+
+If defined, the function `callback(ndocs, nfiles)` is called
+every 100 documents.
+
+If `progressbar` is True, display a progress bar.
+
+**NOTE**: The documents are just added to the database, ignoring any
+`_rev` items. This means that no document with the same identifier
+may exist in the database.
+
+## `CouchDB2Exception`
+
+The Base CouchDB2 exception, from which all others derive.
+
+## `NotFoundError`
+
+No such entity (e.g. database or document) exists.
+
+## `BadRequestError`
+
+Invalid request; bad name, body or headers.
+
+## `CreationError`
+
+Could not create the entity; it exists already.
+
+## `RevisionError`
+
+Wrong or missing `_rev` item in the document to save.
+
+## `AuthorizationError`
+
+Current user not authorized to perform the operation.
+
+## `ContentTypeError`
+
+Bad `Content-Type` value in the request.
+
+## `ServerError`
+
+Internal CouchDB server error.
+
+## `class ViewResult(rows, offset, total_rows)`
+
+An instance of this class is returned as result from `db.view()`.
+Instances of this class are not supposed to be created by client software.
+
+Attributes:
+
+- `rows`: the list of `Row` objects.
+- `offset`: the offset used for the set of rows.
+- `total_rows`: the total number of rows selected.
+
+### `__len__`
+```python
+len(viewresult)
+```
+Return the number of rows in the view result.
+
+### `__iter__`
+```python
+for row in viewresult: ...
+```
+Return an iterator over all rows in the view result.
+
+### `__getitem__`
+```python
+row = viewresult[i]
+```
+Return the indexed view result row.
+
+### `vr.json()`
+
+Return the view result data in a JSON-like representation.
+
+## `class Row(id, key, value, doc)`
+
+Named-tuple object returned in ViewResult list attribute `rows`.
+
+Attributes:
+
+- `id`: the identifier of the document, if any. Alias for `row[0]`.
+- `key`: the key for the index row. Alias for `row[1]`.
+- `value`: the value for the index row. Alias for `row[2]`.
+- `doc`: the document, if any. Alias for `row[3]`.
+
+## Utility functions at the module level
+
+### `read_settings(filepath, settings=None)`
+
+Read the settings lookup from a JSON format file.
+
+If `settings` is given, then return an updated copy of it,
+else copy the default settings, update, and return it.
+
+## Command line tool
+
+The module is also a command line tool for interacting with the CouchDB server.
+It is installed if `pip` is used to install this module.
+
+Settings for the command line tool are updated from the following sources,
+each in the order given and if it exists:
+
+1) Default values are
+ ```
+ {
+ "SERVER": "http://localhost:5984",
+ "DATABASE": null,
+ "USERNAME": null,
+ "PASSWORD": null
+ }
+ ```
+2) Read from the JSON file `~/.couchdb2` (in your home directory).
+3) Read from the JSON file `settings.json` (in the current working directory).
+4) Read from the JSON file given by command line option `--settings FILEPATH`.
+5) From environment variables.
+6) From command line arguments.
+
+### Options
+
+To show available command options:
+
+```
+$ couchdb2 -h
+usage: couchdb2 [options]
+
+CouchDB v2.x command line tool, leveraging Python module CouchDB2.
+
+optional arguments:
+ -h, --help show this help message and exit
+ --settings FILEPATH Settings file in JSON format.
+ -S SERVER, --server SERVER
+ CouchDB server URL, including port number.
+ -d DATABASE, --database DATABASE
+ Database to operate on.
+ -u USERNAME, --username USERNAME
+ CouchDB user account name.
+ -p PASSWORD, --password PASSWORD
+ CouchDB user account password.
+ -q, --password_question
+ Ask for the password by interactive input.
+ --ca_file FILE_OR_DIRPATH
+ File or directory containing CAs.
+ -o FILEPATH, --output FILEPATH
+ Write output to the given file (JSON format).
+ --indent INT Indentation level for JSON format output file.
+ -y, --yes Do not ask for confirmation (delete, destroy, undump).
+ -v, --verbose Print more information.
+ -s, --silent Print no information.
+
+server operations:
+ -V, --version Output CouchDB server version.
+ --list Output a list of the databases on the server.
+
+Database operations.:
+ --create Create the database.
+ --destroy Delete the database and all its contents.
+ --compact Compact the database; may take some time.
+ --compact_design DDOC
+ Compact the view indexes for the named design doc.
+ --view_cleanup Remove view index files no longer required.
+ --info Output information about the database.
+ --security Output security information for the database.
+ --set_security FILEPATH
+ Set security information for the database from the
+ JSON file.
+ --list_designs List design documents for the database.
+ --design DDOC Output the named design document.
+ --put_design DDOC FILEPATH
+ Store the named design document from the file.
+ --delete_design DDOC Delete the named design document.
+ --dump FILEPATH Create a dump file of the database.
+ --undump FILEPATH Load a dump file into the database.
+
+Document operations.:
+ -G DOCID, --get DOCID
+ Output the document with the given identifier.
+ -P FILEPATH, --put FILEPATH
+ Store the document; arg is literal doc or filepath.
+ --delete DOCID Delete the document with the given identifier.
+
+attachments to document:
+ --attach DOCID FILEPATH
+ Attach the specified file to the given document.
+ --detach DOCID FILENAME
+ Remove the attached file from the given document.
+ --get_attach DOCID FILENAME
+ Get the attached file from the given document; write
+ to same filepath or that given by '-o'.
+
+query a design view, returning rows:
+ --view SPEC Design view '{design}/{view}' to query.
+ --key KEY Key value selecting view rows.
+ --startkey KEY Start key value selecting range of view rows.
+ --endkey KEY End key value selecting range of view rows.
+ --startkey_docid DOCID
+ Return rows starting with the specified document.
+ --endkey_docid DOCID Stop returning rows when specified document reached.
+ --group Group the results using the 'reduce' function.
+ --group_level INT Specify the group level to use.
+ --noreduce Do not use the 'reduce' function of the view.
+ --limit INT Limit the number of returned rows.
+ --skip INT Skip this number of rows before returning result.
+ --descending Sort rows in descending order (swap start/end keys!).
+ --include_docs Include documents in result.
+```
+
+
+
+
+%prep
+%autosetup -n CouchDB2-1.13.0
+
+%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-CouchDB2 -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Fri May 05 2023 Python_Bot <Python_Bot@openeuler.org> - 1.13.0-1
+- Package Spec generated