рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдЕрдЦрдВрдбрддрд╛ рдирд┐рдпрдВрддреНрд░рдг

рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдХреИрдирд░ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБ-рдШрдЯрдХ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЛрдб рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рд╡реГрджреНрдзрд┐ рдЬрд╛рд░реА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд░реЗрдбреА рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдмреАрдЪ, рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реАрдХреНрд╖рдХ-рд╕реНрд╡рдЪрд╛рд▓рди рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХреЗ рдХрд╛рд░рдг, рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред

рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реЛ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рднреА рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдХреЛрдб рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рддрдВрддреНрд░


рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╕рдВрд╢реЛрдзрди, рд╣реИрд╢ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

(func_hash, func_source) 

рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрди рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 {"funcName1": (funcName1_hash, funcName1_source), "funcName2": (funcName2_hash, funcName2_source), ...} 

рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдХрд╕рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рд░реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рд╕рднреА рд╕рдВрд╢реЛрдзрди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ (рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрди рдХреА рддрд┐рдерд┐ рдФрд░ рд╕рдВрд╢реЛрдзрди рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:

 [revision's last date-n-time, {revisions}] 

рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХреА рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдереЛрдбрд╝реЗ рд╕рдордп рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрди рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВред

рдмреЗрд╢рдХ, рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдирд┐рд░реАрдХреНрд╖рдг рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрдЖрдИрдЯреА, рдПрд╕рд╡реАрдПрди)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд░реАрдХреНрд╖рдг рдмреЗрдХрд╛рд░ рд╣реИрдВ рдпрджрд┐ рдЖрдк рд╕реИрдХрдбрд╝реЛрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрд╡рдд: рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдПрдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдФрд░ рд▓рдВрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ - рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╕рдВрд╢реЛрдзрди рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреЛрдб


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдореЙрдбреНрдпреВрд▓ FileRevision.py рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╢реЛрдзрди () рд╡рд░реНрдЧ рдХреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореЙрдбреНрдпреВрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рд▓рд┐рдВрдХ рдкрд░ рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИред

рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╡рд░реНрдЧ рд╕рдВрд╢реЛрдзрди ():

__in __ () # рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд░рдВрднреАрдХрд░рдг
 def __init__(self, fileRevision='revision.txt'): self.fileRevision = fileRevision self.mainRevision = self._ReadFromFile(self.fileRevision) # get main revision first 

_ReadFromFile () # рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 def _ReadFromFile(self, file=None): """ Helper function that parse and return revision from file. """ revision = [None, {}] if file == None: file = self.fileRevision try: if os.path.exists(file) and os.path.isfile(file): with open(file) as fH: revision = eval(fH.read()) except: traceback.print_exc() finally: return revision 

_WriteToFile () # рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рд▓рд┐рдЦреЗрдВред
 def _WriteToFile(self, revision=[None, {}], file=None): """ Helper procedure than trying to write given revision to file. """ status = False if file == None: file = self.fileRevision try: with open(file, "w") as fH: fH.write(str(revision)) status = True except: traceback.print_exc() finally: return status 

_GetOld () # рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
 def _GetOld(self, func=None): """ Get old revision for given function and return tuple: (old_hash, old_source). """ funcHashOld = None # old code is None if function not exist in previous revision funcSourceOld = None # old hash is None if function not exist in previous revision try: if func.__name__ in self.mainRevision[1]: funcHashOld = self.mainRevision[1][func.__name__][0] # field with old hash of function funcSourceOld = self.mainRevision[1][func.__name__][1] # field with old code of function except: traceback.print_exc() finally: return (funcHashOld, funcSourceOld) 

_GetNew () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
 def _GetNew(self, func=None): """ Get new revision for given function and return tuple: (new_hash, new_source). """ funcSourceNew = None # if function doesn't exist, its also doesn't have code funcHashNew = None # hash is None if function not exist try: funcSourceNew = inspect.getsource(func) # get function's source funcHashNew = hash(funcSourceNew) # new hash of function except: traceback.print_exc() finally: return (funcHashNew, funcSourceNew) 

_Similar () # рджреЛ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ред
 def _Similar(self, hashOld, sourceOld, hashNew, sourceNew): """ Checks if given params for modified then return tuple with revision's diff: (old_revision, new_revision), otherwise return None. """ similar = True # old and new functions are similar, by default if hashNew != hashOld: if sourceOld != sourceNew: similar = False # modified if hashes are not similar and functions not contains similar code return similar 

рдЕрджреНрдпрддрди () # рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
 def Update(self, func=None):    """    Set new revision for function.    revision = [revision date-n-time,                {"funcName1": (funcName1_hash, funcName1_source),                {"funcName2": (funcName2_hash, funcName2_source), ...}]    """    status = False    if func:        try:            funcSourceNew = inspect.getsource(func) # get function's source            funcHashNew = hash(funcSourceNew) # new hash of function            revisionDateNew = datetime.now().strftime('%d.%m.%Y %H:%M:%S') # revision's date            funcRevisionNew = {func.__name__: [funcHashNew, funcSourceNew]} # form for function's revision            self.mainRevision[0] = revisionDateNew # set new date for main revision            self.mainRevision[1].update(funcRevisionNew) # add function's revision to main revision            if self._WriteToFile(self.mainRevision): # write main revision to file                status = True        except:            traceback.print_exc()        finally:            return status 

DeleteAll () # рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рднреА рд╕рдВрд╢реЛрдзрди рд╣рдЯрд╛рдПрдБред
 def DeleteAll(self): """ Helper function that parse and return revision from file. """ status = False try: self.mainRevision = [None, {}] # clean revision if self._WriteToFile(self.mainRevision): # write main revision to file status = True except: traceback.print_exc() finally: return status 

ShowOld () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
 def ShowOld(self, func=None): """ Function return old revision for given function. """ funcHashOld, funcSourceOld = self._GetOld(func) # get old revision for given function dateStr = "Last revision: " + str(self.mainRevision[0]) hashStr = "\nOld function's hash: " + str(funcHashOld) codeStr = "\nOld function's code:\n" + "- " * 30 + "\n" + str(funcSourceOld) + "\n" + "- " * 30 oldRevision = dateStr + hashStr + codeStr return oldRevision 

ShowNew () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд╕рдВрд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
 def ShowNew(self, func=None): """ Function return old revision for given function. """ funcHashNew, funcSourceNew = self._GetNew(func) # get old revision for given function hashStr = "New function's hash: " + str(funcHashNew) codeStr = "\nNew function's code:\n" + "- " * 30 + "\n" + str(funcSourceNew) + "\n" + "- " * 30 newRevision = hashStr + codeStr return newRevision 

рдореБрд╢реНрдХрд┐рд▓ () # рд╕рдВрд╢реЛрдзрди рдХреА рддреБрд▓рдирд╛ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЕрдВрддрд░ред
 def Diff(self, func=None): """ Checks if given function modified then return tuple with revision's diff: (old_revision, new_revision), otherwise return None. """ funcHashOld, funcSourceOld = self._GetOld(func) # get old revision for given function funcHashNew, funcSourceNew = self._GetNew(func) # get new revision for given function # check old and new revisions: if self._Similar(funcHashOld, funcSourceOld, funcHashNew, funcSourceNew): diff = None # not difference else: diff = ("Last revision: " + str(self.mainRevision[0]) + "\nOld function's hash: " + str(funcHashOld) + "\nOld function's code:\n" + "- " * 30 + "\n" + str(funcSourceOld) + "\n" + "- " * 30, "\nNew function's hash: " + str(funcHashNew) + "\nNew function's code:\n" + "- " * 30 + "\n" + str(funcSourceNew) + "\n" + "- " * 30) # if new function not similar old function return diff 

рдореЙрдбреНрдпреВрд▓ рдСрдкрд░реЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП _testFunction () # рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди
 def _testFunction(a=None): """ This is fake test function for module. """ # this is comment if a: return True else: return False 

рдЕрдЧрд░ __name__ == '__main__' :() # рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬрдм рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 func = _testFunction # set function for review in revision revision = Revision('revision.txt') # init revision class for using with revision.txt # how to use this module for review revision of function: print(MSG_CHECK, func.__name__) funcModified = revision.Diff(func) # get function's diff as tuple (old_revision, new_revision) if funcModified: print(MSG_MODIFIED) print(funcModified[0]) # old revision print(funcModified[1]) # new revision else: print(MSG_NOT_MODIFIED) # how to use this module for update revision: action = input("Update function's revision? [y/n]: ") if action == 'y': print(MSG_UPDATE, func.__name__) if revision.Update(func): print(MSG_UPDATED) else: print(MSG_UPDATE_ERROR) # how to use this module for clean file-revision: action = input("Clean file-revision now? [y/n]: ") if action == 'y': print(MSG_DELETE) if revision.DeleteAll(): print(MSG_DELETED) else: print(MSG_DELETE_ERROR) # how to use this module for show old review: action = input('Show old revision for function? [y/n]: ') if action == 'y': print(revision.ShowOld(func)) # how to use this module for show new review: action = input('Show new revision for function? [y/n]: ') if action == 'y': print(revision.ShowNew(func)) 

рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдкрд╛рдпрдерди 3.2.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдЕрдЬрдЧрд░ FileRevision.py



рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧреА, рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧреА, рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдЧреА, рдФрд░ рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧреАред рдлрд┐рд░, .py рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╢реЛрдзрдиред Txt рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдбрд┐рдЧреНрд░реА рдмрдврд╝ рдЬрд╛рдПрдЧреАред

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рддреИрдореВрд░ рдЧрд┐рд▓реНрдореБрд▓рд┐рди, рдкреЙрдЬрд┐рдЯрд┐рд╡ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ рдСрдЯреЛрдореЗрдЯреЗрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЧреНрд░реБрдк

Source: https://habr.com/ru/post/In177189/


All Articles