diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..fe5ae248 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,23 @@ +version: 2.1 +orbs: + codecov: codecov/codecov@4 + +jobs: + build: + docker: + - image: cimg/python:3.10 + steps: + - checkout + - run: + name: Install dependencies + command: pip install -r requirements.txt + - run: + name: Run tests and collect coverage + command: pytest --cov app + - codecov/upload + +workflow: + version: 2.1 + build-test: + jobs: + - build diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..491deae0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: pip + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..15abf468 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: Workflow for Codecov example-python +on: [push, pull_request] +jobs: + run: + runs-on: ubuntu-latest + permissions: + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install dependencies + run: pip install -r requirements.txt + - name: Run tests and collect coverage + run: pytest --cov app + - name: Upload coverage to Codecov (arg token) + uses: codecov/codecov-action@main + with: + fail_ci_if_error: true + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + - name: Upload coverage to Codecov (env token) + uses: codecov/codecov-action@main + with: + fail_ci_if_error: true + verbose: true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + - name: Upload coverage to Codecov (no token) + uses: codecov/codecov-action@main + with: + fail_ci_if_error: true + verbose: true + - name: Upload coverage to Codecov (oidc) + uses: codecov/codecov-action@main + with: + fail_ci_if_error: true + use_oidc: true + verbose: true diff --git a/.github/workflows/enforce-license-compliance.yml b/.github/workflows/enforce-license-compliance.yml new file mode 100644 index 00000000..86be7410 --- /dev/null +++ b/.github/workflows/enforce-license-compliance.yml @@ -0,0 +1,14 @@ +name: Enforce License Compliance + +on: + pull_request: + branches: [main, master] + +jobs: + enforce-license-compliance: + runs-on: ubuntu-latest + steps: + - name: 'Enforce License Compliance' + uses: getsentry/action-enforce-license-compliance@57ba820387a1a9315a46115ee276b2968da51f3d # main + with: + fossa_api_key: ${{ secrets.FOSSA_API_KEY }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c18dd8d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a5342d85..00000000 --- a/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Disable sudo to speed up the build -sudo: false - -# Set the build language to Python -language: python - -# Set the python version to 2.7 -python: 2.7 - -# Install the codecov pip dependency -install: - - pip install codecov - -# Run the unit test -script: - - coverage run tests.py - -# Push the results back to codecov -after_success: - - codecov diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..c341b2a0 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Codecov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4251cc84 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# [Codecov](https://codecov.io) Python Example +[![codecov](https://codecov.io/github/codecov/example-python/branch/main/graph/badge.svg?token=tkq655ROg3)](https://app.codecov.io/github/codecov/example-python) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcodecov%2Fexample-python.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fexample-python?ref=badge_shield) + +This example repository shows how Codecov can be integrated with a simple python project. It uses **GitHub Actions** and **CircleCI** as CI/CD providers and **coverage** as the coverage provider. + +For more information, please see the links below. + +## Links +- [Quick Start](https://docs.codecov.com/docs/quick-start) +- [GitHub Tutorial](https://docs.codecov.com/docs/github-tutorial) +- [Community Boards](https://community.codecov.io) +- [Support](https://codecov.io/support) +- [Documentation](https://docs.codecov.io) + + +## License +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcodecov%2Fexample-python.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fexample-python?ref=badge_large) diff --git a/README.rst b/README.rst deleted file mode 100644 index 4acd89ec..00000000 --- a/README.rst +++ /dev/null @@ -1,163 +0,0 @@ -[Codecov] Python Example -========================= - -.. image:: https://codecov.io/gh/codecov/example-python/branch/master/graph/badge.svg - :target: https://codecov.io/gh/codecov/example-python - - -.. contents:: Topics - - -Overview --------- - - -website: `Codecov `_. - -.. code-block:: shell-session - - # 1) install codecov - pip install codecov - - # 2) next call "codecov" at end of CI build - # public repo using Travis, CircleCI or AppVeyor - codecov - - # all other CI and private repositories - codecov --token= - - -You can alternatively use the environment variables: - -+----------+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ -| Argument | Environment | Description | -+==========+===================+====================================================================================================================================================+ -| ``-t`` | ``CODECOV_TOKEN`` | Private repo token for uploading | -+----------+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ -| ``-e`` | ``CODECOV_ENV`` | List of config vars to store for the build | -+----------+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ -| ``-F`` | | Flag this upload to group coverage reports. Ex. ``unittests`` or ``integration``. `Read the docs `_. | -+----------+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ - - -How to generate coverage reports -================================ - -`coverage.py `_ is required to collect coverage metrics. - -Below are some examples on how to include coverage tracking during your tests. Codecov will call `coverage xml -i` automatically to generate the coverage xml output, which will be archived and processed server side. - -You may need to configure a ``.coveragerc`` file. Learn more `here `_. Start with this `generic .coveragerc `_ for example. - -We highly suggest adding ``source`` to your ``.coveragerc``, which solves a number of issues collecting coverage. - -.. code-block:: ini - - [run] - source=your_package_name - -If there are multiple sources, you instead should add ``include`` to your ``.coveragerc`` - -.. code-block:: ini - - [run] - include=your_package_name/* - -unittests ---------- - -.. code-block:: shell-session - - pip install coverage - coverage run tests.py - -pytest ------- - -.. code-block:: shell-session - - pip install pytest pytest-cov - pytest --cov=./ - -nosetests --------- - - -.. code-block:: shell-session - - nosetests --with-coverage - -See the `Offical Nose coverage docs `_ for more information. - -Testing with ``tox`` -==================== - -Codecov can be run from inside your ``tox.ini`` please make sure you pass all the necessary environment variables through: - -.. code-block:: ini - - [testenv] - passenv = CI TRAVIS TRAVIS_* - deps = codecov - commands = codecov - -See all the environment variables for `other CI providers `_. - - -------- - -Frequently Asked Questions -========================== - -Whats the different between the codecov-bash and codecov-python uploader? -------------------------------------------------------------------------- - -As far as python is concerned, *nothing*. You may choose to use either uploader. Codecov recommends **using the bash uploader when possible** as it supports more unique repository setups. - -Learn more at `codecov/codecov-bash `_ and `codecov/codecov-python `_. - - -Why am I seeing ``No data to report``? --------------------------------------- - -This output is written by running the command ``coverage xml`` and states that there were no ``.coverage`` files found. - -1. Make sure coverage is enabled. See Enabling Coverage -2. You may need to run ``coverage combine`` before running Codecov. -3. Using Docker? Please follow this step: `Testing with Docker `_. - -Can I upload my ``.coverage`` files? ------------------------------------- - -**No**, these files contain coverage data but are not properly mapped back to the source code. We rely on ``coveragepy`` to handle this by calling ``coverage xml`` in the uploader. - -How can I integrate with CI/CD providers? ------------------------------------------ - -Please see the documentation at our `Python repository `_ - - -How do I link to badges? ------------------------- - -Details on the badges and graphs can be found under `settings/Badge `_, for example the following RST can be used: - -.. code-block:: - - .. image:: https://codecov.io/gh/codecov/example-python/branch/master/graph/badge.svg - :target: https://codecov.io/gh/codecov/example-python - - -Which will generate: - -.. image:: https://codecov.io/gh/codecov/example-python/branch/master/graph/badge.svg - :target: https://codecov.io/gh/codecov/example-python - -Links -======= - -* Main website: `Codecov `_. -* Twitter: `@codecov `_. -* Email: `hello@codecov.io `_. - -We are happy to help if you have any questions. Please contact email our Support at `support@codecov.io `_. diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/calculator.py b/app/calculator.py new file mode 100644 index 00000000..4f380e8e --- /dev/null +++ b/app/calculator.py @@ -0,0 +1,16 @@ +class Calculator: + + def add(x, y): + return x + y + + def subtract(x, y): + return x - y + + def multiply(x, y): + return x * y + + def divide(x, y): + if y == 0: + return 'Cannot divide by 0' + return x * 1.0 / y + diff --git a/app/test_calculator.py b/app/test_calculator.py new file mode 100644 index 00000000..f5641938 --- /dev/null +++ b/app/test_calculator.py @@ -0,0 +1,31 @@ +from .calculator import Calculator + + +def test_add(): + assert Calculator.add(1, 2) == 3.0 + assert Calculator.add(1.0, 2.0) == 3.0 + assert Calculator.add(0, 2.0) == 2.0 + assert Calculator.add(2.0, 0) == 2.0 + assert Calculator.add(-4, 2.0) == -2.0 + +def test_subtract(): + assert Calculator.subtract(1, 2) == -1.0 + assert Calculator.subtract(2, 1) == 1.0 + assert Calculator.subtract(1.0, 2.0) == -1.0 + assert Calculator.subtract(0, 2.0) == -2.0 + assert Calculator.subtract(2.0, 0.0) == 2.0 + assert Calculator.subtract(-4, 2.0) == -6.0 + +def test_multiply(): + assert Calculator.multiply(1, 2) == 2.0 + assert Calculator.multiply(1.0, 2.0) == 2.0 + assert Calculator.multiply(0, 2.0) == 0.0 + assert Calculator.multiply(2.0, 0.0) == 0.0 + assert Calculator.multiply(-4, 2.0) == -8.0 + +def test_divide(): + # assert Calculator.divide(1, 2) == 0.5 + assert Calculator.divide(1.0, 2.0) == 0.5 + assert Calculator.divide(0, 2.0) == 0 + assert Calculator.divide(-4, 2.0) == -2.0 + # assert Calculator.divide(2.0, 0.0) == 'Cannot divide by 0' diff --git a/awesome/__init__.py b/awesome/__init__.py deleted file mode 100644 index 4d34acc6..00000000 --- a/awesome/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -def smile(): - return ":)" - -def frown(): - return ":(" diff --git a/bitrise.yml b/bitrise.yml new file mode 100644 index 00000000..a09c296d --- /dev/null +++ b/bitrise.yml @@ -0,0 +1,34 @@ +format_version: "13" +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git +project_type: other +workflows: + primary: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + - git-clone@8: {} + - script@1: + inputs: + - script_file_path: null + - content: | + #!/usr/bin/env bash + set -e + set -o pipefail + set -x # debug log + + pip3 install -r requirements.txt + pytest --cov app + - codecov@3: + inputs: + - OS: macos + - CODECOV_TOKEN: $CODECOV_TOKEN + - deploy-to-bitrise-io@2: {} +meta: + bitrise.io: + stack: osx-xcode-14.3.x-ventura + machine_type_id: g2-m1.4core +trigger_map: +- push_branch: main + workflow: primary +- pull_request_source_branch: '*' + workflow: primary diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..1ed5513f --- /dev/null +++ b/codecov.yml @@ -0,0 +1,13 @@ +flag_management: + individual_flags: + - name: smart-tests + carryforward: true + carryforward_mode: "labels" + statuses: + - type: "project" + - type: "patch" + +cli: + plugins: + pycoverage: + report_type: "json" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..f1e325af --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +attrs==25.3.0 +coverage==7.8.0 +iniconfig==2.1.0 +packaging==24.2 +pluggy==1.5.0 +py==1.11.0 +pyparsing==3.2.3 +pytest==8.3.5 +pytest-cov==6.1.0 +tomli==2.2.1 diff --git a/tests.py b/tests.py deleted file mode 100644 index 92aa2034..00000000 --- a/tests.py +++ /dev/null @@ -1,12 +0,0 @@ -import unittest - -import awesome - - -class TestMethods(unittest.TestCase): - def test_add(self): - self.assertEqual(awesome.smile(), ":)") - - -if __name__ == '__main__': - unittest.main() diff --git a/time.txt b/time.txt deleted file mode 100644 index a9f3b150..00000000 --- a/time.txt +++ /dev/null @@ -1 +0,0 @@ -1585101003