version: 2.1
commands:
  restore_cached_venv:
    description: "Restore a cached venv"
    parameters:
      reqs_checksum:
        type: string
        default: "1234"
      venv_name:
        type: string
        default: "default-name"
    steps:
      - restore_cache:
          keys:
            - << parameters.venv_name >>-venv-<< parameters.reqs_checksum >>
            # fallback to using the latest cache if no exact match is found
            - << parameters.venv_name >>-venv-
  save_cached_venv:
    description: "Save a venv into a cache"
    parameters:
      reqs_checksum:
        type: string
        default: "1234"
      venv_path:
        type: string
        default: "venv"
      venv_name:
        type: string
        default: "default-name"
    steps:
      - save_cache:
          key: << parameters.venv_name >>-venv-<< parameters.reqs_checksum >>
          paths: << parameters.venv_path >>
  restore_pyspec_cached_venv:
    description: "Restore the cache with pyspec keys"
    steps:
      - restore_cached_venv:
          venv_name: v24-pyspec
          reqs_checksum: cache-{{ checksum "setup.py" }}
  save_pyspec_cached_venv:
    description: Save a venv into a cache with pyspec keys"
    steps:
      - save_cached_venv:
          venv_name: v24-pyspec
          reqs_checksum: cache-{{ checksum "setup.py" }}
          venv_path: ./venv
  restore_deposit_contract_tester_cached_venv:
    description: "Restore the venv from cache for the deposit contract tester"
    steps:
      - restore_cached_venv:
          venv_name: v23-deposit-contract-tester
          reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "solidity_deposit_contract/web3_tester/requirements.txt" }}
  save_deposit_contract_tester_cached_venv:
    description: "Save the venv to cache for later use of the deposit contract tester"
    steps:
      - save_cached_venv:
          venv_name: v23-deposit-contract-tester
          reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "solidity_deposit_contract/web3_tester/requirements.txt" }}
          venv_path: ./solidity_deposit_contract/web3_tester/venv
jobs:
  checkout_specs:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      # Restore git repo at point close to target branch/revision, to speed up checkout
      - restore_cache:
          keys:
            - v3-specs-repo-{{ .Branch }}-{{ .Revision }}
            - v3-specs-repo-{{ .Branch }}-
            - v3-specs-repo-
      - checkout
      - run:
          name: Clean up git repo to reduce cache size
          command: git gc
      # Save the git checkout as a cache, to make cloning next time faster.
      - save_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
          paths:
            - ~/specs-repo
  install_pyspec_test:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Install pyspec requirements
          command: make install_test
      - save_pyspec_cached_venv
  test-phase0:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run py-tests
          command: make citest fork=phase0
      - store_test_results:
          path: tests/core/pyspec/test-reports
  test-altair:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run py-tests
          command: make citest fork=altair
      - store_test_results:
          path: tests/core/pyspec/test-reports
  test-bellatrix:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run py-tests
          command: make citest fork=bellatrix
      - store_test_results:
          path: tests/core/pyspec/test-reports
  test-capella:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run py-tests
          command: make citest fork=capella
      - store_test_results:
          path: tests/core/pyspec/test-reports
  test-eip4844:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run py-tests
          command: make citest fork=eip4844
      - store_test_results:
          path: tests/core/pyspec/test-reports
  table_of_contents:
    docker:
      - image: circleci/node:10.16.3
    working_directory: ~/specs-repo
    steps:
      - checkout
      - run:
          name: Check table of contents
          command: sudo npm install -g doctoc@2 && make check_toc
  codespell:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - checkout
      - run:
          name: Check codespell
          command: pip install 'codespell<3.0.0,>=2.0.0' --user &&  make codespell
  lint:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_pyspec_cached_venv
      - run:
          name: Run linter for pyspec
          command: make lint
      - run:
          name: Run linter for test generators
          command: make lint_generators
  build_deposit_contract:
    docker:
      - image: ethereum/solc:0.6.11-alpine
    steps:
      - checkout
      - run:
          name: Install build essentials
          command: |
            apk update
            apk add git make
      - run:
          name: Compile the contract
          command: |
            make compile_deposit_contract
            git diff --color --exit-code
      - persist_to_workspace:
          root: .
          paths:
            - ./solidity_deposit_contract/deposit_contract.json
            - ./build/combined.json
            - ./solidity_deposit_contract/lib
  test_deposit_contract:
    docker:
      - image: nixorg/nix:circleci
    steps:
      - checkout
      - restore_cache:
          key: nix-store-test-v2
      - attach_workspace:
          at: /tmp/
      - run:
          name: Test the contract
          command: |
            mkdir build
            cp -r /tmp/build/* build
            cp -r /tmp/solidity_deposit_contract/lib/* ./solidity_deposit_contract/lib
            cp -r /tmp/solidity_deposit_contract/deposit_contract.json ./solidity_deposit_contract/deposit_contract.json
            nix-shell --command 'make test_deposit_contract' ./solidity_deposit_contract/shell.nix
      - save_cache:
          key: nix-store-test-v2
          paths:
            - /nix
  install_deposit_contract_web3_tester:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_deposit_contract_tester_cached_venv
      - run:
          name: Install deposit contract tester requirements
          command: make install_deposit_contract_web3_tester
      - save_deposit_contract_tester_cached_venv
  test_deposit_contract_web3_tests:
    docker:
      - image: circleci/python:3.8
    working_directory: ~/specs-repo
    steps:
      - restore_cache:
          key: v3-specs-repo-{{ .Branch }}-{{ .Revision }}
      - restore_deposit_contract_tester_cached_venv
      - run:
          name: Run deposit contract test with web3.py
          command: make test_deposit_contract_web3_tests
workflows:
  version: 2.1
  test_spec:
    jobs:
      - checkout_specs
      - install_pyspec_test:
          requires:
            - checkout_specs
      - test-phase0:
          requires:
            - install_pyspec_test
      - test-altair:
          requires:
            - install_pyspec_test
      - test-bellatrix:
          requires:
            - install_pyspec_test
      - test-capella:
          requires:
            - install_pyspec_test
      - test-eip4844:
          requires:
            - install_pyspec_test
      - table_of_contents
      - codespell
      - lint:
          requires:
            - install_pyspec_test
      # NOTE: Since phase 0 has been launched, we disabled the deposit contract tests. 
      # - install_deposit_contract_web3_tester:
      #     requires:
      #       - checkout_specs
      # - test_deposit_contract_web3_tests:
      #     requires:
      #       - install_deposit_contract_web3_tester
  build_and_test_deposit_contract:
    jobs:
      - build_deposit_contract
      # NOTE: Since phase 0 has been launched, we disabled the deposit contract tests.
      # - test_deposit_contract:
      #     requires:
      #       - build_deposit_contract
