Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

# Copyright (c) 2017 Ansible Project 

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 

 

# Make coding more python3-ish 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

import ast 

import yaml 

 

from ansible.parsing.metadata import extract_metadata 

from ansible.parsing.yaml.loader import AnsibleLoader 

 

try: 

from __main__ import display 

except ImportError: 

from ansible.utils.display import Display 

display = Display() 

 

 

def read_docstring(filename, verbose=True, ignore_errors=True): 

""" 

Search for assignment of the DOCUMENTATION and EXAMPLES variables in the given file. 

Parse DOCUMENTATION from YAML and return the YAML doc or None together with EXAMPLES, as plain text. 

""" 

 

data = { 

'doc': None, 

'plainexamples': None, 

'returndocs': None, 

'metadata': None 

} 

 

string_to_vars = { 

'DOCUMENTATION': 'doc', 

'EXAMPLES': 'plainexamples', 

'RETURN': 'returndocs', 

} 

 

try: 

b_module_data = open(filename, 'rb').read() 

M = ast.parse(b_module_data) 

 

for child in M.body: 

if isinstance(child, ast.Assign): 

for t in child.targets: 

try: 

theid = t.id 

except AttributeError: 

# skip errors can happen when trying to use the normal code 

display.warning("Failed to assign id for %s on %s, skipping" % (t, filename)) 

continue 

 

if theid in string_to_vars: 

varkey = string_to_vars[theid] 

56 ↛ 57line 56 didn't jump to line 57, because the condition on line 56 was never true if isinstance(child.value, ast.Dict): 

data[varkey] = ast.literal_eval(child.value) 

else: 

if theid == 'DOCUMENTATION': 

# string should be yaml 

data[varkey] = AnsibleLoader(child.value.s, file_name=filename).get_single_data() 

else: 

# not yaml, should be a simple string 

data[varkey] = child.value.s 

display.debug('assigned :%s' % varkey) 

 

# Metadata is per-file and a dict rather than per-plugin/function and yaml 

data['metadata'] = extract_metadata(module_ast=M)[0] 

 

# remove version 

71 ↛ 72line 71 didn't jump to line 72, because the condition on line 71 was never true if data['metadata']: 

for x in ('version', 'metadata_version'): 

if x in data['metadata']: 

del data['metadata'][x] 

except: 

if verbose: 

display.error("unable to parse %s" % filename) 

if not ignore_errors: 

raise 

 

return data