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 } )