manifest.py
Go to the documentation of this file.
1 from ros_introspection.package_xml import count_trailing_spaces, get_ordering_index
2 from util import get_ignore_data, roscompile, get_config
3 
4 
5 @roscompile
7  build_depends = package.get_build_dependencies()
8  run_depends = package.get_run_dependencies()
9  test_depends = package.get_test_dependencies()
10  package.manifest.add_packages(build_depends, run_depends, test_depends)
11 
12  if package.generators:
13  md = package.get_dependencies_from_msgs()
14  package.manifest.add_packages(md, md)
15 
16  if package.manifest.format == 1:
17  pairs = [('build_depend', 'message_generation'),
18  ('run_depend', 'message_runtime')]
19  else:
20  pairs = [('build_depend', 'message_generation'),
21  ('build_export_depend', 'message_runtime'),
22  ('exec_depend', 'message_runtime')]
23  package.manifest.remove_dependencies('depend', ['message_generation', 'message_runtime'])
24  for tag, msg_pkg in pairs:
25  existing = package.manifest.get_packages_by_tag(tag)
26  if msg_pkg not in existing:
27  package.manifest.insert_new_packages(tag, [msg_pkg])
28 
29 
30 @roscompile
32  run_depends = package.source_code.get_external_python_dependencies()
33  package.manifest.add_packages(set(), run_depends, prefer_depend_tag=False)
34 
35 
37  for child in node.childNodes:
38  if child.nodeType == child.ELEMENT_NODE:
39  return True
40  return False
41 
42 
43 @roscompile
45  exports = package.manifest.root.getElementsByTagName('export')
46  if len(exports) == 0:
47  return False
48  for export in exports:
49  if not has_element_child(export):
50  package.manifest.remove_element(export)
51  return True
52 
53 
54 def replace_package_set(manifest, source_tags, new_tag):
55  """
56  Find the set of packages that are defined in the manifest using all of the tags listed in source_tags.
57  Remove all those elements and replace them with the new_tag.
58  """
59  intersection = None
60  for tag in source_tags:
61  pkgs = set(manifest.get_packages_by_tag(tag))
62  if intersection is None:
63  intersection = pkgs
64  else:
65  intersection = intersection.intersection(pkgs)
66  for tag in source_tags:
67  manifest.remove_dependencies(tag, intersection)
68  manifest.insert_new_packages(new_tag, intersection)
69 
70 
71 @roscompile
72 def greedy_depend_tag(package):
73  if package.manifest.format == 1:
74  return
75  replace_package_set(package.manifest, ['build_depend', 'build_export_depend', 'exec_depend'], 'depend')
76 
77 
78 def enforce_tabbing_helper(manifest, node, tabs=1):
79  ideal_length = manifest.std_tab * tabs
80  prev_was_node = True
81  insert_before_list = []
82  if not node:
83  return
84  changed = False
85  for c in node.childNodes:
86  if c.nodeType == c.TEXT_NODE:
87  prev_was_node = False
88  if c == node.childNodes[-1]:
89  continue
90  spaces = count_trailing_spaces(c.data)
91  if spaces > ideal_length:
92  c.data = c.data[: ideal_length - spaces]
93  changed = True
94  elif spaces < ideal_length:
95  c.data = c.data + ' ' * (ideal_length - spaces)
96  changed = True
97  if '\n' not in c.data:
98  c.data = '\n' + c.data
99  changed = True
100  elif prev_was_node:
101  changed = True
102  insert_before_list.append(c)
103  else:
104  prev_was_node = True
105 
106  for c in insert_before_list:
107  node.insertBefore(manifest.get_tab_element(tabs), c)
108 
109  manifest.changed = manifest.changed or changed
110 
111  if len(node.childNodes) == 0:
112  return
113  last = node.childNodes[-1]
114  if last.nodeType != last.TEXT_NODE:
115  node.appendChild(manifest.get_tab_element(tabs - 1))
116  manifest.changed = True
117 
118 
119 @roscompile
121  enforce_tabbing_helper(package.manifest, package.manifest.root)
122 
123 
124 def get_sort_key(node, alphabetize_depends=True):
125  if node:
126  name = node.nodeName
127  else:
128  name = None
129 
130  index = get_ordering_index(name)
131 
132  if not alphabetize_depends:
133  return index
134  if name and 'depend' in name:
135  return index, node.firstChild.data
136  else:
137  return index, None
138 
139 
140 def get_chunks(children):
141  """ Given the children, group the elements into tuples that are
142  (an element node, [(some number of text nodes), that element node again])
143  """
144  chunks = []
145  current = []
146  for child_node in children:
147  current.append(child_node)
148  if child_node.nodeType == child_node.ELEMENT_NODE:
149  chunks.append((child_node, current))
150  current = []
151  if len(current) > 0:
152  chunks.append((None, current))
153  return chunks
154 
155 
156 @roscompile
157 def enforce_manifest_ordering(package, alphabetize=True):
158  root = package.manifest.root
159  chunks = get_chunks(root.childNodes)
160 
161  new_children = []
162 
163  for a, b in sorted(chunks, key=lambda d: get_sort_key(d[0], alphabetize)):
164  new_children += b
165 
166  if root.childNodes != new_children:
167  package.manifest.changed = True
168  root.childNodes = new_children
169 
170 
172  new_children = []
173  changed = False
174 
175  for child in node.childNodes:
176  if child.nodeType == child.TEXT_NODE and len(new_children) and new_children[-1].nodeType == child.TEXT_NODE:
177  changed = True
178  new_children[-1].data += child.data
179  elif child.nodeType == child.TEXT_NODE and child.data == '':
180  continue
181  else:
182  new_children.append(child)
183 
184  node.childNodes = new_children
185  return changed
186 
187 
188 def replace_text_node_contents(node, ignorables):
189  changed = False
190  removable = []
191  for i, c in enumerate(node.childNodes):
192  if c.nodeType == c.TEXT_NODE:
193  continue
194  elif c.nodeType == c.COMMENT_NODE:
195  short = c.data.strip()
196  if short in ignorables:
197  removable.append(i)
198  changed = True
199  continue
200  else:
201  changed = replace_text_node_contents(c, ignorables) or changed
202  for node_index in reversed(removable): # backwards not to affect earlier indices
203  if node_index > 0:
204  before = node.childNodes[node_index - 1]
205  if before.nodeType == c.TEXT_NODE:
206  trailing = count_trailing_spaces(before.data)
207  before.data = before.data[:-trailing]
208 
209  if node_index < len(node.childNodes) - 1:
210  after = node.childNodes[node_index + 1]
211  if after.nodeType == c.TEXT_NODE:
212  while len(after.data) and after.data[0] == ' ':
213  after.data = after.data[1:]
214  if len(after.data) and after.data[0] == '\n':
215  after.data = after.data[1:]
216 
217  node.childNodes.remove(node.childNodes[node_index])
218  changed = cleanup_text_elements(node) or changed
219  return changed
220 
221 
222 @roscompile
224  ignorables = get_ignore_data('package', {'package': package.name}, add_newline=False)
225  changed = replace_text_node_contents(package.manifest.root, ignorables)
226  if changed:
227  package.manifest.changed = changed
229 
230 
232  changed = False
233  for child in node.childNodes:
234  if child.nodeType == child.TEXT_NODE:
235  while '\n\n\n' in child.data:
236  child.data = child.data.replace('\n\n\n', '\n\n')
237  changed = True
238  else:
239  changed = remove_empty_lines_helper(child) or changed
240  return changed
241 
242 
243 @roscompile
245  if remove_empty_lines_helper(package.manifest.root):
246  package.manifest.changed = True
247 
248 
249 @roscompile
250 def update_people(package, config=None):
251  if config is None:
252  config = get_config()
253  for d in config.get('replace_rules', []):
254  package.manifest.update_people(d['to']['name'], d['to']['email'],
255  d['from'].get('name', None), d['from'].get('email', None))
256 
257 
258 @roscompile
259 def update_license(package, config=None):
260  if config is None:
261  config = get_config()
262  if 'default_license' not in config or package.manifest.get_license() != 'TODO':
263  return
264 
265  package.manifest.set_license(config['default_license'])
def update_people(package, config=None)
Definition: manifest.py:250
def enforce_manifest_tabbing(package)
Definition: manifest.py:120
def remove_empty_manifest_lines(package)
Definition: manifest.py:244
def get_ignore_data(name, variables=None, add_newline=True)
Definition: util.py:32
def replace_package_set(manifest, source_tags, new_tag)
Definition: manifest.py:54
def enforce_manifest_ordering(package, alphabetize=True)
Definition: manifest.py:157
def cleanup_text_elements(node)
Definition: manifest.py:171
def check_python_dependencies(package)
Definition: manifest.py:31
def update_license(package, config=None)
Definition: manifest.py:259
def get_chunks(children)
Definition: manifest.py:140
def replace_text_node_contents(node, ignorables)
Definition: manifest.py:188
def enforce_tabbing_helper(manifest, node, tabs=1)
Definition: manifest.py:78
def remove_boilerplate_manifest_comments(package)
Definition: manifest.py:223
def has_element_child(node)
Definition: manifest.py:36
def remove_empty_export_tag(package)
Definition: manifest.py:44
def greedy_depend_tag(package)
Definition: manifest.py:72
def check_manifest_dependencies(package)
Definition: manifest.py:6
def remove_empty_lines_helper(node)
Definition: manifest.py:231
def get_sort_key(node, alphabetize_depends=True)
Definition: manifest.py:124
def get_config()
Definition: util.py:46


roscompile
Author(s):
autogenerated on Wed Jun 19 2019 19:56:53