def setup_experiment(debug=True, verbose=False, app=None):
    """Check the app and, if it's compatible with Wallace, freeze its state."""
    print_header()

    # Verify that the package is usable.
    log("Verifying that directory is compatible with Wallace...")
    if not verify_package(verbose=verbose):
        raise AssertionError(
            "This is not a valid Wallace app. " +
            "Fix the errors and then try running 'wallace verify'.")

    # Verify that the Postgres server is running.
    try:
        psycopg2.connect(database="x", user="postgres", password="nada")
    except psycopg2.OperationalError, e:
        if "could not connect to server" in str(e):
            raise RuntimeError("The Postgres server isn't running.")

    # Load psiTurk configuration.
    config = PsiturkConfig()
    config.load_config()

    # Check that the demo-specific requirements are satisfied.
    try:
        with open("requirements.txt", "r") as f:
            dependencies = f.readlines()
    except:
        dependencies = []

    pkg_resources.require(dependencies)

    # Generate a unique id for this experiment.
    id = "w" + str(uuid.uuid4())[0:28]

    # If the user provided an app name, use it everywhere that's user-facing.
    if app:
        id_long = id
        id = str(app)

    log("Running as experiment " + id + "...")

    # Copy this directory into a temporary folder, ignoring .git
    dst = os.path.join(tempfile.mkdtemp(), id)
    to_ignore = shutil.ignore_patterns(
        ".git/*",
        "*.db",
        "snapshots",
        "data",
        "server.log"
    )
    shutil.copytree(os.getcwd(), dst, ignore=to_ignore)

    click.echo(dst)

    # Save the experiment id
    with open(os.path.join(dst, "experiment_id.txt"), "w") as file:
        if app:
            file.write(id_long)
        else:
            file.write(id)

    # Zip up the temporary directory and place it in the cwd.
    if not debug:
        log("Freezing the experiment package...")
        shutil.make_archive(
            os.path.join("snapshots", id + "-code"), "zip", dst)

    # Change directory to the temporary folder.
    cwd = os.getcwd()
    os.chdir(dst)

    # Check directories.
    if not os.path.exists("static/scripts"):
        os.makedirs("static/scripts")
    if not os.path.exists("templates"):
        os.makedirs("templates")
    if not os.path.exists("static/css"):
        os.makedirs("static/css")

    # Rename experiment.py to wallace_experiment.py to aviod psiTurk conflict.
    os.rename(
        os.path.join(dst, "experiment.py"),
        os.path.join(dst, "wallace_experiment.py"))

    # Copy files into this experiment package.
    src = os.path.join(
        os.path.dirname(os.path.realpath(__file__)),
        "custom.py")
    shutil.copy(src, os.path.join(dst, "custom.py"))

    heroku_files = [
        "Procfile",
        "requirements.txt",
        "psiturkapp.py",
        "worker.py",
        "clock.py",
    ]

    for filename in heroku_files:
        src = os.path.join(
            os.path.dirname(os.path.realpath(__file__)),
            "heroku",
            filename)
        shutil.copy(src, os.path.join(dst, filename))

    clock_on = config.getboolean('Server Parameters', 'clock_on')

    # If the clock process has been disabled, overwrite the Procfile.
    if not clock_on:
        src = os.path.join(
            os.path.dirname(os.path.realpath(__file__)),
            "heroku",
            "Procfile_no_clock")
        shutil.copy(src, os.path.join(dst, "Procfile"))

    frontend_files = [
        "static/css/wallace.css",
        "static/scripts/wallace.js",
        "static/scripts/reqwest.min.js",
        "templates/error_wallace.html",
        "templates/launch.html",
        "templates/complete.html",
        "static/robots.txt"
    ]

    for filename in frontend_files:
        src = os.path.join(
            os.path.dirname(os.path.realpath(__file__)),
            "frontend",
            filename)
        shutil.copy(src, os.path.join(dst, filename))

    time.sleep(0.25)

    os.chdir(cwd)

    return (id, dst)
def setup_experiment ( debug = True , verbose = False , app = None ) : print_header ( ) log ( "Verifying that directory is compatible with Wallace..." ) if not verify_package ( verbose = verbose ) : raise AssertionError ( "This is not a valid Wallace app. " + "Fix the errors and then try running 'wallace verify'." ) try : psycopg2 . connect ( database = "x" , user = "postgres" , password = "nada" ) except psycopg2 . OperationalError , e : if "could not connect to server" in str ( e ) : raise RuntimeError ( "The Postgres server isn't running." ) config = PsiturkConfig ( ) config . load_config ( ) try : with open ( "requirements.txt" , "r" ) as f : dependencies = f . readlines ( ) except : dependencies = [ ] pkg_resources . require ( dependencies ) id = "w" + str ( uuid . uuid4 ( ) ) [ 0 : 28 ] if app : id_long = id id = str ( app ) log ( "Running as experiment " + id + "..." ) dst = os . path . join ( tempfile . mkdtemp ( ) , id ) to_ignore = shutil . ignore_patterns ( ".git/*" , "*.db" , "snapshots" , "data" , "server.log" ) shutil . copytree ( os . getcwd ( ) , dst , ignore = to_ignore ) click . echo ( dst ) with open ( os . path . join ( dst , "experiment_id.txt" ) , "w" ) as file : if app : file . write ( id_long ) else : file . write ( id ) if not debug : log ( "Freezing the experiment package..." ) shutil . make_archive ( os . path . join ( "snapshots" , id + "-code" ) , "zip" , dst ) cwd = os . getcwd ( ) os . chdir ( dst ) if not os . path . exists ( "static/scripts" ) : os . makedirs ( "static/scripts" ) if not os . path . exists ( "templates" ) : os . makedirs ( "templates" ) if not os . path . exists ( "static/css" ) : os . makedirs ( "static/css" ) os . rename ( os . path . join ( dst , "experiment.py" ) , os . path . join ( dst , "wallace_experiment.py" ) ) src = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , "custom.py" ) shutil . copy ( src , os . path . join ( dst , "custom.py" ) ) heroku_files = [ "Procfile" , "requirements.txt" , "psiturkapp.py" , "worker.py" , "clock.py" , ] for filename in heroku_files : src = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , "heroku" , filename ) shutil . copy ( src , os . path . join ( dst , filename ) ) clock_on = config . getboolean ( 'Server Parameters' , 'clock_on' ) if not clock_on : src = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , "heroku" , "Procfile_no_clock" ) shutil . copy ( src , os . path . join ( dst , "Procfile" ) ) frontend_files = [ "static/css/wallace.css" , "static/scripts/wallace.js" , "static/scripts/reqwest.min.js" , "templates/error_wallace.html" , "templates/launch.html" , "templates/complete.html" , "static/robots.txt" ] for filename in frontend_files : src = os . path . join ( os . path . dirname ( os . path . realpath ( __file__ ) ) , "frontend" , filename ) shutil . copy ( src , os . path . join ( dst , filename ) ) time . sleep ( 0.25 ) os . chdir ( cwd ) return ( id , dst )
Check the app and, if it's compatible with Wallace, freeze its state.