Skip to content

Commit 8469c13

Browse files
committed
Fix get code in Ansible and Puppet. Fix long resource and improper alignment for Puppet
1 parent 9e20659 commit 8469c13

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

glitch/analysis/design.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,23 @@ def check(self, element, file: str):
2626
return []
2727

2828
class PuppetImproperAlignmentSmell(SmellChecker):
29+
cached_file = ""
30+
lines = []
31+
2932
def check(self, element, file: str) -> list[Error]:
33+
if DesignVisitor.PuppetImproperAlignmentSmell.cached_file != file:
34+
with open(file, "r") as f:
35+
DesignVisitor.PuppetImproperAlignmentSmell.lines = f.readlines()
36+
DesignVisitor.PuppetImproperAlignmentSmell.cached_file = file
37+
lines = DesignVisitor.PuppetImproperAlignmentSmell.lines
38+
3039
longest = 0
3140
longest_ident = 0
3241
longest_split = ""
3342
for a in element.attributes:
3443
if len(a.name) > longest and '=>' in a.code:
3544
longest = len(a.name)
36-
split = a.code.split('=>')[0]
45+
split = lines[a.line - 1].split('=>')[0]
3746
longest_ident = len(split)
3847
longest_split = split
3948
if longest_split == "": return []
@@ -42,7 +51,7 @@ def check(self, element, file: str) -> list[Error]:
4251
element, file, repr(element))]
4352

4453
for a in element.attributes:
45-
first_line = a.code.split("\n")[0]
54+
first_line = lines[a.line - 1]
4655
cur_arrow_column = len(first_line.split('=>')[0])
4756
if cur_arrow_column != longest_ident:
4857
return [Error('implementation_improper_alignment',
@@ -298,8 +307,9 @@ def check_atomicunit(self, au: AtomicUnit, file: str) -> list[Error]:
298307

299308
if au.type in DesignVisitor.__EXEC:
300309
lines = 0
301-
for line in au.code.split('\n'):
302-
if line.strip() != "": lines += 1
310+
for attr in au.attributes:
311+
for line in attr.code.split('\n'):
312+
if line.strip() != "": lines += 1
303313

304314
if lines > 7:
305315
errors.append(Error("design_long_resource", au, file, repr(au)))

glitch/parsers/cmof.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,34 @@ def yaml_comments(d):
7575

7676
return set(comments)
7777

78+
@staticmethod
79+
def __get_element_code(start_token, end_token, code):
80+
if isinstance(end_token, list) and len(end_token) > 0:
81+
end_token = end_token[-1]
82+
elif isinstance(end_token, list) or isinstance(end_token, str):
83+
end_token = start_token
84+
85+
if start_token.start_mark.line == end_token.end_mark.line:
86+
res = code[start_token.start_mark.line][start_token.start_mark.column : end_token.end_mark.column]
87+
else:
88+
res = code[start_token.start_mark.line]
89+
90+
for line in range(start_token.start_mark.line + 1, end_token.end_mark.line):
91+
res += code[line]
92+
93+
if start_token.start_mark.line != end_token.end_mark.line:
94+
res += code[end_token.end_mark.line][:end_token.end_mark.column]
95+
96+
return res
97+
7898
@staticmethod
7999
def __parse_vars(unit_block, cur_name, token, code):
80100
def create_variable(name, value):
81101
has_variable = ("{{" in value) and ("}}" in value)
82102
if (value in ["null", "~"]): value = ""
83103
v = Variable(name, value, has_variable)
84104
v.line = token.start_mark.line + 1
105+
v.code = AnsibleParser.__get_element_code(token, value, code)
85106
v.code = ''.join(code[token.start_mark.line : token.end_mark.line + 1])
86107
unit_block.add_variable(v)
87108

@@ -111,7 +132,7 @@ def create_attribute(token, name, value):
111132
if (value in ["null", "~"]): value = ""
112133
a = Attribute(name, value, has_variable)
113134
a.line = token.start_mark.line + 1
114-
a.code = ''.join(code[token.start_mark.line : token.end_mark.line + 1])
135+
a.code = AnsibleParser.__get_element_code(token, val, code)
115136
attributes.append(a)
116137

117138
attributes = []
@@ -966,7 +987,18 @@ def __process_unitblock_component(ce, unit_block: UnitBlock):
966987
@staticmethod
967988
def __process_codeelement(codeelement, path, code):
968989
def get_code(ce):
969-
return ''.join(code[ce.line - 1 : ce.end_line])
990+
if ce.line == ce.end_line:
991+
res = code[ce.line - 1][ce.col - 1 : ce.end_col - 1]
992+
else:
993+
res = code[ce.line - 1]
994+
995+
for line in range(ce.line, ce.end_line - 1):
996+
res += code[line]
997+
998+
if ce.line != ce.end_line:
999+
res += code[ce.end_line - 1][:ce.end_col - 1]
1000+
1001+
return res
9701002

9711003
if (isinstance(codeelement, puppetmodel.Value)):
9721004
if isinstance(codeelement, puppetmodel.Hash):

0 commit comments

Comments
 (0)