Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed a small typo within project.txt #4

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions ANSWER.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import os
import json
import shutil
from subprocess import PIPE, run
import sys


GAME_DIR_PATTERN = "game"
GAME_CODE_EXTENSION = ".go"
GAME_COMPILE_COMMAND = ["go", "build"]


def find_all_game_paths(source):
game_paths = []

for root, dirs, files in os.walk(source):
for directory in dirs:
if GAME_DIR_PATTERN in directory.lower():
path = os.path.join(source, directory)
game_paths.append(path)

break

return game_paths


def get_name_from_paths(paths, to_strip):
new_names = []
for path in paths:
_, dir_name = os.path.split(path)
new_dir_name = dir_name.replace(to_strip, "")
new_names.append(new_dir_name)

return new_names


def create_dir(path):
if not os.path.exists(path):
os.mkdir(path)


def copy_and_overwrite(source, dest):
if os.path.exists(dest):
shutil.rmtree(dest)
shutil.copytree(source, dest)


def make_json_metadata_file(path, game_dirs):
data = {
"gameNames": game_dirs,
"numberOfGames": len(game_dirs)
}

with open(path, "w") as f:
json.dump(data, f)


def compile_game_code(path):
code_file_name = None
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(GAME_CODE_EXTENSION):
code_file_name = file
break

break

if code_file_name is None:
return

command = GAME_COMPILE_COMMAND + [code_file_name]
run_command(command, path)


def run_command(command, path):
cwd = os.getcwd()
os.chdir(path)

result = run(command, stdout=PIPE, stdin=PIPE, universal_newlines=True)
print("compile result", result)

os.chdir(cwd)

def main(source, target):
cwd = os.getcwd()
source_path = os.path.join(cwd, source)
target_path = os.path.join(cwd, target)

game_paths = find_all_game_paths(source_path)
new_game_dirs = get_name_from_paths(game_paths, "_game")

create_dir(target_path)

for src, dest in zip(game_paths, new_game_dirs):
dest_path = os.path.join(target_path, dest)
copy_and_overwrite(src, dest_path)
compile_game_code(dest_path)

json_path = os.path.join(target_path, "metadata.json")
make_json_metadata_file(json_path, new_game_dirs)


if __name__ == "__main__":
args = sys.argv
if len(args) != 3:
raise Exception("You must pass a source and target directory - only.")

source, target = args[1:]
main(source, target)
118 changes: 55 additions & 63 deletions get_game_data.py
Original file line number Diff line number Diff line change
@@ -1,109 +1,101 @@
# importing a bunch of modules for what we're going to use
import os
import json
import shutil
from subprocess import PIPE, run
import sys


'''
Info on the imported modules:

os - operating system
json - how we're going to work with json files
shutil - using copy/overwrite operations
subprocess/PIPE , subprocess/run - allows up to run any terminal command that we want
which we can use to compile and run the GO code
sys - allows us access to the command line arguments
'''

'''We'll be passing arguments for our final project result
python get_game_data.py /data /games_folder
'/data' will be our source directory argument
'/games_folder' will be our dest directory argument

'''
#We create this constant variable to specify the key we're
# looking for when searching directories containing games
GAME_DIR_PATTERN = "game"
GAME_CODE_EXTENSION = ".go"
GAME_COMPILE_COMMAND = ["go", "build"]


def find_all_game_paths(source):
game_paths = []

# os.walk(), recursively looks through root directory, directories, and files
# checkout https://docs.python.org/3/library/os.html for more info
for root, dirs, files in os.walk(source):
for directory in dirs:
if GAME_DIR_PATTERN in directory.lower():
path = os.path.join(source, directory)
game_paths.append(path)

# We only need this to loop once, so we include a break
break

return game_paths


def get_name_from_paths(paths, to_strip):
new_names = []

# os.path.split within this for loop will return both
# the before path and the path we want.
# Since we don't care about the before path, we just use an _ here
for path in paths:
_, dir_name = os.path.split(path)
new_dir_name = dir_name.replace(to_strip, "")
new_names.append(new_dir_name)

return new_names


def create_dir(path):
if not os.path.exists(path):
os.mkdir(path)

def clean_up(path):
if os.path.exists(path):
os.rmdir(path)

def copy_and_overwrite(source, dest):
if os.path.exists(dest):
shutil.rmtree(dest)
shutil.copytree(source, dest)


def make_json_metadata_file(path, game_dirs):
data = {
"gameNames": game_dirs,
"numberOfGames": len(game_dirs)
}

with open(path, "w") as f:
json.dump(data, f)


def compile_game_code(path):
code_file_name = None
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(GAME_CODE_EXTENSION):
code_file_name = file
break

break

if code_file_name is None:
return

command = GAME_COMPILE_COMMAND + [code_file_name]
run_command(command, path)


def run_command(command, path):
cwd = os.getcwd()
os.chdir(path)

result = run(command, stdout=PIPE, stdin=PIPE, universal_newlines=True)
print("compile result", result)

os.chdir(cwd)

def main(source, target):
def main(source, dest):
# Using the os module to get a pwd, then we join it
# with the destination directory
cwd = os.getcwd()
source_path = os.path.join(cwd, source)
target_path = os.path.join(cwd, target)
dest_path = os.path.join(cwd, dest)

game_paths = find_all_game_paths(source_path)
#print(game_paths)
new_game_dirs = get_name_from_paths(game_paths, "_game")
#new_game_dirs = get_name_from_paths(game_paths, GAME_DIR_PATTERN)
print("Game directories: ", new_game_dirs)

create_dir(target_path)

for src, dest in zip(game_paths, new_game_dirs):
dest_path = os.path.join(target_path, dest)
copy_and_overwrite(src, dest_path)
compile_game_code(dest_path)

json_path = os.path.join(target_path, "metadata.json")
make_json_metadata_file(json_path, new_game_dirs)
create_dir(dest_path)

def copy_and_overwrite(source, dest):


# Only want to execute the main script, if we're running this python file directly
# The following line checks if we ran the file directly
# Otherwise, Everything will be run, even if we did not want it to
if __name__ == "__main__":
args = sys.argv
print("arguments: ", args)

#Make sure we have a valid amount of arguments
if len(args) != 3:
raise Exception("You must pass a source and target directory - only.")
raise Exception('You only need to pass a source and destination directory as arguments')

#Save the arguments
source, dest = args[1:]
clean_up(args[2])
main(source, dest)




source, target = args[1:]
main(source, target)
2 changes: 1 addition & 1 deletion project.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Assumptions:

- data directory contains many files and directories
- you are only interested in the games contaiend in this directory
- you are only interested in the games contained in this directory
- each game is stored in a directory that contains the word "game"
- each game directory contains a single .go file that must be compiled before it can be run

Expand Down