From 9b6b071b821f3ccf7ba21397883d2f11f455285c Mon Sep 17 00:00:00 2001 From: Oisin Date: Tue, 4 Feb 2025 09:22:22 +0000 Subject: [PATCH 1/4] Removed git clone and argument settings from dockerfile --- .github/workflows/dockerhub-main-push.yml | 3 +-- Dockerfile | 10 +++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/dockerhub-main-push.yml b/.github/workflows/dockerhub-main-push.yml index a032044..bed4d7b 100644 --- a/.github/workflows/dockerhub-main-push.yml +++ b/.github/workflows/dockerhub-main-push.yml @@ -23,5 +23,4 @@ jobs: uses: docker/build-push-action@v6 with: push: true - tags: oislen/randomtelecompayments:latest - build-args: GIT_BRANCH=main \ No newline at end of file + tags: oislen/randomtelecompayments:latest \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0b9a0ff..56c54a9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,23 +4,19 @@ FROM ubuntu:latest # set environment variables ENV user=ubuntu ENV DEBIAN_FRONTEND=noninteractive -# set git branch for cloning -ARG GIT_BRANCH -ENV GIT_BRANCH=${GIT_BRANCH} # set python version ARG PYTHON_VERSION="3.12" ENV PYTHON_VERSION=${PYTHON_VERSION} # install required software and programmes for development environment RUN apt-get update -RUN apt-get install -y apt-utils vim curl wget unzip git tree htop +RUN apt-get install -y apt-utils vim curl wget unzip tree htop # set up home environment RUN mkdir -p /home/${user} && chown -R ${user}: /home/${user} -# clone git repo -RUN git clone https://github.com/oislen/RandomTelecomPayments.git --branch ${GIT_BRANCH} /home/ubuntu/RandomTelecomPayments -#COPY . /home/ubuntu/RandomTelecomPayments +# copy repo +COPY . /home/ubuntu/RandomTelecomPayments # add deadsnakes ppa RUN apt-get install -y software-properties-common From b9776e73fc5a69d0f893eff3fe7c105524eaa4dd Mon Sep 17 00:00:00 2001 From: Oisin Date: Tue, 4 Feb 2025 09:37:10 +0000 Subject: [PATCH 2/4] Moved executables into generator directory --- exeGenNames.cmd | 1 - exeMain.cmd | 2 -- exeMain.sh | 2 -- exeUnittests.sh | 3 --- generator/exeGenNames.cmd | 1 + generator/exeMain.cmd | 2 ++ generator/exeMain.sh | 2 ++ exeUnittests.cmd => generator/exeUnittests.cmd | 4 +++- generator/exeUnittests.sh | 5 +++++ 9 files changed, 13 insertions(+), 9 deletions(-) delete mode 100644 exeGenNames.cmd delete mode 100644 exeMain.cmd delete mode 100644 exeMain.sh delete mode 100644 exeUnittests.sh create mode 100644 generator/exeGenNames.cmd create mode 100644 generator/exeMain.cmd create mode 100644 generator/exeMain.sh rename exeUnittests.cmd => generator/exeUnittests.cmd (59%) create mode 100644 generator/exeUnittests.sh diff --git a/exeGenNames.cmd b/exeGenNames.cmd deleted file mode 100644 index 771025c..0000000 --- a/exeGenNames.cmd +++ /dev/null @@ -1 +0,0 @@ -call python -m pdb generator\utilities\gen_user_names_file.py \ No newline at end of file diff --git a/exeMain.cmd b/exeMain.cmd deleted file mode 100644 index a891444..0000000 --- a/exeMain.cmd +++ /dev/null @@ -1,2 +0,0 @@ -call python -m pdb generator/main.py --n_users 100 --use_random_seed 1 --n_itr 1 -:: call python generator/main.py --n_users 13000 --use_random_seed 1 --n_itr 2 \ No newline at end of file diff --git a/exeMain.sh b/exeMain.sh deleted file mode 100644 index ca77c92..0000000 --- a/exeMain.sh +++ /dev/null @@ -1,2 +0,0 @@ -python3 -m pdb generator/main.py --n_users 100 --use_random_seed 1 --n_itr 1 -# python3 generator/main.py --n_users 13000 --use_random_seed 1 --n_itr 2 \ No newline at end of file diff --git a/exeUnittests.sh b/exeUnittests.sh deleted file mode 100644 index e48b782..0000000 --- a/exeUnittests.sh +++ /dev/null @@ -1,3 +0,0 @@ -python3 -m unittest discover generator/unittests/utilities -python3 -m unittest discover generator/unittests/objects -python3 -m unittest discover generator/unittests/app \ No newline at end of file diff --git a/generator/exeGenNames.cmd b/generator/exeGenNames.cmd new file mode 100644 index 0000000..5b0025b --- /dev/null +++ b/generator/exeGenNames.cmd @@ -0,0 +1 @@ +call python -m pdb utilities\gen_user_names_file.py \ No newline at end of file diff --git a/generator/exeMain.cmd b/generator/exeMain.cmd new file mode 100644 index 0000000..1db51e0 --- /dev/null +++ b/generator/exeMain.cmd @@ -0,0 +1,2 @@ +call python -m pdb main.py --n_users 100 --use_random_seed 1 --n_itr 1 +:: call python -m pdb main.py --n_users 13000 --use_random_seed 1 --n_itr 2 \ No newline at end of file diff --git a/generator/exeMain.sh b/generator/exeMain.sh new file mode 100644 index 0000000..89790f9 --- /dev/null +++ b/generator/exeMain.sh @@ -0,0 +1,2 @@ +python3 -m pdb main.py --n_users 100 --use_random_seed 1 --n_itr 1 +# python3 -m pdb main.py --n_users 13000 --use_random_seed 1 --n_itr 2 \ No newline at end of file diff --git a/exeUnittests.cmd b/generator/exeUnittests.cmd similarity index 59% rename from exeUnittests.cmd rename to generator/exeUnittests.cmd index d1c96c1..28e5818 100644 --- a/exeUnittests.cmd +++ b/generator/exeUnittests.cmd @@ -1,3 +1,5 @@ +call cd .. call python -m unittest discover generator\unittests\utilities call python -m unittest discover generator\unittests\objects -call python -m unittest discover generator\unittests\app \ No newline at end of file +call python -m unittest discover generator\unittests\app +call cd generator \ No newline at end of file diff --git a/generator/exeUnittests.sh b/generator/exeUnittests.sh new file mode 100644 index 0000000..4953f25 --- /dev/null +++ b/generator/exeUnittests.sh @@ -0,0 +1,5 @@ +cd .. +python3 -m unittest discover unittests/utilities +python3 -m unittest discover unittests/objects +python3 -m unittest discover unittests/app +cd generator \ No newline at end of file From 975777693529ee80da83acfeca86af00f0cd37a8 Mon Sep 17 00:00:00 2001 From: Oisin Date: Tue, 4 Feb 2025 09:38:31 +0000 Subject: [PATCH 3/4] Removed git branch argument from dockerfile --- exeDocker.cmd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exeDocker.cmd b/exeDocker.cmd index 535b387..0ac8e11 100644 --- a/exeDocker.cmd +++ b/exeDocker.cmd @@ -4,13 +4,12 @@ SET DOCKER_REPO=randomtelecompayments SET DOCKER_TAG=latest SET DOCKER_IMAGE=%DOCKER_USER%/%DOCKER_REPO%:%DOCKER_TAG% SET DOCKER_CONTAINER_NAME=rtp -SET GIT_BRANCH=v0.1.0 :: remove existing docker containers and images docker image rm -f %DOCKER_IMAGE% :: build docker image -call docker build --no-cache -t %DOCKER_IMAGE% . --build-arg GIT_BRANCH=%GIT_BRANCH% +call docker build --no-cache -t %DOCKER_IMAGE% . :: run docker container SET UBUNTU_DIR=/home/ubuntu From 87a1ee0dca8683fad764d64b58a274932601a537 Mon Sep 17 00:00:00 2001 From: Oisin Date: Tue, 4 Feb 2025 10:32:56 +0000 Subject: [PATCH 4/4] Converted pickle unittest data files to parquet files --- data/unittest/transaction_data.parquet | Bin 0 -> 31931 bytes data/unittest/transaction_data.pickle | Bin 209402 -> 0 bytes data/unittest/user_data.parquet | Bin 0 -> 19645 bytes data/unittest/user_data.pickle | Bin 14843 -> 0 bytes generator/cons.py | 4 ++-- .../unittests/app/test_gen_user_trans_data.py | 8 ++++---- 6 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 data/unittest/transaction_data.parquet delete mode 100644 data/unittest/transaction_data.pickle create mode 100644 data/unittest/user_data.parquet delete mode 100644 data/unittest/user_data.pickle diff --git a/data/unittest/transaction_data.parquet b/data/unittest/transaction_data.parquet new file mode 100644 index 0000000000000000000000000000000000000000..1067bf56d9be6cf7eea5a949ac479cc8607d83f8 GIT binary patch literal 31931 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 Q`~Oi-;N7Y){@L>X1EjHz9RL6T literal 0 HcmV?d00001 diff --git a/data/unittest/transaction_data.pickle b/data/unittest/transaction_data.pickle deleted file mode 100644 index 654abf586a8555656aff575b527736657b2a348f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209402 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 B(^&uj diff --git a/data/unittest/user_data.parquet b/data/unittest/user_data.parquet new file mode 100644 index 0000000000000000000000000000000000000000..af449759e52c8ce1d40c2abfac37b138aceb4a1e GIT binary patch literal 19645 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 N`PJcfuWriI{{_Ug!IA&~ diff --git a/generator/cons.py b/generator/cons.py index 0877fc9..c7cebf4 100644 --- a/generator/cons.py +++ b/generator/cons.py @@ -24,8 +24,8 @@ fpath_llama_firstnames = os.path.join(subdir_data, 'ref', 'llama_firstnames.csv') fpath_llama_lastnames = os.path.join(subdir_data, 'ref', 'llama_lastnames.csv') fpath_smartphones = os.path.join(subdir_data, 'ref', 'smartphones.csv') -fpath_unittest_user_data = os.path.join(subdir_unittest, 'user_data.pickle') -fpath_unittest_transaction_data = os.path.join(subdir_unittest, 'transaction_data.pickle') +fpath_unittest_user_data = os.path.join(subdir_unittest, 'user_data.parquet') +fpath_unittest_transaction_data = os.path.join(subdir_unittest, 'transaction_data.parquet') fpath_aws_session_token = os.path.join(subdir_creds,'sessionToken.json') # set url links to files available online diff --git a/generator/unittests/app/test_gen_user_trans_data.py b/generator/unittests/app/test_gen_user_trans_data.py index c158800..07e5df8 100644 --- a/generator/unittests/app/test_gen_user_trans_data.py +++ b/generator/unittests/app/test_gen_user_trans_data.py @@ -88,12 +88,12 @@ # if writing observed data to unittest data directory if cons.unittest_gen_test_dfs: print(f"WARNING: cons.unittest_gen_test_dfs == {cons.unittest_gen_test_dfs}") - obs_user_data.to_pickle(fpath_unittest_user_data) - obs_trans_data.to_pickle(fpath_unittest_transaction_data) + obs_user_data.to_parquet(fpath_unittest_user_data) + obs_trans_data.to_parquet(fpath_unittest_transaction_data) # load in expected user level data -exp_user_data = pd.read_pickle(fpath_unittest_user_data) -exp_trans_data = pd.read_pickle(fpath_unittest_transaction_data) +exp_user_data = pd.read_parquet(fpath_unittest_user_data) +exp_trans_data = pd.read_parquet(fpath_unittest_transaction_data) class Test_gen_user_trans_data(unittest.TestCase): """"""