135 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
import yaml
 | 
						|
import os
 | 
						|
import glob
 | 
						|
import re
 | 
						|
 | 
						|
class Index( object ):
 | 
						|
    def __init__( self, path ):
 | 
						|
        self.path = path
 | 
						|
        self.fields = {}
 | 
						|
        self.doc = ""
 | 
						|
        self.updates = []
 | 
						|
 | 
						|
    def path_short( self ):
 | 
						|
        # XXX needs tidy
 | 
						|
        return "content/pages/index.md"
 | 
						|
 | 
						|
    def open( self ):
 | 
						|
        self.read()
 | 
						|
 | 
						|
    def write( self ):
 | 
						|
        outdata = ( '''\
 | 
						|
---
 | 
						|
%(yaml)s
 | 
						|
---
 | 
						|
%(md)s
 | 
						|
''' % { 'yaml': yaml.dump( self.fields, default_flow_style = False ),
 | 
						|
        'md': "\n\n***\n\n".join( [ self.doc ] + self.updates ),
 | 
						|
        } )
 | 
						|
        outfile = open( self.path, 'w', encoding = "utf-8" )
 | 
						|
        outfile.write( outdata )
 | 
						|
        return outdata
 | 
						|
 | 
						|
    def read( self ):
 | 
						|
        indata = open( self.path, 'r', encoding = "utf-8" ).read()
 | 
						|
        ( pre, yamldata, docdata ) = re.split( "^---$", indata, flags = re.MULTILINE )
 | 
						|
        self.fields = yaml.load( yamldata, Loader = yaml.SafeLoader )
 | 
						|
        doc = docdata.strip()
 | 
						|
        bits = re.split( r"^\*+$", doc, flags = re.MULTILINE )        
 | 
						|
        self.doc = bits.pop( 0 )
 | 
						|
        self.updates = [ x.strip() for x in bits ]
 | 
						|
 | 
						|
    def _toggle( self, fieldname ):
 | 
						|
        if self.fields.get( fieldname ):
 | 
						|
            del self.fields[ fieldname ]
 | 
						|
        else:
 | 
						|
            self.fields[ fieldname ] = True
 | 
						|
        return " ".join( [ x for x in [ 'incident', 'degraded', 'maintenance', 'notice', 'ok' ] if self.fields.get( x ) ] )
 | 
						|
 | 
						|
    def toggle_incident( self ):
 | 
						|
        return self._toggle( 'incident' )
 | 
						|
 | 
						|
    def toggle_degraded( self ):
 | 
						|
        return self._toggle( 'degraded' )
 | 
						|
 | 
						|
    def toggle_maintenance( self ):
 | 
						|
        return self._toggle( 'maintenance' )
 | 
						|
 | 
						|
    def toggle_notice( self ):
 | 
						|
        return self._toggle( 'notice' )
 | 
						|
 | 
						|
    def toggle_ok( self ):
 | 
						|
        return self._toggle( 'ok' )
 | 
						|
 | 
						|
    def set_flags( self, flags ):
 | 
						|
        for fieldname in [ 'incident', 'degraded', 'maintenance', 'notice', 'ok' ]:
 | 
						|
            self.fields[ fieldname ] = fieldname in flags
 | 
						|
 | 
						|
 | 
						|
class Event( Index ):
 | 
						|
    def __init__( self, path, glob ):
 | 
						|
        super().__init__( path )
 | 
						|
        self.glob = glob
 | 
						|
 | 
						|
    def path_short( self ):
 | 
						|
        # XXX needs tidy
 | 
						|
        return "content/event/" + os.path.basename( self.path )
 | 
						|
 | 
						|
    def open( self ):
 | 
						|
        if os.path.exists( self.path ):
 | 
						|
            self.read()
 | 
						|
            return False
 | 
						|
        for path in glob.glob( self.glob ):
 | 
						|
            if os.path.exists( path ):
 | 
						|
                self.path = path
 | 
						|
                self.read()
 | 
						|
                return False
 | 
						|
        return True
 | 
						|
 | 
						|
    def set_title( self, title ):
 | 
						|
        self.fields[ '$title@' ] = title
 | 
						|
 | 
						|
    def set_slug( self, slug ):
 | 
						|
        self.fields[ '$slug' ] = slug
 | 
						|
 | 
						|
    def set_year( self, year ):
 | 
						|
        if isinstance( self.fields.get( 'year', None ), ( type( None ), str ) ):
 | 
						|
            self.fields[ 'year' ] = int( year )
 | 
						|
 | 
						|
    def set_published( self, published ):
 | 
						|
        if not self.fields.get( '$date' ):
 | 
						|
            self.fields[ '$date' ] = {}
 | 
						|
        if not self.fields[ '$date' ].get( 'published' ):
 | 
						|
            self.fields[ '$date' ][ 'published' ] = published
 | 
						|
            return published
 | 
						|
 | 
						|
    def set_started( self, started ):
 | 
						|
        if not self.fields.get( '$date' ):
 | 
						|
            self.fields[ '$date' ] = {}
 | 
						|
        self.fields[ '$date' ][ 'started' ] = started
 | 
						|
        return started
 | 
						|
 | 
						|
    def set_expected( self, expected ):
 | 
						|
        if not self.fields.get( '$date' ):
 | 
						|
            self.fields[ '$date' ] = {}
 | 
						|
        self.fields[ '$date' ][ 'expected' ] = expected
 | 
						|
        return expected
 | 
						|
 | 
						|
    def set_finished( self, finished ):
 | 
						|
        if not self.fields.get( '$date' ):
 | 
						|
            self.fields[ '$date' ] = {}
 | 
						|
        self.fields[ '$date' ][ 'finished' ] = finished
 | 
						|
        return finished
 | 
						|
 | 
						|
    def set_resolved( self, resolved ):
 | 
						|
        if not self.fields.get( '$date' ):
 | 
						|
            self.fields[ '$date' ] = {}
 | 
						|
        self.fields[ '$date' ][ 'resolved' ] = resolved
 | 
						|
        return resolved
 | 
						|
 | 
						|
    def add_timeline( self, time, line ):
 | 
						|
        if not self.fields.get( 'timeline' ):
 | 
						|
            self.fields[ 'timeline' ] = []
 | 
						|
        self.fields[ 'timeline' ].append( { 'time': time, 'line': line } )
 |