[add] graphviz
This commit is contained in:
		
							parent
							
								
									e195c3a9f1
								
							
						
					
					
						commit
						999c503294
					
				
					 6 changed files with 98 additions and 0 deletions
				
			
		
							
								
								
									
										10
									
								
								graphviz/Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								graphviz/Dockerfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					FROM alpine:3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN apk add --no-cache \
 | 
				
			||||||
 | 
						graphviz python3 py-pip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADD requirements.txt ./
 | 
				
			||||||
 | 
					RUN pip3 install -r requirements.txt --break-system-packages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADD server.py ./
 | 
				
			||||||
 | 
					CMD hug -f server.py
 | 
				
			||||||
							
								
								
									
										7
									
								
								graphviz/compose.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								graphviz/compose.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					name: graphviz
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					    graphviz:
 | 
				
			||||||
 | 
					        ports:
 | 
				
			||||||
 | 
					            - 8000:8000
 | 
				
			||||||
 | 
					        image: graphviz
 | 
				
			||||||
 | 
					        restart: unless-stopped
 | 
				
			||||||
							
								
								
									
										7
									
								
								graphviz/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								graphviz/readme.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					docker build -t graphviz .
 | 
				
			||||||
 | 
					docker run -p8000:8000 graphviz
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Based on https://github.com/sseemayer/docker-graphviz
 | 
				
			||||||
							
								
								
									
										3
									
								
								graphviz/requirements.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								graphviz/requirements.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					hug==2.6.1
 | 
				
			||||||
 | 
					hug-middleware-cors==1.0.0
 | 
				
			||||||
 | 
					six==1.16.0
 | 
				
			||||||
							
								
								
									
										60
									
								
								graphviz/server.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								graphviz/server.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,60 @@
 | 
				
			||||||
 | 
					import hug
 | 
				
			||||||
 | 
					from hug.middleware import CORSMiddleware
 | 
				
			||||||
 | 
					from six import BytesIO
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					import logging
 | 
				
			||||||
 | 
					from tempfile import NamedTemporaryFile as ntf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					logging.basicConfig()
 | 
				
			||||||
 | 
					api = hug.API(__name__)
 | 
				
			||||||
 | 
					api.http.add_middleware(CORSMiddleware(api, allow_credentials=True))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@hug.not_found()
 | 
				
			||||||
 | 
					def not_found_handler():
 | 
				
			||||||
 | 
					    return "Not Found"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@hug.get_post('/viz.svg', output=hug.output_format.image("svg+xml"))
 | 
				
			||||||
 | 
					@hug.get_post('/viz.png', output=hug.output_format.image("png"))
 | 
				
			||||||
 | 
					@hug.get_post('/viz.dot', output=hug.output_format.text)
 | 
				
			||||||
 | 
					@hug.get_post('/viz.xdot', output=hug.output_format.text)
 | 
				
			||||||
 | 
					def demo(
 | 
				
			||||||
 | 
					    dot: 'A Graphviz dot document',
 | 
				
			||||||
 | 
					    request,
 | 
				
			||||||
 | 
					    response,
 | 
				
			||||||
 | 
					    algorithm: hug.types.one_of(['dot', 'neato', 'twopi', 'circo', 'fdp', 'sfdp', 'patchwork', 'osage'])='dot',
 | 
				
			||||||
 | 
					):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    suffix = request.path.split(".")[-1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Enforce unicode strings
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        dot = dot.decode("utf-8")
 | 
				
			||||||
 | 
					    except AttributeError:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    with ntf(suffix=".dot", mode="w") as f_dot, ntf(mode="r+b") as f_out, ntf(mode="r") as f_err:
 | 
				
			||||||
 | 
					        f_dot.write(dot)
 | 
				
			||||||
 | 
					        f_dot.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cmd = [
 | 
				
			||||||
 | 
					            algorithm,
 | 
				
			||||||
 | 
					            '-T',
 | 
				
			||||||
 | 
					            suffix,
 | 
				
			||||||
 | 
					            f_dot.name,
 | 
				
			||||||
 | 
					            '-o',
 | 
				
			||||||
 | 
					            f_out.name
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        proc = subprocess.Popen(cmd, stdout=f_err, stderr=subprocess.STDOUT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = proc.wait()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ret != 0:
 | 
				
			||||||
 | 
					            response.status = hug.HTTP_500
 | 
				
			||||||
 | 
					            f_err.seek(0)
 | 
				
			||||||
 | 
					            return {"status_code": ret, "message": f_err.read()}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        f_out.seek(0)
 | 
				
			||||||
 | 
					        out_data = f_out.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return BytesIO(out_data)
 | 
				
			||||||
							
								
								
									
										11
									
								
								graphviz/test.dot
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								graphviz/test.dot
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					digraph D {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    node [fontname="Arial"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    node_A [shape=record    label="shape=record|{above|middle|below}|right"];
 | 
				
			||||||
 | 
					    node_B [shape=plaintext label="shape=plaintext|{curly|braces and|bars without}|effect"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue