diff --git a/tddc/__main__.py b/tddc/__main__.py
index 0749707..208b1c5 100644
--- a/tddc/__main__.py
+++ b/tddc/__main__.py
@@ -1,6 +1,58 @@
+"""Test driven data cleaning
+Usage:
+  tddc summarize <input_file> [--output=<dir>] [--null=<NA>]
+  tddc build_trello <input_file> [--output=<dir>]
+  tddc build <input_file> [--output=<dir>]
+  tddc -h | --help
+  tddc --version
+
+Options:
+  -h --help       Show this screen.
+  --version       Show version.
+  --output=<dir>  Output directory [default: output]
+  --null=<NA>     Null string [default: NA]
+"""
+from docopt import docopt
 import os
 import sys
-import tddc.run_tddc
+
+import tddc
+from tddc import summarize, build_trello, build
+
+
+def get_input_root_dir():
+    return os.getcwd()
+
+
+def get_output_root_dir():
+    return os.getcwd()
+
+
+def execute(cli_args):
+    arguments = docopt(__doc__, cli_args, version=tddc.__version__)
+    if arguments['summarize']:
+        summarize.go(
+            input_root_dir=get_input_root_dir(),
+            input_file=arguments['<input_file>'],
+            output_root_dir=get_output_root_dir(),
+            output_dir=arguments['--output'],
+            null_string=arguments['--null'],
+        )
+    elif arguments['build_trello']:
+        build_trello.go(
+            summary_root_dir=get_input_root_dir(),
+            input_file=arguments['<input_file>'],
+            trello_summary_root_dir=get_output_root_dir(),
+            output_dir=arguments['--output']
+        )
+    elif arguments['build']:
+        build.go(
+            summaries_root_dir=get_input_root_dir(),
+            input_file=arguments['<input_file>'],
+            scripts_root_dir=get_output_root_dir(),
+            output_dir=arguments['--output']
+        )
+
 
 if __name__ == '__main__':
-    tddc.run_tddc.execute(sys.argv[1:])
+    execute(sys.argv[1:])
diff --git a/tddc/run_tddc.py b/tddc/run_tddc.py
index 208b1c5..e69de29 100644
--- a/tddc/run_tddc.py
+++ b/tddc/run_tddc.py
@@ -1,58 +0,0 @@
-"""Test driven data cleaning
-Usage:
-  tddc summarize <input_file> [--output=<dir>] [--null=<NA>]
-  tddc build_trello <input_file> [--output=<dir>]
-  tddc build <input_file> [--output=<dir>]
-  tddc -h | --help
-  tddc --version
-
-Options:
-  -h --help       Show this screen.
-  --version       Show version.
-  --output=<dir>  Output directory [default: output]
-  --null=<NA>     Null string [default: NA]
-"""
-from docopt import docopt
-import os
-import sys
-
-import tddc
-from tddc import summarize, build_trello, build
-
-
-def get_input_root_dir():
-    return os.getcwd()
-
-
-def get_output_root_dir():
-    return os.getcwd()
-
-
-def execute(cli_args):
-    arguments = docopt(__doc__, cli_args, version=tddc.__version__)
-    if arguments['summarize']:
-        summarize.go(
-            input_root_dir=get_input_root_dir(),
-            input_file=arguments['<input_file>'],
-            output_root_dir=get_output_root_dir(),
-            output_dir=arguments['--output'],
-            null_string=arguments['--null'],
-        )
-    elif arguments['build_trello']:
-        build_trello.go(
-            summary_root_dir=get_input_root_dir(),
-            input_file=arguments['<input_file>'],
-            trello_summary_root_dir=get_output_root_dir(),
-            output_dir=arguments['--output']
-        )
-    elif arguments['build']:
-        build.go(
-            summaries_root_dir=get_input_root_dir(),
-            input_file=arguments['<input_file>'],
-            scripts_root_dir=get_output_root_dir(),
-            output_dir=arguments['--output']
-        )
-
-
-if __name__ == '__main__':
-    execute(sys.argv[1:])

run_tddc and __main__ are not both needed
move everything in run_tddc to \_\_main\_\_
diff --git a/tddc/tests/test_run_tddc.py b/tddc/tests/test_main.py
similarity index 83%
rename from tddc/tests/test_run_tddc.py
rename to tddc/tests/test_main.py
index 68ba0d2..a575056 100644
--- a/tddc/tests/test_run_tddc.py
+++ b/tddc/tests/test_main.py
@@ -2,7 +2,7 @@ import pytest
 import os
 from mock import patch
 
-from tddc import run_tddc, common
+from tddc import __main__, common
 
 
 @pytest.fixture(scope='module')
@@ -11,15 +11,15 @@ def root_dir():
 
 
 def test_get_input_root_dir(root_dir):
-    assert run_tddc.get_input_root_dir() == root_dir
+    assert __main__.get_input_root_dir() == root_dir
 
 
 def test_get_output_root_dir(root_dir):
-    assert run_tddc.get_output_root_dir() == root_dir
+    assert __main__.get_output_root_dir() == root_dir
 
 
-@patch('tddc.run_tddc.get_input_root_dir')
-@patch('tddc.run_tddc.get_output_root_dir')
+@patch('tddc.__main__.get_input_root_dir')
+@patch('tddc.__main__.get_output_root_dir')
 def test_cli_summarize(
         mock_output_root_dir, mock_input_root_dir, fixtures_dir, input_filename, null_string, tmpdir
 ):
@@ -37,12 +37,12 @@ def test_cli_summarize(
     # test_summarize.py already tests the content of the file. This just tests that the CLI works properly and
     # generates a file at the expected location.
     assert not os.path.isfile(expected_output_loc)
-    run_tddc.execute(cli_args)
+    __main__.execute(cli_args)
     assert os.path.isfile(expected_output_loc)
 
 
-@patch('tddc.run_tddc.get_input_root_dir')
-@patch('tddc.run_tddc.get_output_root_dir')
+@patch('tddc.__main__.get_input_root_dir')
+@patch('tddc.__main__.get_output_root_dir')
 @patch('tddc.build_trello.Trello.client')
 def test_cli_build_trello(
         mock_client, mock_output_root_dir, mock_input_root_dir, fixtures_dir, input_filename, tmpdir
@@ -64,5 +64,5 @@ def test_cli_build_trello(
     # test_build_trello.py already tests the content of the file. This just tests that the CLI works properly and
     # generates a file at the expected location.
     assert not os.path.isfile(expected_output_loc)
-    run_tddc.execute(cli_args)
+    __main__.execute(cli_args)
     assert os.path.isfile(expected_output_loc)

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov mock
3.5
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
backports.functools-lru-cache==1.2.1
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
docopt==0.6.2
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
mock==5.2.0
oauthlib==3.2.2
packaging==21.3
pluggy==1.0.0
py==1.11.0
py-trello==0.6.1
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
python-dateutil==2.9.0.post0
PyYAML==3.12
requests==2.27.1
requests-oauthlib==2.0.0
six==1.17.0
-e git+https://github.com/DataKind-SG/test-driven-data-cleaning.git@f21e7b563c1e49803a098586930f2e4682eeb06f#egg=tddc
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: test-driven-data-cleaning
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - backports-functools-lru-cache==1.2.1
      - charset-normalizer==2.0.12
      - coverage==6.2
      - docopt==0.6.2
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - mock==5.2.0
      - oauthlib==3.2.2
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - py-trello==0.6.1
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-dateutil==2.9.0.post0
      - pyyaml==3.12
      - requests==2.27.1
      - requests-oauthlib==2.0.0
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/test-driven-data-cleaning

tddc/tests/test_main.py::test_get_input_root_dir tddc/tests/test_main.py::test_get_output_root_dir tddc/tests/test_main.py::test_cli_summarize tddc/tests/test_main.py::test_cli_build_trello
tddc/__main__.py tddc/run_tddc.py
tddc/__main__.py tddc/run_tddc.py