Robot Framework
misc.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 import re
17 
18 from .robottypes import is_integer
19 from .unic import safe_str
20 
21 
22 
40 def printable_name(string, code_style=False):
41  if code_style and '_' in string:
42  string = string.replace('_', ' ')
43  parts = string.split()
44  if code_style and len(parts) == 1 \
45  and not (string.isalpha() and string.islower()):
46  parts = _split_camel_case(parts[0])
47  return ' '.join(part[0].upper() + part[1:] for part in parts)
48 
49 
50 def _split_camel_case(string):
51  tokens = []
52  token = []
53  for prev, char, next in zip(' ' + string, string, string[1:] + ' '):
54  if _is_camel_case_boundary(prev, char, next):
55  if token:
56  tokens.append(''.join(token))
57  token = [char]
58  else:
59  token.append(char)
60  if token:
61  tokens.append(''.join(token))
62  return tokens
63 
64 
65 def _is_camel_case_boundary(prev, char, next):
66  if prev.isdigit():
67  return not char.isdigit()
68  if char.isupper():
69  return next.islower() or prev.isalpha() and not prev.isupper()
70  return char.isdigit()
71 
72 
73 def plural_or_not(item):
74  count = item if is_integer(item) else len(item)
75  return '' if count in (1, -1) else 's'
76 
77 
78 
79 def seq2str(sequence, quote="'", sep=', ', lastsep=' and '):
80  sequence = [f'{quote}{safe_str(item)}{quote}' for item in sequence]
81  if not sequence:
82  return ''
83  if len(sequence) == 1:
84  return sequence[0]
85  last_two = lastsep.join(sequence[-2:])
86  return sep.join(sequence[:-2] + [last_two])
87 
88 
89 
90 def seq2str2(sequence):
91  if not sequence:
92  return '[ ]'
93  return '[ %s ]' % ' | '.join(safe_str(item) for item in sequence)
94 
95 
96 
105 def test_or_task(text: str, rpa: bool):
106  def replace(test):
107  if not rpa:
108  return test
109  upper = [c.isupper() for c in test]
110  return ''.join(c.upper() if up else c for c, up in zip('task', upper))
111  if text.upper() == 'TEST':
112  return replace(text)
113  return re.sub('{(test)}', lambda m: replace(m.group(1)), text, flags=re.IGNORECASE)
114 
115 
116 def isatty(stream):
117  # first check if buffer was detached
118  if hasattr(stream, 'buffer') and stream.buffer is None:
119  return False
120  if not hasattr(stream, 'isatty'):
121  return False
122  try:
123  return stream.isatty()
124  except ValueError: # Occurs if file is closed.
125  return False
126 
127 
128 def parse_re_flags(flags=None):
129  result = 0
130  if not flags:
131  return result
132  for flag in flags.split('|'):
133  try:
134  re_flag = getattr(re, flag.upper().strip())
135  except AttributeError:
136  raise ValueError(f'Unknown regexp flag: {flag}')
137  else:
138  if isinstance(re_flag, re.RegexFlag):
139  result |= re_flag
140  else:
141  raise ValueError(f'Unknown regexp flag: {flag}')
142  return result
143 
144 
145 
152 
153  def __init__(self, fget, fset=None, fdel=None, doc=None):
154  if fset:
155  self.settersetter(fset)
156  if fdel:
157  self.deleterdeleter(fset)
158  super().__init__(fget)
159  if doc:
160  self.__doc____doc__ = doc
161 
162  def __get__(self, instance, owner):
163  return self.fget(owner)
164 
165  def setter(self, fset):
166  raise TypeError('Setters are not supported.')
167 
168  def deleter(self, fset):
169  raise TypeError('Deleters are not supported.')
Property that works with classes in addition to instances.
Definition: misc.py:151
def __init__(self, fget, fset=None, fdel=None, doc=None)
Definition: misc.py:153
def setter(self, fset)
Definition: misc.py:165
def deleter(self, fset)
Definition: misc.py:168
def __get__(self, instance, owner)
Definition: misc.py:162
def seq2str(sequence, quote="'", sep=', ', lastsep=' and ')
Returns sequence in format ‘'item 1’, 'item 2' and 'item 3'`.
Definition: misc.py:79
def printable_name(string, code_style=False)
Generates and returns printable name from the given string.
Definition: misc.py:40
def test_or_task(str text, bool rpa)
Replace 'test' with 'task' in the given text depending on rpa.
Definition: misc.py:105
def parse_re_flags(flags=None)
Definition: misc.py:128
def _split_camel_case(string)
Definition: misc.py:50
def plural_or_not(item)
Definition: misc.py:73
def seq2str2(sequence)
Returns sequence in format [ item 1 | item 2 | ...
Definition: misc.py:90
def _is_camel_case_boundary(prev, char, next)
Definition: misc.py:65
def isatty(stream)
Definition: misc.py:116
def safe_str(item)
Definition: unic.py:21