first source commit

This commit is contained in:
cclecle
2023-03-21 01:08:47 +00:00
parent cba7e0ebf6
commit 0fe9f4fb96
7 changed files with 215 additions and 77 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<projectDescription> <projectDescription>
<name>{{project_name}}</name> <name>pychangelogfactory</name>
<comment></comment> <comment></comment>
<projects> <projects>
</projects> </projects>

View File

@@ -1,2 +1,3 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
encoding//src/pychangelogfactory/changelogfactory.py=utf-8
encoding/<project>=UTF-8 encoding/<project>=UTF-8

View File

@@ -19,4 +19,4 @@ except PackageNotFoundError: # pragma: no cover
warnings.warn("can not read __version__, assuming local test context, setting it to ?.?.?") warnings.warn("can not read __version__, assuming local test context, setting it to ?.?.?")
__version__ = "?.?.?" __version__ = "?.?.?"
from .test_module import test_function from pychangelogfactory.changelogfactory import ChangeLogFormater

View File

@@ -0,0 +1,144 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pychangelogfactory (c) by chacha
#
# pychangelogfactory is licensed under a
# Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Unported License.
#
# You should have received a copy of the license along with this
# work. If not, see <https://creativecommons.org/licenses/by-nc-sa/4.0/>.
"""Phasellus tellus lectus, volutpat eu dapibus ut, suscipit vel augue.
"""
from __future__ import annotations
import re
from abc import ABC
def ChangeLogFormaterRecordType(Klass:type) -> type:
ChangeLogFormater.ar_Klass.append(Klass)
return Klass
class ChangeLogFormater(ABC):
ar_Klass:list[ChangeLogFormater] = []
ar_LinesResult:list[ChangeLogFormater] = []
prefix:str = ''
title:str = 'Others :'
keywords:list[str] = []
priority:int = 0
def __init__(self,scope:str | None, ChangelogString:str):
self._scope = scope
self._ChangelogString = ChangelogString.strip()
def RenderLine(self):
return self._ChangelogString.strip()
@classmethod
def RenderLines(cls) -> str:
changelog_category: str = ""
lines = cls.GetLines()
if len(lines)>0:
changelog_category = f"#### {cls.title}\n"
for line in lines:
changelog_category = changelog_category + f"> {line.RenderLine()}"
if (scope:=line.GetScope()) != "":
changelog_category = changelog_category + f"\t*[{scope}]*"
changelog_category = changelog_category + "\n"
return changelog_category
def GetScope(self) -> str:
return self._scope if self._scope != None else ""
@classmethod
def Clear(cls) -> None:
ChangeLogFormater.ar_LinesResult=[]
@classmethod
def _CheckLine(cls,content:str) -> bool:
regex=re.compile(f"^(?:-\s+)?(?:{cls.prefix})(?:\((.*)\))?(?::)(?:\s*)([^\s].+)")
return regex.match(content)
@classmethod
def _CheckLine_keywords(cls,content:str) -> bool:
keyword_list = (cls.keywords + list((cls.prefix,)))
for _keyword in keyword_list:
if ( _keyword != "") and re.search(_keyword,content):
return True
return False
@classmethod
def FactoryProcessLine(cls,RawChangelogLine:str) -> ChangeLogFormater:
for Klass in sorted(ChangeLogFormater.ar_Klass,key=lambda x: x.priority):
if content:=Klass._CheckLine(RawChangelogLine):
return Klass(content.group(1),content.group(2))
for Klass in sorted(ChangeLogFormater.ar_Klass,key=lambda x: x.priority,reverse=True):
if content:=Klass._CheckLine_keywords(RawChangelogLine):
return Klass(None,RawChangelogLine)
return ChangeLogFormater_others(None,RawChangelogLine)
@classmethod
def FactoryProcessFullChangelog(cls,RawChangelogMessage:str) -> list[ChangeLogFormater]:
LinesResult=[]
for line in RawChangelogMessage.split('\n'):
if(line.strip()!=""):
LinesResult.append(cls.FactoryProcessLine(line))
ChangeLogFormater.ar_LinesResult=LinesResult
return LinesResult
@classmethod
def GetLinesOfType(cls,Klass:type) -> list[ChangeLogFormater]:
return [_ for _ in ChangeLogFormater.ar_LinesResult if type(_)==Klass]
@classmethod
def GetLines(cls) -> list[ChangeLogFormater]:
return ChangeLogFormater.GetLinesOfType(cls)
@classmethod
def RenderFullChangelog(cls) -> str:
full_changelog = ""
for Klass in ChangeLogFormater.ar_Klass:
full_changelog = full_changelog + Klass.RenderLines()
return full_changelog
# creating category classes: '<NAME>': (priority, ['<prefix1>',...], '<header>')
for RecordType, Config in { 'breaking': (20, ["break",], ':rotating_light: Breaking changes :rotating_light::'),
'feat': (20, ["feat","new","create"], 'Features :sparkles::'),
'fix': (10, ["issue","problem"], 'Fixes :wrench::'),
'security': (20, ["safe","leak"], 'Security :shield::'),
'chore': (20, ["task","refactor","build","better"], 'Chore :building_construction::'),
'perf': (0, ["fast",], 'Performance Enhancements :rocket::'),
'wip': (0, ["temp",], 'Work in progress changes :construction::'),
'docs': (0, ["doc",], 'Documentations :book::'),
'style': (30, ["beautify",], 'Style :art::'),
'refactor': (0, [], 'Refactorings :recycle::'),
'ci': (0, [""], 'Continuous Integration :cyclone::'),
'test': (15, ["unittest","check"], 'Testings :vertical_traffic_light::'),
'build': (0, ["compile","version"], 'Builds :package:')
}.items():
name=f"ChangeLogFormater_{RecordType}"
tmp = globals()[name] = type(name, (ChangeLogFormater,),{"prefix": RecordType,"title": Config[2],"keywords":Config[1],"priority":Config[0] })
ChangeLogFormater.ar_Klass.append(tmp)
@ChangeLogFormaterRecordType
class ChangeLogFormater_revert(ChangeLogFormater):
prefix:str = 'revert'
title:str = 'Reverts :back::'
keywords:list[str] = ["fallback"]
priority:int = 0
def RenderLine(self) -> str:
return "~~"+super().RenderLine()+"~~"
@ChangeLogFormaterRecordType
class ChangeLogFormater_others(ChangeLogFormater):
prefix:str = 'other'
title:str = 'Others :question::'
keywords:list[str] = [""]
priority:int = -20

View File

@@ -1,43 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pychangelogfactory (c) by chacha
#
# pychangelogfactory is licensed under a
# Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Unported License.
#
# You should have received a copy of the license along with this
# work. If not, see <https://creativecommons.org/licenses/by-nc-sa/4.0/>.
"""Phasellus tellus lectus, volutpat eu dapibus ut, suscipit vel augue.
Tips:
Aliquam non leo vel libero sagittis viverra. Quisque lobortis nunc sit amet augue euismod laoreet.
Note:
Maecenas volutpat porttitor pretium. Aliquam suscipit quis nisi non imperdiet.
Note:
Vivamus et efficitur lorem, eget imperdiet tortor. Integer vel interdum sem.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING: # Only imports the below statements during type checking
pass
def test_function(testvar: int) -> int:
""" A test function that return testvar+1 and print "Hello world !"
Proin eget sapien eget ipsum efficitur mollis nec ac nibh.
Note:
Morbi id lectus maximus, condimentum nunc eget, porta felis. In tristique velit tortor.
Args:
testvar: any integer
Returns:
testvar+1
"""
print("Hello world !")
return testvar+1

View File

@@ -0,0 +1,68 @@
# pychangelogfactory (c) by chacha
#
# pychangelogfactory is licensed under a
# Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Unported License.
#
# You should have received a copy of the license along with this
# work. If not, see <https://creativecommons.org/licenses/by-nc-sa/4.0/>.
import unittest
from io import StringIO
from contextlib import redirect_stdout,redirect_stderr
print(__name__)
print(__package__)
from src import pychangelogfactory
test_commitlog_1="""
breaking: test1
feat: test2
chore: test3
security: test4
style:test5
fix: test6
wip: test7
perf: test8
refactor: test9
ci: test10
docs: test11
test: test12
build: test13
- fix: test14
revert: test15
toto:un autre cas
fdsfdsfdsfsdfsdff
"""
class Testtest_module(unittest.TestCase):
def test_simplegeneration_full(self):
pychangelogfactory.ChangeLogFormater.FactoryProcessFullChangelog(test_commitlog_1)
changelog = pychangelogfactory.ChangeLogFormater.RenderFullChangelog()
print(changelog)
self.assertIn("test1",changelog)
self.assertIn("test2",changelog)
self.assertIn("test3",changelog)
self.assertIn("test4",changelog)
self.assertIn("test5",changelog)
self.assertIn("test6",changelog)
self.assertIn("test7",changelog)
self.assertIn("test8",changelog)
self.assertIn("test9",changelog)
self.assertIn("test10",changelog)
self.assertIn("test11",changelog)
self.assertIn("test12",changelog)
self.assertIn("test13",changelog)
self.assertIn("test14",changelog)
self.assertIn("test15",changelog)
self.assertIn("un autre cas",changelog)
self.assertIn("fdsfdsfdsfsdfsdff",changelog)

View File

@@ -1,32 +0,0 @@
# pychangelogfactory (c) by chacha
#
# pychangelogfactory is licensed under a
# Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Unported License.
#
# You should have received a copy of the license along with this
# work. If not, see <https://creativecommons.org/licenses/by-nc-sa/4.0/>.
import unittest
from io import StringIO
from contextlib import redirect_stdout,redirect_stderr
print(__name__)
print(__package__)
from src import pychangelogfactory
class Testtest_module(unittest.TestCase):
def test_version(self):
self.assertNotEqual(pychangelogfactory.__version__,"?.?.?")
def test_test_module(self):
with redirect_stdout(StringIO()) as capted_stdout, redirect_stderr(StringIO()) as capted_stderr:
self.assertEqual(pychangelogfactory.test_function(41),42)
self.assertEqual(len(capted_stderr.getvalue()),0)
self.assertEqual(capted_stdout.getvalue().strip(),"Hello world !")
self.assertEqual(len(capted_stderr.getvalue()),0)