Skip to content

Commit

Permalink
Replace has_key with in operators
Browse files Browse the repository at this point in the history
  • Loading branch information
gholms authored and garnaat committed Mar 27, 2012
1 parent 061cc2f commit ca67a94
Show file tree
Hide file tree
Showing 24 changed files with 54 additions and 54 deletions.
6 changes: 3 additions & 3 deletions boto/auth.py
Expand Up @@ -127,7 +127,7 @@ def add_auth(self, http_request, **kwargs):
headers = http_request.headers headers = http_request.headers
method = http_request.method method = http_request.method
auth_path = http_request.auth_path auth_path = http_request.auth_path
if not headers.has_key('Date'): if 'Date' not in headers:
headers['Date'] = formatdate(usegmt=True) headers['Date'] = formatdate(usegmt=True)


if self._provider.security_token: if self._provider.security_token:
Expand Down Expand Up @@ -156,7 +156,7 @@ def __init__(self, host, config, provider):


def add_auth(self, http_request, **kwargs): def add_auth(self, http_request, **kwargs):
headers = http_request.headers headers = http_request.headers
if not headers.has_key('Date'): if 'Date' not in headers:
headers['Date'] = formatdate(usegmt=True) headers['Date'] = formatdate(usegmt=True)


b64_hmac = self.sign_string(headers['Date']) b64_hmac = self.sign_string(headers['Date'])
Expand All @@ -176,7 +176,7 @@ def __init__(self, host, config, provider):


def add_auth(self, http_request, **kwargs): def add_auth(self, http_request, **kwargs):
headers = http_request.headers headers = http_request.headers
if not headers.has_key('Date'): if 'Date' not in headers:
headers['Date'] = formatdate(usegmt=True) headers['Date'] = formatdate(usegmt=True)


b64_hmac = self.sign_string(headers['Date']) b64_hmac = self.sign_string(headers['Date'])
Expand Down
6 changes: 3 additions & 3 deletions boto/connection.py
Expand Up @@ -358,8 +358,8 @@ def authorize(self, connection, **kwargs):
self.headers['User-Agent'] = UserAgent self.headers['User-Agent'] = UserAgent
# I'm not sure if this is still needed, now that add_auth is # I'm not sure if this is still needed, now that add_auth is
# setting the content-length for POST requests. # setting the content-length for POST requests.
if not self.headers.has_key('Content-Length'): if 'Content-Length' not in self.headers:
if not self.headers.has_key('Transfer-Encoding') or \ if 'Transfer-Encoding' not in self.headers or \
self.headers['Transfer-Encoding'] != 'chunked': self.headers['Transfer-Encoding'] != 'chunked':
self.headers['Content-Length'] = str(len(self.body)) self.headers['Content-Length'] = str(len(self.body))


Expand Down Expand Up @@ -559,7 +559,7 @@ def handle_proxy(self, proxy, proxy_port, proxy_user, proxy_pass):
self.proxy_port = proxy_port self.proxy_port = proxy_port
self.proxy_user = proxy_user self.proxy_user = proxy_user
self.proxy_pass = proxy_pass self.proxy_pass = proxy_pass
if os.environ.has_key('http_proxy') and not self.proxy: if 'http_proxy' in os.environ and not self.proxy:
pattern = re.compile( pattern = re.compile(
'(?:http://)?' \ '(?:http://)?' \
'(?:(?P<user>\w+):(?P<pass>.*)@)?' \ '(?:(?P<user>\w+):(?P<pass>.*)@)?' \
Expand Down
6 changes: 3 additions & 3 deletions boto/ec2/image.py
Expand Up @@ -300,17 +300,17 @@ def endElement(self, name, value, connection):
if name == 'launchPermission': if name == 'launchPermission':
self.name = 'launch_permission' self.name = 'launch_permission'
elif name == 'group': elif name == 'group':
if self.attrs.has_key('groups'): if 'groups' in self.attrs:
self.attrs['groups'].append(value) self.attrs['groups'].append(value)
else: else:
self.attrs['groups'] = [value] self.attrs['groups'] = [value]
elif name == 'userId': elif name == 'userId':
if self.attrs.has_key('user_ids'): if 'user_ids' in self.attrs:
self.attrs['user_ids'].append(value) self.attrs['user_ids'].append(value)
else: else:
self.attrs['user_ids'] = [value] self.attrs['user_ids'] = [value]
elif name == 'productCode': elif name == 'productCode':
if self.attrs.has_key('product_codes'): if 'product_codes' in self.attrs:
self.attrs['product_codes'].append(value) self.attrs['product_codes'].append(value)
else: else:
self.attrs['product_codes'] = [value] self.attrs['product_codes'] = [value]
Expand Down
4 changes: 2 additions & 2 deletions boto/ec2/snapshot.py
Expand Up @@ -124,12 +124,12 @@ def endElement(self, name, value, connection):
if name == 'createVolumePermission': if name == 'createVolumePermission':
self.name = 'create_volume_permission' self.name = 'create_volume_permission'
elif name == 'group': elif name == 'group':
if self.attrs.has_key('groups'): if 'groups' in self.attrs:
self.attrs['groups'].append(value) self.attrs['groups'].append(value)
else: else:
self.attrs['groups'] = [value] self.attrs['groups'] = [value]
elif name == 'userId': elif name == 'userId':
if self.attrs.has_key('user_ids'): if 'user_ids' in self.attrs:
self.attrs['user_ids'].append(value) self.attrs['user_ids'].append(value)
else: else:
self.attrs['user_ids'] = [value] self.attrs['user_ids'] = [value]
Expand Down
4 changes: 2 additions & 2 deletions boto/fps/connection.py
Expand Up @@ -146,7 +146,7 @@ def make_marketplace_registration_url(self, returnURL, pipelineName,
params["signatureMethod"] = 'HmacSHA256' params["signatureMethod"] = 'HmacSHA256'
params["signatureVersion"] = '2' params["signatureVersion"] = '2'


if(not params.has_key('callerReference')): if('callerReference' not in params):
params['callerReference'] = str(uuid.uuid4()) params['callerReference'] = str(uuid.uuid4())


parts = '' parts = ''
Expand Down Expand Up @@ -191,7 +191,7 @@ def make_url(self, returnURL, paymentReason, pipelineName,
params["signatureMethod"] = 'HmacSHA256' params["signatureMethod"] = 'HmacSHA256'
params["signatureVersion"] = '2' params["signatureVersion"] = '2'


if(not params.has_key('callerReference')): if('callerReference' not in params):
params['callerReference'] = str(uuid.uuid4()) params['callerReference'] = str(uuid.uuid4())


parts = '' parts = ''
Expand Down
4 changes: 2 additions & 2 deletions boto/gs/acl.py
Expand Up @@ -189,7 +189,7 @@ def startElement(self, name, attrs, connection):
# __contains__() method works). At one time gsutil disallowed # __contains__() method works). At one time gsutil disallowed
# xmlplus-based parsers, until this more specific problem was # xmlplus-based parsers, until this more specific problem was
# determined. # determined.
if not attrs.has_key(TYPE): if TYPE not in attrs:
raise InvalidAclError('Missing "%s" in "%s" part of ACL' % raise InvalidAclError('Missing "%s" in "%s" part of ACL' %
(TYPE, SCOPE)) (TYPE, SCOPE))
self.scope = Scope(self, attrs[TYPE]) self.scope = Scope(self, attrs[TYPE])
Expand Down Expand Up @@ -238,7 +238,7 @@ def __init__(self, parent, type=None, id=None, name=None,
self.id = id self.id = id
self.domain = domain self.domain = domain
self.email_address = email_address self.email_address = email_address
if not self.ALLOWED_SCOPE_TYPE_SUB_ELEMS.has_key(self.type): if self.type not in self.ALLOWED_SCOPE_TYPE_SUB_ELEMS:
raise InvalidAclError('Invalid %s %s "%s" ' % raise InvalidAclError('Invalid %s %s "%s" ' %
(SCOPE, TYPE, self.type)) (SCOPE, TYPE, self.type))


Expand Down
4 changes: 2 additions & 2 deletions boto/provider.py
Expand Up @@ -176,14 +176,14 @@ def get_credentials(self, access_key=None, secret_key=None):
access_key_name, secret_key_name = self.CredentialMap[self.name] access_key_name, secret_key_name = self.CredentialMap[self.name]
if access_key is not None: if access_key is not None:
self.access_key = access_key self.access_key = access_key
elif os.environ.has_key(access_key_name.upper()): elif access_key_name.upper() in os.environ:
self.access_key = os.environ[access_key_name.upper()] self.access_key = os.environ[access_key_name.upper()]
elif config.has_option('Credentials', access_key_name): elif config.has_option('Credentials', access_key_name):
self.access_key = config.get('Credentials', access_key_name) self.access_key = config.get('Credentials', access_key_name)


if secret_key is not None: if secret_key is not None:
self.secret_key = secret_key self.secret_key = secret_key
elif os.environ.has_key(secret_key_name.upper()): elif secret_key_name.upper() in os.environ:
self.secret_key = os.environ[secret_key_name.upper()] self.secret_key = os.environ[secret_key_name.upper()]
elif config.has_option('Credentials', secret_key_name): elif config.has_option('Credentials', secret_key_name):
self.secret_key = config.get('Credentials', secret_key_name) self.secret_key = config.get('Credentials', secret_key_name)
Expand Down
2 changes: 1 addition & 1 deletion boto/route53/connection.py
Expand Up @@ -101,7 +101,7 @@ def get_all_hosted_zones(self, start_marker=None, zone_list=None):
h.parse(body) h.parse(body)
if zone_list: if zone_list:
e['ListHostedZonesResponse']['HostedZones'].extend(zone_list) e['ListHostedZonesResponse']['HostedZones'].extend(zone_list)
while e['ListHostedZonesResponse'].has_key('NextMarker'): while 'NextMarker' in e['ListHostedZonesResponse']:
next_marker = e['ListHostedZonesResponse']['NextMarker'] next_marker = e['ListHostedZonesResponse']['NextMarker']
zone_list = e['ListHostedZonesResponse']['HostedZones'] zone_list = e['ListHostedZonesResponse']['HostedZones']
e = self.get_all_hosted_zones(next_marker, zone_list) e = self.get_all_hosted_zones(next_marker, zone_list)
Expand Down
6 changes: 3 additions & 3 deletions boto/s3/key.py
Expand Up @@ -628,9 +628,9 @@ def sender(http_conn, method, path, data, headers):
headers['User-Agent'] = UserAgent headers['User-Agent'] = UserAgent
if self.storage_class != 'STANDARD': if self.storage_class != 'STANDARD':
headers[provider.storage_class_header] = self.storage_class headers[provider.storage_class_header] = self.storage_class
if headers.has_key('Content-Encoding'): if 'Content-Encoding' in headers:
self.content_encoding = headers['Content-Encoding'] self.content_encoding = headers['Content-Encoding']
if headers.has_key('Content-Type'): if 'Content-Type' in headers:
# Some use cases need to suppress sending of the Content-Type # Some use cases need to suppress sending of the Content-Type
# header and depend on the receiving server to set the content # header and depend on the receiving server to set the content
# type. This can be achieved by setting headers['Content-Type'] # type. This can be achieved by setting headers['Content-Type']
Expand Down Expand Up @@ -1167,7 +1167,7 @@ def get_file(self, fp, headers=None, cb=None, num_cb=10,
cb(data_len, cb_size) cb(data_len, cb_size)
if m: if m:
self.md5 = m.hexdigest() self.md5 = m.hexdigest()
if self.size is None and not torrent and not headers.has_key("Range"): if self.size is None and not torrent and "Range" not in headers:
self.size = data_len self.size = data_len
self.close() self.close()
self.bucket.connection.debug = save_debug self.bucket.connection.debug = save_debug
Expand Down
10 changes: 5 additions & 5 deletions boto/sdb/db/manager/sdbmanager.py
Expand Up @@ -471,9 +471,9 @@ def get_blob_bucket(self, bucket_name=None):
def load_object(self, obj): def load_object(self, obj):
if not obj._loaded: if not obj._loaded:
a = self.domain.get_attributes(obj.id,consistent_read=self.consistent) a = self.domain.get_attributes(obj.id,consistent_read=self.consistent)
if a.has_key('__type__'): if '__type__' in a:
for prop in obj.properties(hidden=False): for prop in obj.properties(hidden=False):
if a.has_key(prop.name): if prop.name in a:
value = self.decode_value(prop, a[prop.name]) value = self.decode_value(prop, a[prop.name])
value = prop.make_value_from_datastore(value) value = prop.make_value_from_datastore(value)
try: try:
Expand All @@ -486,13 +486,13 @@ def get_object(self, cls, id, a=None):
obj = None obj = None
if not a: if not a:
a = self.domain.get_attributes(id,consistent_read=self.consistent) a = self.domain.get_attributes(id,consistent_read=self.consistent)
if a.has_key('__type__'): if '__type__' in a:
if not cls or a['__type__'] != cls.__name__: if not cls or a['__type__'] != cls.__name__:
cls = find_class(a['__module__'], a['__type__']) cls = find_class(a['__module__'], a['__type__'])
if cls: if cls:
params = {} params = {}
for prop in cls.properties(hidden=False): for prop in cls.properties(hidden=False):
if a.has_key(prop.name): if prop.name in a:
value = self.decode_value(prop, a[prop.name]) value = self.decode_value(prop, a[prop.name])
value = prop.make_value_from_datastore(value) value = prop.make_value_from_datastore(value)
params[prop.name] = value params[prop.name] = value
Expand Down Expand Up @@ -716,7 +716,7 @@ def delete_key_value(self, obj, name):


def get_key_value(self, obj, name): def get_key_value(self, obj, name):
a = self.domain.get_attributes(obj.id, name,consistent_read=self.consistent) a = self.domain.get_attributes(obj.id, name,consistent_read=self.consistent)
if a.has_key(name): if name in a:
return a[name] return a[name]
else: else:
return None return None
Expand Down
2 changes: 1 addition & 1 deletion boto/sdb/db/manager/xmlmanager.py
Expand Up @@ -495,7 +495,7 @@ def delete_key_value(self, obj, name):


def get_key_value(self, obj, name): def get_key_value(self, obj, name):
a = self.domain.get_attributes(obj.id, name) a = self.domain.get_attributes(obj.id, name)
if a.has_key(name): if name in a:
return a[name] return a[name]
else: else:
return None return None
Expand Down
2 changes: 1 addition & 1 deletion boto/sdb/db/model.py
Expand Up @@ -154,7 +154,7 @@ def __init__(self, id=None, **kw):
setattr(self, prop.name, prop.default_value()) setattr(self, prop.name, prop.default_value())
except ValueError: except ValueError:
pass pass
if kw.has_key('manager'): if 'manager' in kw:
self._manager = kw['manager'] self._manager = kw['manager']
self.id = id self.id = id
for key in kw: for key in kw:
Expand Down
6 changes: 3 additions & 3 deletions boto/sdb/db/sequence.py
Expand Up @@ -180,11 +180,11 @@ def get(self):
"""Get the value""" """Get the value"""
val = self.db.get_attributes(self.id, consistent_read=True) val = self.db.get_attributes(self.id, consistent_read=True)
if val: if val:
if val.has_key('timestamp'): if 'timestamp' in val:
self.timestamp = val['timestamp'] self.timestamp = val['timestamp']
if val.has_key('current_value'): if 'current_value' in val:
self._value = self.item_type(val['current_value']) self._value = self.item_type(val['current_value'])
if val.has_key("last_value") and val['last_value'] != None: if val.get('last_value') is not None:
self.last_value = self.item_type(val['last_value']) self.last_value = self.item_type(val['last_value'])
return self._value return self._value


Expand Down
2 changes: 1 addition & 1 deletion boto/sdb/domain.py
Expand Up @@ -343,7 +343,7 @@ def endElement(self, name):
if self.value and self.attribute: if self.value and self.attribute:
value = self.value.strip() value = self.value.strip()
attr_name = self.attribute.strip() attr_name = self.attribute.strip()
if self.attrs.has_key(attr_name): if attr_name in self.attrs:
self.attrs[attr_name].append(value) self.attrs[attr_name].append(value)
else: else:
self.attrs[attr_name] = [value] self.attrs[attr_name] = [value]
Expand Down
2 changes: 1 addition & 1 deletion boto/sdb/item.py
Expand Up @@ -75,7 +75,7 @@ def endElement(self, name, value, connection):
else: else:
self.name = self.decode_value(value) self.name = self.decode_value(value)
elif name == 'Value': elif name == 'Value':
if self.has_key(self.last_key): if self.last_key in self:
if not isinstance(self[self.last_key], list): if not isinstance(self[self.last_key], list):
self[self.last_key] = [self[self.last_key]] self[self.last_key] = [self[self.last_key]]
value = self.decode_value(value) value = self.decode_value(value)
Expand Down
4 changes: 2 additions & 2 deletions boto/services/result.py
Expand Up @@ -76,7 +76,7 @@ def process_record(self, record, path, get_file=True):
self.log_message(record, path) self.log_message(record, path)
self.calculate_stats(record) self.calculate_stats(record)
outputs = record['OutputKey'].split(',') outputs = record['OutputKey'].split(',')
if record.has_key('OutputBucket'): if 'OutputBucket' in record:
bucket = boto.lookup('s3', record['OutputBucket']) bucket = boto.lookup('s3', record['OutputBucket'])
else: else:
bucket = boto.lookup('s3', record['Bucket']) bucket = boto.lookup('s3', record['Bucket'])
Expand All @@ -92,7 +92,7 @@ def process_record(self, record, path, get_file=True):
def get_results_from_queue(self, path, get_file=True, delete_msg=True): def get_results_from_queue(self, path, get_file=True, delete_msg=True):
m = self.queue.read() m = self.queue.read()
while m: while m:
if m.has_key('Batch') and m['Batch'] == self.batch: if 'Batch' in m and m['Batch'] == self.batch:
self.process_record(m, path, get_file) self.process_record(m, path, get_file)
if delete_msg: if delete_msg:
self.queue.delete_message(m) self.queue.delete_message(m)
Expand Down
4 changes: 2 additions & 2 deletions boto/services/service.py
Expand Up @@ -92,7 +92,7 @@ def put_file(self, bucket_name, file_path, key_name=None):
def save_results(self, results, input_message, output_message): def save_results(self, results, input_message, output_message):
output_keys = [] output_keys = []
for file, type in results: for file, type in results:
if input_message.has_key('OutputBucket'): if 'OutputBucket' in input_message:
output_bucket = input_message['OutputBucket'] output_bucket = input_message['OutputBucket']
else: else:
output_bucket = input_message['Bucket'] output_bucket = input_message['Bucket']
Expand All @@ -105,7 +105,7 @@ def save_results(self, results, input_message, output_message):
def write_message(self, message): def write_message(self, message):
message['Service-Write'] = get_ts() message['Service-Write'] = get_ts()
message['Server'] = self.name message['Server'] = self.name
if os.environ.has_key('HOSTNAME'): if 'HOSTNAME' in os.environ:
message['Host'] = os.environ['HOSTNAME'] message['Host'] = os.environ['HOSTNAME']
else: else:
message['Host'] = 'unknown' message['Host'] = 'unknown'
Expand Down
4 changes: 2 additions & 2 deletions boto/sqs/message.py
Expand Up @@ -198,7 +198,7 @@ def encode(self, value):
return s return s


def __getitem__(self, key): def __getitem__(self, key):
if self._body.has_key(key): if key in self._body:
return self._body[key] return self._body[key]
else: else:
raise KeyError(key) raise KeyError(key)
Expand All @@ -217,7 +217,7 @@ def items(self):
return self._body.items() return self._body.items()


def has_key(self, key): def has_key(self, key):
return self._body.has_key(key) return key in self._body


def update(self, d): def update(self, d):
self._body.update(d) self._body.update(d)
Expand Down
6 changes: 3 additions & 3 deletions boto/utils.py
Expand Up @@ -98,13 +98,13 @@ def canonical_string(method, path, headers, expires=None,
interesting_headers[lk] = headers[key].strip() interesting_headers[lk] = headers[key].strip()


# these keys get empty strings if they don't exist # these keys get empty strings if they don't exist
if not interesting_headers.has_key('content-type'): if 'content-type' not in interesting_headers:
interesting_headers['content-type'] = '' interesting_headers['content-type'] = ''
if not interesting_headers.has_key('content-md5'): if 'content-md5' not in interesting_headers:
interesting_headers['content-md5'] = '' interesting_headers['content-md5'] = ''


# just in case someone used this. it's not necessary in this lib. # just in case someone used this. it's not necessary in this lib.
if interesting_headers.has_key(provider.date_header): if provider.date_header in interesting_headers:
interesting_headers['date'] = '' interesting_headers['date'] = ''


# if you're using expires for query string auth, then it trumps date # if you're using expires for query string auth, then it trumps date
Expand Down
2 changes: 1 addition & 1 deletion boto/vpc/dhcpoptions.py
Expand Up @@ -38,7 +38,7 @@ class DhcpConfigSet(dict):


def startElement(self, name, attrs, connection): def startElement(self, name, attrs, connection):
if name == 'valueSet': if name == 'valueSet':
if not self.has_key(self._name): if self._name not in self:
self[self._name] = DhcpValueSet() self[self._name] = DhcpValueSet()
return self[self._name] return self[self._name]


Expand Down
4 changes: 2 additions & 2 deletions tests/dynamodb/test_layer2.py
Expand Up @@ -199,9 +199,9 @@ def test_layer2_basic(self):
item1_updated = table.get_item(item1_key, item1_range, item1_updated = table.get_item(item1_key, item1_range,
consistent_read=True) consistent_read=True)
assert item1_updated['Replies'] == item1_attrs['Replies'] + 2 assert item1_updated['Replies'] == item1_attrs['Replies'] + 2
self.assertFalse(item1_updated.has_key(removed_attr)) self.assertFalse(removed_attr in item1_updated)
self.assertTrue(removed_tag not in item1_updated['Tags']) self.assertTrue(removed_tag not in item1_updated['Tags'])
self.assertTrue(item1_updated.has_key('RepliesBy')) self.assertTrue('RepliesBy' in item1_updated)
self.assertTrue(item1_updated['RepliesBy'] == replies_by_set) self.assertTrue(item1_updated['RepliesBy'] == replies_by_set)


# Put a few more items into the table # Put a few more items into the table
Expand Down
4 changes: 2 additions & 2 deletions tests/ec2/test_connection.py
Expand Up @@ -48,14 +48,14 @@ def test_1_basic(self):
status = image.set_launch_permissions(group_names=['all']) status = image.set_launch_permissions(group_names=['all'])
assert status assert status
d = image.get_launch_permissions() d = image.get_launch_permissions()
assert d.has_key('groups') assert 'groups' in d
assert len(d['groups']) > 0 assert len(d['groups']) > 0
# now remove that permission # now remove that permission
status = image.remove_launch_permissions(group_names=['all']) status = image.remove_launch_permissions(group_names=['all'])
assert status assert status
time.sleep(10) time.sleep(10)
d = image.get_launch_permissions() d = image.get_launch_permissions()
assert not d.has_key('groups') assert 'groups' not in d


# create 2 new security groups # create 2 new security groups
group1_name = 'test-%d' % int(time.time()) group1_name = 'test-%d' % int(time.time())
Expand Down
2 changes: 1 addition & 1 deletion tests/s3/test_versioning.py
Expand Up @@ -46,7 +46,7 @@ def tearDown(self):
def test_1_versions(self): def test_1_versions(self):
# check versioning off # check versioning off
d = self.bucket.get_versioning_status() d = self.bucket.get_versioning_status()
self.assertFalse(d.has_key('Versioning')) self.assertFalse('Versioning' in d)


# enable versioning # enable versioning
self.bucket.configure_versioning(versioning=True) self.bucket.configure_versioning(versioning=True)
Expand Down
12 changes: 6 additions & 6 deletions tests/sqs/test_connection.py
Expand Up @@ -66,14 +66,14 @@ def test_1_basic(self):


# now try to get queue attributes # now try to get queue attributes
a = q.get_attributes() a = q.get_attributes()
assert a.has_key('ApproximateNumberOfMessages') assert 'ApproximateNumberOfMessages' in a
assert a.has_key('VisibilityTimeout') assert 'VisibilityTimeout' in a
a = q.get_attributes('ApproximateNumberOfMessages') a = q.get_attributes('ApproximateNumberOfMessages')
assert a.has_key('ApproximateNumberOfMessages') assert 'ApproximateNumberOfMessages' in a
assert not a.has_key('VisibilityTimeout') assert 'VisibilityTimeout' not in a
a = q.get_attributes('VisibilityTimeout') a = q.get_attributes('VisibilityTimeout')
assert not a.has_key('ApproximateNumberOfMessages') assert 'ApproximateNumberOfMessages' not in a
assert a.has_key('VisibilityTimeout') assert 'VisibilityTimeout' in a


# now change the visibility timeout # now change the visibility timeout
timeout = 45 timeout = 45
Expand Down

0 comments on commit ca67a94

Please sign in to comment.