PK!*@contenders/__init__.py"""Contenders: Self-hosted programming challenge framework. Usage: contenders -h | --help contenders [--host=] [--port=] Options: -h --help Show this help message. --host= Specify the flask webserver's host. --port= Specify the port for the flask webserver. """ from docopt import docopt from .components import app __version__ = '0.1.0' def main(): arguments = docopt(__doc__, version=f'contenders {__version__}') port = arguments.get('--port', '80') host = arguments.get('--host', '127.0.0.1') app.run_server(port, host=host) if __name__ == '__main__': main() PK!B"contenders/components.pyimport dash import dash_html_components as html import dash_bootstrap_components as dbc import pandas as pd navbar = dbc.NavbarSimple( children=[ dbc.DropdownMenu( nav=True, caret=False, in_navbar=True, label='Aperture', direction='right', children=[ dbc.DropdownMenuItem('Home'), dbc.DropdownMenuItem('My Profile'), dbc.DropdownMenuItem('Sign out') ] ) ], sticky='top', brand='Contenders' ) class GameMode(dbc.Card): buttons = [ dbc.Button('Create Game', color='primary', className='mr-1 float-left'), dbc.Button('Join Game', color='success', className='mr-1 float-right') ] @classmethod def card(self, name: str, description: str): return dbc.Card([ dbc.CardHeader(name), dbc.CardBody(description), dbc.CardFooter(self.buttons) ]) cards = dbc.CardDeck( [ GameMode.card('Code Golf', 'Submit a working solution with the lowest byte count.'), GameMode.card('Fastest Solution', 'Submit a working solution as fast as possible.') ], style={'text-align': 'center'} ) df = pd.read_csv('contenders/scores.csv') scoreboard = dbc.Table.from_dataframe( df, hover=True, style={'margin-top': '1rem'} ) body = dbc.Container([cards, scoreboard], className="mt-4") app = dash.Dash( __name__, external_stylesheets=[dbc.themes.BOOTSTRAP] ) app.layout = html.Div([navbar, body]) PK!0{\\contenders/scores.csvUsername,Total Score,Total Games,Average Score Aperture,15,5,3 Shady,20,10,2 Joseph,30,30,1 PK!Hf Ϛ&.+contenders-0.1.1.dist-info/entry_points.txtN+I/N.,() 楤"Vy\\PK!Hu)GTU contenders-0.1.1.dist-info/WHEEL HM K-*ϳR03rOK-J,/R(O-)$qzd&Y)r$UV&UrPK!Hc$#contenders-0.1.1.dist-info/METADATAo0W4$6v[MTNrmLJ$x.F~D/%)]=9cPG>ϥ-CنyLX2U8YaC!E9Re!ToO"G EJR@:,ΩBߵvO@HT/FR8N1 Dӷ'S2i흷XFXxe]J/ +@\Wcm|C6:!3 `#]VOg!<\z0?|lK` fG0@@TÜ:O7.vc i/B.gD7l^W`U8O̶])s\)f ײ{WY66RO<]Uk-yb춾P0 `TAUۋF`6%a9h_S9ZYV`)oPK!HLb$!contenders-0.1.1.dist-info/RECORD}v0}% C  cq$( O]y?f=M Z44#TQnÔ;}h,]4n@~sMpwyh%3w" 2W S%aXeVرb|N,(LHqX={gǴa_.a7ͱpUk>] Zr WhaYmN.cկ 2Țmt2$Q[pДWcEGC6\I;6e%t+^e 26 /PK!*@contenders/__init__.pyPK!B"contenders/components.pyPK!0{\\ contenders/scores.csvPK!Hf Ϛ&.+ contenders-0.1.1.dist-info/entry_points.txtPK!Hu)GTU  contenders-0.1.1.dist-info/WHEELPK!Hc$# contenders-0.1.1.dist-info/METADATAPK!HLb$! contenders-0.1.1.dist-info/RECORDPKt