RULEAPI-596 Bring all the meta info into the language subfolder for new single-lang rules
This commit is contained in:
parent
688ea2889d
commit
97cd183fc2
@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"title": "FIXME",
|
||||||
|
"type": "CODE_SMELL",
|
||||||
|
"status": "ready",
|
||||||
|
"remediation": {
|
||||||
|
"func": "Constant\/Issue",
|
||||||
|
"constantCost": "5min"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
],
|
||||||
|
"defaultSeverity": "Major",
|
||||||
|
"ruleSpecification": "RSPEC-${RSPEC_ID}",
|
||||||
|
"sqKey": "S${RSPEC_ID}",
|
||||||
|
"scope": "All",
|
||||||
|
"qualityProfiles": ["Sonar way"]
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
FIXME: add a description
|
||||||
|
|
||||||
|
// If you want to factorize the description uncomment the following line and create the file.
|
||||||
|
//include::../description.adoc[]
|
||||||
|
|
||||||
|
== Noncompliant Code Example
|
||||||
|
|
||||||
|
----
|
||||||
|
FIXME
|
||||||
|
----
|
||||||
|
|
||||||
|
== Compliant Solution
|
||||||
|
|
||||||
|
----
|
||||||
|
FIXME
|
||||||
|
----
|
||||||
|
|
||||||
|
== See
|
||||||
|
|
||||||
|
FIXME: A list of links
|
@ -70,27 +70,47 @@ class RuleCreator:
|
|||||||
repo_dir = Path(self.repository.working_dir)
|
repo_dir = Path(self.repository.working_dir)
|
||||||
rule_dir = repo_dir.joinpath('rules', f'S{rule_number}')
|
rule_dir = repo_dir.joinpath('rules', f'S{rule_number}')
|
||||||
rule_dir.mkdir()
|
rule_dir.mkdir()
|
||||||
common_template = self.TEMPLATE_PATH.joinpath('common')
|
lang_count = sum(1 for l in languages)
|
||||||
lang_specific_template = self.TEMPLATE_PATH.joinpath('language_specific')
|
if lang_count > 1:
|
||||||
copy_directory_content(common_template, rule_dir)
|
self._fill_multi_lang_template_files(rule_dir, rule_number, languages)
|
||||||
|
else:
|
||||||
|
self._fill_single_lang_template_files(rule_dir, rule_number, next(iter(languages)))
|
||||||
|
|
||||||
for lang in languages:
|
|
||||||
lang_dir = rule_dir.joinpath(lang)
|
|
||||||
lang_dir.mkdir()
|
|
||||||
copy_directory_content(lang_specific_template, lang_dir)
|
|
||||||
|
|
||||||
for rule_item in rule_dir.glob('**/*'):
|
|
||||||
if rule_item.is_file():
|
|
||||||
template_content = rule_item.read_text()
|
|
||||||
final_content = template_content.replace('${RSPEC_ID}', str(rule_number))
|
|
||||||
rule_item.write_text(final_content)
|
|
||||||
self.repository.git.add('--all')
|
self.repository.git.add('--all')
|
||||||
self.repository.index.commit(f'Create rule S{rule_number}')
|
self.repository.index.commit(f'Create rule S{rule_number}')
|
||||||
|
|
||||||
self.repository.git.push('origin', branch_name)
|
self.repository.git.push('origin', branch_name)
|
||||||
|
|
||||||
return branch_name
|
return branch_name
|
||||||
|
|
||||||
|
def _fill_in_the_blanks_in_the_template(self, rule_dir: Path, rule_number: int):
|
||||||
|
for rule_item in rule_dir.glob('**/*'):
|
||||||
|
if rule_item.is_file():
|
||||||
|
template_content = rule_item.read_text()
|
||||||
|
final_content = template_content.replace('${RSPEC_ID}', str(rule_number))
|
||||||
|
rule_item.write_text(final_content)
|
||||||
|
|
||||||
|
def _fill_multi_lang_template_files(self, rule_dir: Path, rule_number: int, languages: Iterable[str]):
|
||||||
|
common_template = self.TEMPLATE_PATH.joinpath('multi_language', 'common')
|
||||||
|
lang_specific_template = self.TEMPLATE_PATH.joinpath('multi_language', 'language_specific')
|
||||||
|
copy_directory_content(common_template, rule_dir)
|
||||||
|
|
||||||
|
for lang in languages:
|
||||||
|
lang_dir = rule_dir.joinpath(lang)
|
||||||
|
lang_dir.mkdir()
|
||||||
|
copy_directory_content(lang_specific_template, lang_dir)
|
||||||
|
|
||||||
|
self._fill_in_the_blanks_in_the_template(rule_dir, rule_number)
|
||||||
|
|
||||||
|
def _fill_single_lang_template_files(self, rule_dir: Path, rule_number: int, language: str):
|
||||||
|
common_template = self.TEMPLATE_PATH.joinpath('single_language', 'common')
|
||||||
|
lang_specific_template = self.TEMPLATE_PATH.joinpath('single_language', 'language_specific')
|
||||||
|
copy_directory_content(common_template, rule_dir)
|
||||||
|
|
||||||
|
lang_dir = rule_dir.joinpath(language)
|
||||||
|
lang_dir.mkdir()
|
||||||
|
copy_directory_content(lang_specific_template, lang_dir)
|
||||||
|
|
||||||
|
self._fill_in_the_blanks_in_the_template(rule_dir, rule_number)
|
||||||
|
|
||||||
def create_new_rule_pull_request(self, token: str, rule_number: int, languages: Iterable[str], *, user: Optional[str]) -> PullRequest:
|
def create_new_rule_pull_request(self, token: str, rule_number: int, languages: Iterable[str], *, user: Optional[str]) -> PullRequest:
|
||||||
branch_name = self.create_new_rule_branch(rule_number, languages)
|
branch_name = self.create_new_rule_branch(rule_number, languages)
|
||||||
click.echo(f'Created rule Branch {branch_name}')
|
click.echo(f'Created rule Branch {branch_name}')
|
||||||
@ -126,4 +146,4 @@ class RuleCreator:
|
|||||||
self.repository.git.checkout('-B', new_branch)
|
self.repository.git.checkout('-B', new_branch)
|
||||||
yield
|
yield
|
||||||
finally:
|
finally:
|
||||||
self.repository.git.checkout(past_branch)
|
self.repository.git.checkout(past_branch)
|
||||||
|
@ -77,8 +77,8 @@ def read_counter_file(repo):
|
|||||||
return counter_path.read_text()
|
return counter_path.read_text()
|
||||||
|
|
||||||
|
|
||||||
def test_create_new_rule_branch(rule_creator: RuleCreator, mock_rspec_repo: Repo):
|
def test_create_new_multi_lang_rule_branch(rule_creator: RuleCreator, mock_rspec_repo: Repo):
|
||||||
'''Test create_new_rule_branch.'''
|
'''Test create_new_rule_branch for a multi-language rule.'''
|
||||||
rule_number = rule_creator.reserve_rule_number()
|
rule_number = rule_creator.reserve_rule_number()
|
||||||
|
|
||||||
languages = ['java', 'javascript']
|
languages = ['java', 'javascript']
|
||||||
@ -89,7 +89,7 @@ def test_create_new_rule_branch(rule_creator: RuleCreator, mock_rspec_repo: Repo
|
|||||||
rule_dir = Path(mock_rspec_repo.working_dir).joinpath('rules', f'S{rule_number}')
|
rule_dir = Path(mock_rspec_repo.working_dir).joinpath('rules', f'S{rule_number}')
|
||||||
assert rule_dir.exists()
|
assert rule_dir.exists()
|
||||||
|
|
||||||
common_root = rule_creator.TEMPLATE_PATH.joinpath('common')
|
common_root = rule_creator.TEMPLATE_PATH.joinpath('multi_language', 'common')
|
||||||
for common_item in common_root.glob('**/*'):
|
for common_item in common_root.glob('**/*'):
|
||||||
if common_item.is_file():
|
if common_item.is_file():
|
||||||
expected_content = common_item.read_text().replace('${RSPEC_ID}', str(rule_number))
|
expected_content = common_item.read_text().replace('${RSPEC_ID}', str(rule_number))
|
||||||
@ -97,7 +97,36 @@ def test_create_new_rule_branch(rule_creator: RuleCreator, mock_rspec_repo: Repo
|
|||||||
actual_content = rule_dir.joinpath(relative_path).read_text()
|
actual_content = rule_dir.joinpath(relative_path).read_text()
|
||||||
assert actual_content == expected_content
|
assert actual_content == expected_content
|
||||||
|
|
||||||
lang_root = rule_creator.TEMPLATE_PATH.joinpath('language_specific')
|
lang_root = rule_creator.TEMPLATE_PATH.joinpath('multi_language', 'language_specific')
|
||||||
|
for lang in languages:
|
||||||
|
for lang_item in lang_root.glob('**/*'):
|
||||||
|
if lang_item.is_file():
|
||||||
|
expected_content = lang_item.read_text().replace('${RSPEC_ID}', str(rule_number))
|
||||||
|
relative_path = lang_item.relative_to(lang_root)
|
||||||
|
actual_content = rule_dir.joinpath(lang, relative_path).read_text()
|
||||||
|
assert actual_content == expected_content
|
||||||
|
|
||||||
|
def test_create_new_single_lang_rule_branch(rule_creator: RuleCreator, mock_rspec_repo: Repo):
|
||||||
|
'''Test create_new_rule_branch for a single-language rule.'''
|
||||||
|
rule_number = rule_creator.reserve_rule_number()
|
||||||
|
|
||||||
|
languages = ['cfamily']
|
||||||
|
branch = rule_creator.create_new_rule_branch(rule_number, languages)
|
||||||
|
|
||||||
|
# Check that the branch was pushed successfully to the origin
|
||||||
|
mock_rspec_repo.git.checkout(branch)
|
||||||
|
rule_dir = Path(mock_rspec_repo.working_dir).joinpath('rules', f'S{rule_number}')
|
||||||
|
assert rule_dir.exists()
|
||||||
|
|
||||||
|
common_root = rule_creator.TEMPLATE_PATH.joinpath('single_language', 'common')
|
||||||
|
for common_item in common_root.glob('**/*'):
|
||||||
|
if common_item.is_file():
|
||||||
|
expected_content = common_item.read_text().replace('${RSPEC_ID}', str(rule_number))
|
||||||
|
relative_path = common_item.relative_to(common_root)
|
||||||
|
actual_content = rule_dir.joinpath(relative_path).read_text()
|
||||||
|
assert actual_content == expected_content
|
||||||
|
|
||||||
|
lang_root = rule_creator.TEMPLATE_PATH.joinpath('single_language', 'language_specific')
|
||||||
for lang in languages:
|
for lang in languages:
|
||||||
for lang_item in lang_root.glob('**/*'):
|
for lang_item in lang_root.glob('**/*'):
|
||||||
if lang_item.is_file():
|
if lang_item.is_file():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user