commit 670334b61dddec3b53ab5ea47d80149a81795e54 Author: Damian Johnson atagar@torproject.org Date: Sat Oct 27 10:08:44 2012 -0700
Line wrapping pydoc clauses
I had been avoiding line wraps in :var:, :param:, and :return: entries to avoid confusing the spinx compiler but on reflection it's output is uneffected when we indent the following line.
Just wrapping the lines that were really unweildy rather than going for a strict eighty character width. Sorry lines-of-code-must-be-shorter-than-my-iphone-screen zelots. --- stem/descriptor/__init__.py | 12 ++++-- stem/descriptor/export.py | 12 ++++-- stem/descriptor/extrainfo_descriptor.py | 22 +++++++--- stem/descriptor/networkstatus.py | 62 ++++++++++++++++++++---------- stem/descriptor/reader.py | 35 +++++++++++------ stem/descriptor/server_descriptor.py | 19 ++++++--- stem/exit_policy.py | 13 ++++-- stem/version.py | 3 +- 8 files changed, 119 insertions(+), 59 deletions(-)
diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py index a6aac75..edf4009 100644 --- a/stem/descriptor/__init__.py +++ b/stem/descriptor/__init__.py @@ -179,7 +179,8 @@ def _read_until_keywords(keywords, descriptor_file, inclusive = False, ignore_fi :param str,list keywords: keyword(s) we want to read until :param file descriptor_file: file with the descriptor content :param bool inclusive: includes the line with the keyword if True - :param bool ignore_first: doesn't check if the first line read has one of the given keywords + :param bool ignore_first: doesn't check if the first line read has one of the + given keywords :param bool skip: skips buffering content, returning None :param int end_position: end if we reach this point in the file
@@ -233,7 +234,8 @@ def _get_pseudo_pgp_block(remaining_contents):
:returns: **str** with the armor wrapped contents or None if it doesn't exist
- :raises: **ValueError** if the contents starts with a key block but it's malformed (for instance, if it lacks an ending line) + :raises: **ValueError** if the contents starts with a key block but it's + malformed (for instance, if it lacks an ending line) """
if not remaining_contents: @@ -273,8 +275,10 @@ def _get_descriptor_components(raw_contents, validate, extra_keywords = ()): else in server descriptors the order does not matter.
:param str raw_contents: descriptor content provided by the relay - :param bool validate: checks the validity of the descriptor's content if True, skips these checks otherwise - :param list extra_keywords: entity keywords to put into a separate listing with ordering intact + :param bool validate: checks the validity of the descriptor's content if + True, skips these checks otherwise + :param list extra_keywords: entity keywords to put into a separate listing + with ordering intact
:returns: **collections.OrderedDict** with the 'keyword => (value, pgp key) entries' diff --git a/stem/descriptor/export.py b/stem/descriptor/export.py index f000a6d..3b71455 100644 --- a/stem/descriptor/export.py +++ b/stem/descriptor/export.py @@ -24,10 +24,12 @@ def export_csv(descriptors, included_fields = (), excluded_fields = (), header = labelled with a header row. Either 'included_fields' or 'excluded_fields' can be used for more granular control over its attributes and the order.
- :param Descriptor,list descriptors: either a :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported + :param Descriptor,list descriptors: either a + :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported :param list included_fields: attributes to include in the csv :param list excluded_fields: attributes to exclude from the csv - :param bool header: if **True** then the first line will be a comma separated list of the attribute names + :param bool header: if **True** then the first line will be a comma separated + list of the attribute names
:returns: **str** of the CSV for the descriptors, one per line :raises: **ValueError** if descriptors contain more than one descriptor type @@ -43,10 +45,12 @@ def export_csv_file(output_file, descriptors, included_fields = (), excluded_fie written directly to a file.
:param file output_file: file to be written to - :param Descriptor,list descriptors: either a :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported + :param Descriptor,list descriptors: either a + :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported :param list included_fields: attributes to include in the csv :param list excluded_fields: attributes to exclude from the csv - :param bool header: if **True** then the first line will be a comma separated list of the attribute names + :param bool header: if **True** then the first line will be a comma separated + list of the attribute names
:returns: **str** of the CSV for the descriptors, one per line :raises: **ValueError** if descriptors contain more than one descriptor type diff --git a/stem/descriptor/extrainfo_descriptor.py b/stem/descriptor/extrainfo_descriptor.py index 4f5d562..026b59b 100644 --- a/stem/descriptor/extrainfo_descriptor.py +++ b/stem/descriptor/extrainfo_descriptor.py @@ -122,9 +122,11 @@ def parse_file(descriptor_file, validate = True): Iterates over the extra-info descriptors in a file.
:param file descriptor_file: file with descriptor content - :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise + :param bool validate: checks the validity of the descriptor's content if + **True**, skips these checks otherwise
- :returns: iterator for :class:`~stem.descriptor.extrainfo_descriptor.ExtraInfoDescriptor` instances in the file + :returns: iterator for :class:`~stem.descriptor.extrainfo_descriptor.ExtraInfoDescriptor` + instances in the file
:raises: * **ValueError** if the contents is malformed and validate is **True** @@ -149,7 +151,8 @@ def _parse_timestamp_and_interval(keyword, content): :param str keyword: line's keyword :param str content: line content to be parsed
- :returns: **tuple** of the form (timestamp (**datetime**), interval (**int**), remaining content (**str**)) + :returns: **tuple** of the form (timestamp (**datetime**), interval + (**int**), remaining content (**str**))
:raises: **ValueError** if the content is malformed """ @@ -180,7 +183,9 @@ class ExtraInfoDescriptor(stem.descriptor.Descriptor): :var str fingerprint: ***** identity key fingerprint :var datetime published: ***** time in GMT when this descriptor was made :var str geoip_db_digest: sha1 of geoIP database file - :var dict transport: ***** mapping of transport methods to their (address, port, args) tuple, these usually appeear on bridges in which case all of those are **None** + :var dict transport: ***** mapping of transport methods to their (address, + port, args) tuple, these usually appeear on bridges in which case all of + those are **None**
**Bi-directional connection usage:**
@@ -268,7 +273,8 @@ class ExtraInfoDescriptor(stem.descriptor.Descriptor): :var datetime geoip_start_time: replaced by bridge_stats_end (deprecated) :var dict geoip_client_origins: replaced by bridge_ips (deprecated)
- ***** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined + ***** attribute is either required when we're parsed with validation or has + a default value, others are left as **None** if undefined """
def __init__(self, raw_contents, validate = True): @@ -278,7 +284,8 @@ class ExtraInfoDescriptor(stem.descriptor.Descriptor): either improve performance or be accepting of malformed data.
:param str raw_contents: extra-info content provided by the relay - :param bool validate: checks the validity of the extra-info descriptor if **True**, skips these checks otherwise + :param bool validate: checks the validity of the extra-info descriptor if + **True**, skips these checks otherwise
:raises: **ValueError** if the contents is malformed and validate is True """ @@ -790,7 +797,8 @@ class RelayExtraInfoDescriptor(ExtraInfoDescriptor):
class BridgeExtraInfoDescriptor(ExtraInfoDescriptor): """ - Bridge extra-info descriptor (`bridge descriptor specification https://metrics.torproject.org/formats.html#bridgedesc`_) + Bridge extra-info descriptor (`bridge descriptor specification + https://metrics.torproject.org/formats.html#bridgedesc`_) """
def __init__(self, raw_contents, validate = True): diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py index 61319e3..d78a2c6 100644 --- a/stem/descriptor/networkstatus.py +++ b/stem/descriptor/networkstatus.py @@ -36,7 +36,7 @@ constructor. Router entries are assigned to its 'routers' attribute... for router in consensus.routers: print router.nickname
-* :func:`stem.descriptor.parse_file` +* :func:`stem.descriptor.networkstatus.parse_file`
Alternatively, the :func:`~stem.descriptor.networkstatus.parse_file` function provides an iterator for a document's routers. Those routers refer to a 'thin' @@ -172,14 +172,17 @@ def parse_file(document_file, validate = True, is_microdescriptor = False, docum allow for limited memory usage.
:param file document_file: file with network status document content - :param bool validate: checks the validity of the document's contents if **True**, skips these checks otherwise - :param bool is_microdescriptor: **True** if this is for a microdescriptor consensus, **False** otherwise + :param bool validate: checks the validity of the document's contents if + **True**, skips these checks otherwise + :param bool is_microdescriptor: **True** if this is for a microdescriptor + consensus, **False** otherwise :param int document_version: network status document version
:returns: :class:`stem.descriptor.networkstatus.NetworkStatusDocument` object
:raises: - * **ValueError** if the document_version is unrecognized or the contents is malformed and validate is **True** + * **ValueError** if the document_version is unrecognized or the contents is + malformed and validate is **True** * **IOError** if the file can't be read """
@@ -237,7 +240,8 @@ class NetworkStatusDocumentV2(NetworkStatusDocument): Version 2 network status document. These have been deprecated and are no longer generated by Tor.
- :var tuple routers: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV2` contained in the document + :var tuple routers: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV2` + contained in the document
:var int version: ***** document version
@@ -256,7 +260,8 @@ class NetworkStatusDocumentV2(NetworkStatusDocument): :var str signing_authority: ***** name of the authority signing the document :var str signature: ***** authority's signature for the document
- ***** attribute is either required when we're parsed with validation or has a default value, others are left as None if undefined + ***** attribute is either required when we're parsed with validation or has + a default value, others are left as **None** if undefined """
def __init__(self, raw_content, validate = True): @@ -396,24 +401,30 @@ class NetworkStatusDocumentV3(NetworkStatusDocument): """ Version 3 network status document. This could be either a vote or consensus.
- :var tuple routers: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` contained in the document + :var tuple routers: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` + contained in the document
:var int version: ***** document version :var str version_flavor: ***** flavor associated with the document (such as 'microdesc') :var bool is_consensus: ***** **True** if the document is a consensus :var bool is_vote: ***** **True** if the document is a vote - :var bool is_microdescriptor: ***** **True** if this is a microdescriptor flavored document, **False** otherwise + :var bool is_microdescriptor: ***** **True** if this is a microdescriptor + flavored document, **False** otherwise :var datetime valid_after: ***** time when the consensus became valid :var datetime fresh_until: ***** time when the next consensus should be produced :var datetime valid_until: ***** time when this consensus becomes obsolete - :var int vote_delay: ***** number of seconds allowed for collecting votes from all authorities - :var int dist_delay: ***** number of seconds allowed for collecting signatures from all authorities + :var int vote_delay: ***** number of seconds allowed for collecting votes + from all authorities + :var int dist_delay: ***** number of seconds allowed for collecting + signatures from all authorities :var list client_versions: list of recommended client tor versions :var list server_versions: list of recommended server tor versions :var list known_flags: ***** list of known router flags :var list params: ***** dict of parameter(**str**) => value(**int**) mappings - :var list directory_authorities: ***** list of :class:`~stem.descriptor.networkstatus.DirectoryAuthority` objects that have generated this document - :var list signatures: ***** :class:`~stem.descriptor.networkstatus.DocumentSignature` of the authorities that have signed the document + :var list directory_authorities: ***** list of :class:`~stem.descriptor.networkstatus.DirectoryAuthority` + objects that have generated this document + :var list signatures: ***** :class:`~stem.descriptor.networkstatus.DocumentSignature` + of the authorities that have signed the document
**Consensus Attributes:**
@@ -425,7 +436,8 @@ class NetworkStatusDocumentV3(NetworkStatusDocument): :var list consensus_methods: list of ints for the supported method versions :var datetime published: time when the document was published
- ***** attribute is either required when we're parsed with validation or has a default value, others are left as None if undefined + ***** attribute is either required when we're parsed with validation or has + a default value, others are left as None if undefined """
def __init__(self, raw_content, validate = True, default_params = True): @@ -434,7 +446,8 @@ class NetworkStatusDocumentV3(NetworkStatusDocument):
:param str raw_content: raw network status document data :param bool validate: **True** if the document is to be validated, **False** otherwise - :param bool default_params: includes defaults in our params dict, otherwise it just contains values from the document + :param bool default_params: includes defaults in our params dict, otherwise + it just contains values from the document
:raises: **ValueError** if the document is invalid """ @@ -782,7 +795,8 @@ def _check_for_missing_and_disallowed_fields(header, entries, fields):
:param _DocumentHeader header: document header :param dict entries: ordered keyword/value mappings of the header or footer - :param list fields: expected field attributes (either **HEADER_STATUS_DOCUMENT_FIELDS** or **FOOTER_STATUS_DOCUMENT_FIELDS**) + :param list fields: expected field attributes (either + **HEADER_STATUS_DOCUMENT_FIELDS** or **FOOTER_STATUS_DOCUMENT_FIELDS**)
:raises: **ValueError** if we're missing mandatory fields or have fiels we shouldn't """ @@ -812,7 +826,8 @@ def _check_for_misordered_fields(entries, expected): are ignored).
:param dict entries: ordered keyword/value mappings of the header or footer - :param list expected: ordered list of expected fields (either **HEADER_FIELDS** or **FOOTER_FIELDS**) + :param list expected: ordered list of expected fields (either + **HEADER_FIELDS** or **FOOTER_FIELDS**)
:raises: **ValueError** if entries aren't properly ordered """ @@ -888,7 +903,8 @@ class DirectoryAuthority(stem.descriptor.Descriptor): **Vote Attributes:**
:var str legacy_dir_key: fingerprint of and obsolete identity key - :var stem.descriptor.networkstatus.KeyCertificate key_certificate: ***** authority's key certificate + :var stem.descriptor.networkstatus.KeyCertificate key_certificate: ***** + authority's key certificate
***** mandatory attribute """ @@ -898,7 +914,8 @@ class DirectoryAuthority(stem.descriptor.Descriptor): Parse a directory authority entry in a v3 network status document.
:param str raw_content: raw directory authority entry information - :param bool validate: checks the validity of the content if True, skips these checks otherwise + :param bool validate: checks the validity of the content if True, skips + these checks otherwise :param bool is_vote: True if this is for a vote, False if it's for a consensus
:raises: ValueError if the descriptor data is invalid @@ -929,7 +946,8 @@ class DirectoryAuthority(stem.descriptor.Descriptor):
:param str content: descriptor content :param bool validate: checks validity if True - :param bool is_vote: **True** if this is for a vote, **False** if it's for a consensus + :param bool is_vote: **True** if this is for a vote, **False** if it's for + a consensus
:raises: **ValueError** if a validity check fails """ @@ -1067,7 +1085,8 @@ class KeyCertificate(stem.descriptor.Descriptor): :var datetime expires: ***** time after which this key becomes invalid :var str signing_key: ***** directory server's public signing key :var str crosscert: signature made using certificate's signing key - :var str certification: ***** signature of this key certificate signed with the identity key + :var str certification: ***** signature of this key certificate signed with + the identity key
***** mandatory attribute """ @@ -1213,7 +1232,8 @@ class DocumentSignature(object): """ Directory signature of a v3 network status document.
- :var str method: method used to make the signature, this only appears in microdescriptor consensuses + :var str method: method used to make the signature, this only appears in + microdescriptor consensuses :var str identity: fingerprint of the authority that made the signature :var str key_digest: digest of the signing key :var str signature: document signature diff --git a/stem/descriptor/reader.py b/stem/descriptor/reader.py index e3d29c5..de525d1 100644 --- a/stem/descriptor/reader.py +++ b/stem/descriptor/reader.py @@ -1,7 +1,8 @@ """ Utilities for reading descriptors from local directories and archives. This is -mostly done through the :class:`~stem.descriptor.reader.DescriptorReader` class, which is an iterator for the -descriptor data in a series of destinations. For example... +mostly done through the :class:`~stem.descriptor.reader.DescriptorReader` +class, which is an iterator for the descriptor data in a series of +destinations. For example...
::
@@ -99,7 +100,8 @@ class AlreadyRead(FileSkipped): Already read a file with this 'last modified' timestamp or later.
:param int last_modified: unix timestamp for when the file was last modified - :param int last_modified_when_read: unix timestamp for the modification time when we last read this file + :param int last_modified_when_read: unix timestamp for the modification time + when we last read this file """
def __init__(self, last_modified, last_modified_when_read): @@ -134,7 +136,8 @@ class ReadFailed(FileSkipped): """ An IOError occured while trying to read the file.
- :param IOError exception: issue that arose when reading the file, **None** if this arose due to the file not being present + :param IOError exception: issue that arose when reading the file, **None** if + this arose due to the file not being present """
def __init__(self, read_exception): @@ -155,7 +158,8 @@ def load_processed_files(path):
:param str path: location to load the processed files dictionary from
- :returns: **dict** of 'path (str) => last modified unix timestamp (int)' mappings + :returns: **dict** of 'path (**str**) => last modified unix timestamp + (**int**)' mappings
:raises: * **IOError** if unable to read the file @@ -229,9 +233,12 @@ class DescriptorReader(object): :func:`~stem.descriptor.reader.save_processed_files` functions instead.
:param str,list target: path or list of paths for files or directories to be read from - :param bool follow_links: determines if we'll follow symlinks when traversing directories (requires python 2.6) - :param int buffer_size: descriptors we'll buffer before waiting for some to be read, this is unbounded if zero - :param str persistence_path: if set we will load and save processed file listings from this path, errors are ignored + :param bool follow_links: determines if we'll follow symlinks when traversing + directories (requires python 2.6) + :param int buffer_size: descriptors we'll buffer before waiting for some to + be read, this is unbounded if zero + :param str persistence_path: if set we will load and save processed file + listings from this path, errors are ignored """
def __init__(self, target, follow_links = False, buffer_size = 100, persistence_path = None): @@ -277,7 +284,8 @@ class DescriptorReader(object): method. Each run resets this to only the files that were present during that run.
- :returns: **dict** with the absolute paths and unix timestamp for the last modified times of the files we have processed + :returns: **dict** with the absolute paths and unix timestamp for the last + modified times of the files we have processed """
# make sure that we only provide back absolute paths @@ -289,7 +297,8 @@ class DescriptorReader(object): with a newly created :class:`~stem.descriptor.reader.DescriptorReader` to pre-populate the listing of descriptor files that we have seen.
- :param dict processed_files: mapping of absolute paths (**str**) to unix timestamps for the last modified time (**int**) + :param dict processed_files: mapping of absolute paths (**str**) to unix + timestamps for the last modified time (**int**) """
self._processed_files = dict(processed_files) @@ -303,7 +312,8 @@ class DescriptorReader(object):
my_listener(path, exception)
- :param functor listener: functor to be notified of files that are skipped to read errors or because they couldn't be parsed as valid descriptor data + :param functor listener: functor to be notified of files that are skipped + to read errors or because they couldn't be parsed as valid descriptor data """
self._skip_listeners.append(listener) @@ -313,7 +323,8 @@ class DescriptorReader(object): Provides the number of descriptors that are waiting to be iterated over. This is limited to the buffer_size that we were constructed with.
- :returns: **int** for the estimated number of currently enqueued descriptors, this is not entirely reliable + :returns: **int** for the estimated number of currently enqueued + descriptors, this is not entirely reliable """
return self._unreturned_descriptors.qsize() diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py index 4095a62..80df7bc 100644 --- a/stem/descriptor/server_descriptor.py +++ b/stem/descriptor/server_descriptor.py @@ -73,7 +73,8 @@ def parse_file(descriptor_file, validate = True): Iterates over the server descriptors in a file.
:param file descriptor_file: file with descriptor content - :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise + :param bool validate: checks the validity of the descriptor's content if + **True**, skips these checks otherwise
:returns: iterator for ServerDescriptor instances in the file
@@ -156,7 +157,9 @@ class ServerDescriptor(stem.descriptor.Descriptor): :var bool extra_info_cache: ***** flag if a mirror for extra-info documents :var str extra_info_digest: hex encoded digest of our extra-info document :var bool eventdns: flag for evdns backend (deprecated, always unset) - :var list address_alt: alternative for our address/or_port attributes, each entry is a tuple of the form (address (**str**), port (**int**), is_ipv6 (**bool**)) + :var list address_alt: alternative for our address/or_port attributes, each + entry is a tuple of the form (address (**str**), port (**int**), is_ipv6 + (**bool**))
Deprecated, moved to extra-info descriptor...
@@ -168,7 +171,8 @@ class ServerDescriptor(stem.descriptor.Descriptor): :var int write_history_interval: seconds per interval :var list write_history_values: bytes written during each interval
- ***** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined + ***** attribute is either required when we're parsed with validation or has + a default value, others are left as **None** if undefined """
def __init__(self, raw_contents, validate = True, annotations = None): @@ -182,7 +186,8 @@ class ServerDescriptor(stem.descriptor.Descriptor): malformed data.
:param str raw_contents: descriptor content provided by the relay - :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise + :param bool validate: checks the validity of the descriptor's content if + **True**, skips these checks otherwise :param list annotations: lines that appeared prior to the descriptor
:raises: **ValueError** if the contents is malformed and validate is True @@ -570,7 +575,8 @@ class ServerDescriptor(stem.descriptor.Descriptor):
class RelayDescriptor(ServerDescriptor): """ - Server descriptor (`descriptor specification https://gitweb.torproject.org/torspec.git/blob/HEAD:/dir-spec.txt`_) + Server descriptor (`descriptor specification + https://gitweb.torproject.org/torspec.git/blob/HEAD:/dir-spec.txt`_)
:var str onion_key: ***** key used to encrypt EXTEND cells :var str signing_key: ***** relay's long-term identity key @@ -718,7 +724,8 @@ class BridgeDescriptor(ServerDescriptor): """ Provides issues with our scrubbing.
- :returns: **list** of strings which describe issues we have with our scrubbing, this list is empty if we're properly scrubbed + :returns: **list** of strings which describe issues we have with our + scrubbing, this list is empty if we're properly scrubbed """
if self._scrubbing_issues == None: diff --git a/stem/exit_policy.py b/stem/exit_policy.py index 1c47bb5..00133d7 100644 --- a/stem/exit_policy.py +++ b/stem/exit_policy.py @@ -72,7 +72,8 @@ class ExitPolicy(object): is, in effect, just a list of :class:`~stem.exit_policy.ExitPolicyRule` entries.
- :param list rules: **str** or :class:`~stem.exit_policy.ExitPolicyRule` entries that make up this policy + :param list rules: **str** or :class:`~stem.exit_policy.ExitPolicyRule` + entries that make up this policy """
def __init__(self, *rules): @@ -98,7 +99,9 @@ class ExitPolicy(object):
Our default, and tor's, is **True**.
- :param bool is_allowed_default: :meth:`~stem.exit_policy.ExitPolicy.can_exit_to` default when no rules apply + :param bool is_allowed_default: + :meth:`~stem.exit_policy.ExitPolicy.can_exit_to` default when no rules + apply """
self._is_allowed_default = is_allowed_default @@ -255,7 +258,8 @@ class MicrodescriptorExitPolicy(ExitPolicy): wrong, in which case they'll have to try elsewhere.
:var set ports: ports that this policy includes - :var bool is_accept: **True** if these are ports that we accept, **False** if they're ports that we reject + :var bool is_accept: **True** if these are ports that we accept, **False** if + they're ports that we reject
:param str policy: policy string that describes this policy """ @@ -341,7 +345,8 @@ class ExitPolicyRule(object): :var AddressType address_type: type of address that we have :var str address: address that this rule is for :var str mask: subnet mask for the address (ex. "255.255.255.0") - :var int masked_bits: number of bits the subnet mask represents, **None** if the mask can't have a bit representation + :var int masked_bits: number of bits the subnet mask represents, **None** if + the mask can't have a bit representation
:var int min_port: lower end of the port range that we include (inclusive) :var int max_port: upper end of the port range that we include (inclusive) diff --git a/stem/version.py b/stem/version.py index 42f6c16..42ef062 100644 --- a/stem/version.py +++ b/stem/version.py @@ -93,7 +93,8 @@ class Version(object): :var int micro: micro version :var int patch: patch level (**None** if undefined) :var str status: status tag such as 'alpha' or 'beta-dev' (**None** if undefined) - :var str extra: extra information without its parentheses such as 'git-8be6058d8f31e578' (**None** if undefined) + :var str extra: extra information without its parentheses such as + 'git-8be6058d8f31e578' (**None** if undefined) :var str git_commit: git commit id (**None** if it wasn't provided)
:param str version_str: version to be parsed