File size: 4,791 Bytes
58da40f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env python


import os, subprocess, json, argparse, re, tempfile
from kumikolib import Kumiko,Panel,Debug
from lib.html import HTML



class Tester:
	
	files = []
	git_repo = 'https://framagit.org/nicooo/kumiko'
	git_versions = ['v1.4.1', 'current']
	
	def __init__(self, options):
		self.savedir = os.path.join('tests','results')
		if not os.path.isdir(self.savedir):
			raise Exception("'%s' is not a directory" % self.savedir)
		
		self.options = {
			'browser': options['browser'] if 'browser' in options and options['browser'] else False,
			'html': options['html'] if 'html' in options else False
		}
		
		# Test all files in tests/images/$folder/
		if len(self.files) == 0:
			for d in os.scandir('tests/images'):
				 if d.is_dir():
					 self.files.append(d)
			self.files.sort(key=lambda d: d.name)
	
	
	def run_all(self):
		for git_version in self.git_versions:
			self.run(git_version)
	
	
	def run(self, git_version):
		print('\n########## Finding panels with kumiko version',git_version,'##########')
		kumiko_bin = './kumiko'
		
		# Kumiko would not accept non-image files before v1.2, special case for .licence files
		accepts_license_files = git_version >= 'v1.2' or not re.match('^v\d+.\d+$', git_version)
		tmpfolder = None if accepts_license_files else tempfile.TemporaryDirectory(dir='./tests')
		
		# Get that Kumiko version
		if git_version != 'current':
			tempgit = '/tmp/kumikogit'
			subprocess.run(['rm','-rf',tempgit])
			subprocess.run(['git', 'clone', self.git_repo, tempgit], capture_output=True)
			subprocess.run(['git', 'checkout', git_version], cwd=tempgit, capture_output=True)
			kumiko_bin = os.path.join(tempgit,'kumiko')
		
		for f in self.files:
			# move .license files to tempdir (<v1.2 compatibility)
			if tmpfolder and os.path.isdir(f):
				for g in os.scandir(f):
					if re.search('\.license$',g.name):
						os.rename(g,os.path.join(tmpfolder.name,os.path.basename(g)))
			
			print("##### Kumiko-cutting {0} ({1}) #####".format(f if isinstance(f,str) else f.name, git_version))
			
			subprocess.run(['mkdir','-p',os.path.join(self.savedir,git_version)])
			jsonfile = os.path.join(self.savedir,git_version,os.path.basename(f)+'.json')
			subprocess.run(args=[kumiko_bin, '-i', f, '-o', jsonfile, '--progress'])
			
			if tmpfolder and os.path.isdir(f):
				for g in os.scandir(tmpfolder.name):
					if re.search('\.license$',g.name):
						os.rename(g,os.path.join(f,os.path.basename(g)))
	
	
	def compare_all(self):
		self.max_diffs = 20
		
		for i in range(len(self.git_versions)-1):
			v1 = self.git_versions[i]
			v2 = self.git_versions[i+1]
			print('\n########## Comparing kumiko results between versions',v1,'and',v2,'##########')
			
			files_diff = {}
			
			for file_or_dir in self.files:
				
				if len(files_diff) > 20:
					print('The maximum number of differences in files (20) has been reached, stopping')
					break
				
				with open(os.path.join(self.savedir,v1,os.path.basename(file_or_dir)+'.json')) as fh:
					json1 = json.load(fh)
				with open(os.path.join(self.savedir,v2,os.path.basename(file_or_dir)+'.json')) as fh:
					json2 = json.load(fh)
				
				files_diff.update(Debug.get_files_diff(file_or_dir,json1,json2))
			
			print('Found',len(files_diff),'differences')
			
			if not self.options['html']:
				return
			
			print('Generating HTML diff file')
			
			html_diff_file = os.path.join(self.savedir,'diff-'+v1+'-'+v2+'.html')
			diff_file = open(html_diff_file, 'w')
			diff_file.write(HTML.header('Comparing Kumiko results','../../'))
			
			diff_file.write(HTML.nbdiffs(files_diff))
			
			for img in files_diff:
				diff_file.write(HTML.side_by_side_panels(img,'',files_diff[img]['jsons'],v1,v2,images_dir=files_diff[img]['images_dir'], known_panels=files_diff[img]['known_panels']))
			
			diff_file.write(HTML.footer)
			diff_file.close()
			
			if self.options['browser']:
				subprocess.run([self.options['browser'],html_diff_file])
	


parser = argparse.ArgumentParser(description='Kumiko Tester')

parser.add_argument('action', nargs='?', help="Just 'run' (compute information about files), 'compare' two versions of the code, or both", choices=['run','compare','run_compare'], default='run_compare')

parser.add_argument('-b', '--browser', nargs=1, help='Opens given browser to view the differences when ready (implies --html)', choices=['firefox','konqueror','chromium'])
parser.add_argument('--html', action='store_true', help='Generates an HTML file showing the differences between code versions')

args = parser.parse_args()

tester = Tester({
	'html': args.html or args.browser,
	'browser': args.browser[0] if args.browser != None else False,
})

if args.action in ['run','run_compare']:
	tester.run_all()
if args.action in ['compare','run_compare']:
	tester.compare_all()