Robot Framework Integrated Development Environment (RIDE)
keyword.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 from itertools import chain
17 from operator import attrgetter
18 
19 from robotide.lib.robot.utils import setter
20 
21 from .itemlist import ItemList
22 from .message import Message, Messages
23 from .modelobject import ModelObject
24 from .tags import Tags
25 
26 
27 
33  __slots__ = ['_name', 'doc', 'args', 'assign', 'timeout', 'type',
34  '_sort_key', '_next_child_sort_key']
35  KEYWORD_TYPE = 'kw' #: Normal keyword :attr:`type`.
36  SETUP_TYPE = 'setup' #: Setup :attr:`type`.
37  TEARDOWN_TYPE = 'teardown' #: Teardown :attr:`type`.
38  FOR_LOOP_TYPE = 'for' #: For loop :attr:`type`.
39  FOR_ITEM_TYPE = 'foritem' #: Single for loop iteration :attr:`type`.
40  keyword_class = None #: Internal usage only.
41  message_class = Message #: Internal usage only.
42 
43  def __init__(self, name='', doc='', args=(), assign=(), tags=(),
44  timeout=None, type=KEYWORD_TYPE):
45  self.parentparentparent = None
46  self._name_name = name
47  self.docdoc = doc
48  self.argsargs = args #: Keyword arguments as a list of strings.
49  self.assignassign = assign #: Assigned variables as a list of strings.
50  self.tagstagstags = tags
51  self.timeouttimeout = timeout
52  #: Keyword type as a string. The value is either :attr:`KEYWORD_TYPE`,
53  #: :attr:`SETUP_TYPE`, :attr:`TEARDOWN_TYPE`, :attr:`FOR_LOOP_TYPE` or
54  #: :attr:`FOR_ITEM_TYPE` constant defined on the class level.
55  self.typetype = type
56  self.messagesmessagesmessages = None
57  self.keywordskeywordskeywords = None
58  self._sort_key_sort_key = -1
59  self._next_child_sort_key_next_child_sort_key = 0
60 
61  @property
62  name = property
63 
64  def name(self):
65  return self._name_name
66 
67  @name.setter
68 
69  def name(self, name):
70  self._name_name = name
71 
72  @setter
73 
74  def parent(self, parent):
75  if parent and parent is not self.parentparentparent:
76  self._sort_key_sort_key = getattr(parent, '_child_sort_key', -1)
77  return parent
78 
79  @property
80  _child_sort_key = property
81 
82  def _child_sort_key(self):
83  self._next_child_sort_key_next_child_sort_key += 1
84  return self._next_child_sort_key_next_child_sort_key
85 
86  @setter
87 
88  def tags(self, tags):
89  return Tags(tags)
90 
91  @setter
92 
93  def keywords(self, keywords):
94  return Keywords(self.keyword_classkeyword_class or self.__class__, self, keywords)
95 
96  @setter
97 
98  def messages(self, messages):
99  return Messages(self.message_classmessage_class, self, messages)
100 
101  @property
102 
103  children = property
104 
105  def children(self):
106  # It would be cleaner to store keywords/messages in same `children`
107  # list and turn `keywords` and `messages` to properties that pick items
108  # from it. That would require bigger changes to the model, though.
109  return sorted(chain(self.keywordskeywordskeywords, self.messagesmessagesmessages),
110  key=attrgetter('_sort_key'))
111 
112  @property
113 
118  id = property
119 
120  def id(self):
121  if not self.parentparentparent:
122  return 'k1'
123  return '%s-k%d' % (self.parentparentparent.id, self.parentparentparent.keywords.index(self)+1)
124 
125 
126  def visit(self, visitor):
127  visitor.visit_keyword(self)
128 
129 
130 
136  __slots__ = []
137 
138  def __init__(self, keyword_class=Keyword, parent=None, keywords=None):
139  ItemList.__init__(self, keyword_class, {'parent': parent}, keywords)
140 
141  @property
142 
146  setup = property
147 
148  def setup(self):
149  return self[0] if (self and self[0].type == 'setup') else None
150 
151  @setup.setter
152 
153  def setup(self, kw):
154  if kw is not None and kw.type != 'setup':
155  raise TypeError("Setup keyword type must be 'setup', "
156  "got '%s'." % kw.type)
157  if self.setupsetupsetupsetup is not None:
158  self.poppop(0)
159  if kw is not None:
160  self.insertinsert(0, kw)
161 
162  @property
163 
167  teardown = property
168 
169  def teardown(self):
170  return self[-1] if (self and self[-1].type == 'teardown') else None
171 
172  @teardown.setter
173 
174  def teardown(self, kw):
175  if kw is not None and kw.type != 'teardown':
176  raise TypeError("Teardown keyword type must be 'teardown', "
177  "got '%s'." % kw.type)
178  if self.teardownteardownteardownteardown is not None:
179  self.poppop()
180  if kw is not None:
181  self.appendappend(kw)
182 
183  @property
184 
185  all = property
186 
187  def all(self):
188  return self
189 
190  @property
191 
192  normal = property
193 
194  def normal(self):
195  kws = [kw for kw in self if kw.type not in ('setup', 'teardown')]
196  return Keywords(self._item_class_item_class, self._common_attrs_common_attrs['parent'], kws)
197 
198  def __setitem__(self, index, item):
199  old = self[index]
200  ItemList.__setitem__(self, index, item)
201  self[index]._sort_key = old._sort_key
Base model for a single keyword.
Definition: keyword.py:32
def keywords(self, keywords)
Child keywords as a :class:~.Keywords object.
Definition: keyword.py:93
def parent(self, parent)
Parent test suite, test case or keyword.
Definition: keyword.py:74
def tags(self, tags)
Keyword tags as a :class:~.model.tags.Tags object.
Definition: keyword.py:88
def visit(self, visitor)
:mod:Visitor interface <robot.model.visitor> entry-point.
Definition: keyword.py:126
id
Keyword id in format like s1-t3-k1.
Definition: keyword.py:118
def messages(self, messages)
Messages as a :class:~.model.message.Messages object.
Definition: keyword.py:98
children
Child :attr:keywords and :attr:messages in creation order.
Definition: keyword.py:103
def __init__(self, name='', doc='', args=(), assign=(), tags=(), timeout=None, type=KEYWORD_TYPE)
Definition: keyword.py:44
A list-like object representing keywords in a suite, a test or a keyword.
Definition: keyword.py:135
setup
Keyword used as the setup or None if no setup.
Definition: keyword.py:146
def __init__(self, keyword_class=Keyword, parent=None, keywords=None)
Definition: keyword.py:138
normal
Iterates over normal keywords, omitting setup and teardown.
Definition: keyword.py:192
def __setitem__(self, index, item)
Definition: keyword.py:198
all
Iterates over all keywords, including setup and teardown.
Definition: keyword.py:185
teardown
Keyword used as the teardown or None if no teardown.
Definition: keyword.py:167