Repository: microsoft/data-factory-testing-framework (language: python)

Issue:
Consider adding new linting rules (e.g., add new line ad EOF).



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 6882cb32..f5fb9a34 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -1,6 +1,7 @@
+---
 name: CI-CD
 
-on: [push]
+on: [push]  # yamllint disable-line rule:truthy
 
 jobs:
   build:
@@ -8,9 +9,9 @@ jobs:
     permissions:
       contents: read
     steps:
-      #----------------------------------------------
+      # ----------------------------------------------
       #       check-out repo and set-up python
-      #----------------------------------------------
+      # ----------------------------------------------
       - name: Check out repository
         uses: actions/checkout@v3
       - name: Set up python
@@ -18,9 +19,9 @@ jobs:
         uses: actions/setup-python@v4
         with:
           python-version: '3.9'
-      #----------------------------------------------
+      # ----------------------------------------------
       #  -----  install & configure poetry  -----
-      #----------------------------------------------
+      # ----------------------------------------------
       - name: Install Poetry
         uses: snok/install-poetry@v1
         with:
@@ -28,15 +29,15 @@ jobs:
           virtualenvs-in-project: true
           installer-parallel: true
 
-      #----------------------------------------------
+      # ----------------------------------------------
       # install dependencies if cache does not exist
-      #----------------------------------------------
+      # ----------------------------------------------
       - name: Install dependencies
         if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
         run: poetry install --no-interaction --no-root
-      #----------------------------------------------
+      # ----------------------------------------------
       # install your root project, if required
-      #----------------------------------------------
+      # ----------------------------------------------
       - name: Install project
         run: poetry install --no-interaction
       #----------------------------------------------
@@ -51,9 +52,9 @@ jobs:
         run: |
           poetry version 0.0.1.alpha${{ github.run_number}}
           poetry build
-      #----------------------------------------------
+      # ----------------------------------------------
       # upload dist
-      #----------------------------------------------
+      # ----------------------------------------------
       - name: Upload dist
         uses: actions/upload-artifact@v3
         with:
diff --git a/.markdownlint.yaml b/.markdownlint.yaml
new file mode 100644
index 00000000..33d83342
--- /dev/null
+++ b/.markdownlint.yaml
@@ -0,0 +1,3 @@
+---
+MD013:
+  line_length: 120
diff --git a/.markdownlintignore b/.markdownlintignore
new file mode 100644
index 00000000..e419ca01
--- /dev/null
+++ b/.markdownlintignore
@@ -0,0 +1,3 @@
+# ignore Microsoft-generated files
+SECURITY.md
+SUPPORT.md
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 7cccaaba..acc348d6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,24 +1,40 @@
+---
 repos:
--   repo: https://github.com/python-poetry/poetry
+  - repo: https://github.com/python-poetry/poetry
     rev: 1.6.1
     hooks:
-    -   id: poetry-check
+      - id: poetry-check
         args: []
-    -   id: poetry-lock
+      - id: poetry-lock
         args: ["--no-update"]
-- repo: https://github.com/astral-sh/ruff-pre-commit
-  rev: v0.1.5
-  hooks:
-    - id: ruff
-      args: [ --fix ]
-    - id: ruff-format
--   repo: local
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.5.0
     hooks:
-    -   id: pytest
+      - id: end-of-file-fixer
+      - id: trailing-whitespace
+      - id: mixed-line-ending
+        args: [--fix=auto]
+  - repo: https://github.com/adrienverge/yamllint
+    rev: v1.33.0
+    hooks:
+      - id: yamllint
+        args: [--strict]
+  - repo: https://github.com/igorshubovych/markdownlint-cli
+    rev: v0.38.0
+    hooks:
+      - id: markdownlint-fix
+  - repo: https://github.com/astral-sh/ruff-pre-commit
+    rev: v0.1.5
+    hooks:
+      - id: ruff
+        args: [--fix]
+      - id: ruff-format
+  - repo: local
+    hooks:
+      - id: pytest
         name: pytest
         entry: poetry run pytest .
         language: system
         types: [python]
         require_serial: true
         pass_filenames: false
-
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3d9fd61c..af9ff4fe 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,4 +9,4 @@
     "python.testing.cwd": "${workspaceFolder}",
     "python.testing.pytestEnabled": true,
     "python.testing.unittestEnabled": false,
-}
\ No newline at end of file
+}
diff --git a/.yamllint.yaml b/.yamllint.yaml
new file mode 100644
index 00000000..e38b615b
--- /dev/null
+++ b/.yamllint.yaml
@@ -0,0 +1,4 @@
+---
+rules:
+  new-lines:
+    type: platform
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 38fff10f..78636a56 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -24,7 +24,8 @@ poetry run pre-commit run
 
 ### Run Linting
 
-We use Ruff to lint our code as it provides similar rule sets to well-established linters into one (e.g., black, flake8, isort, and pydocstyle).
+We use Ruff to lint our code as it provides similar rule sets to well-established linters into one
+(e.g., black, flake8, isort, and pydocstyle).
 
 To run linting, run the following command:
 
diff --git a/README.md b/README.md
index fdde0a2e..e8671b7f 100644
--- a/README.md
+++ b/README.md
@@ -1,64 +1,80 @@
 # Data Factory - Testing Framework
 
-A test framework that allows you to write unit and functional tests for Data Factory pipelines against the git integrated json resource files.
+A test framework that allows you to write unit and functional tests for Data Factory
+pipelines against the git integrated json resource files.
 
 Supporting currently:
+
 * [Fabric Data Factory](https://learn.microsoft.com/en-us/fabric/data-factory/)
 * [Azure Data Factory v2](https://learn.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities?tabs=data-factory)
 
 Planned:
-* [Azure Synapse Analytics](https://learn.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities?context=%2Fazure%2Fsynapse-analytics%2Fcontext%2Fcontext&tabs=data-factory/)
 
+* [Azure Synapse Analytics](https://learn.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities?context=%2Fazure%2Fsynapse-analytics%2Fcontext%2Fcontext&tabs=data-factory/)
 
 ## Disclaimer
 
-This unit test framework is not officially supported. It is currently in an experimental state and has not been tested with every single data factory resource. It should support all activities out-of-the-box but has not been thoroughly tested, please report any issues in the issues section and include an example of the pipeline that is not working as expected.
+This unit test framework is not officially supported.
+It is currently in an experimental state and has not been tested with every single data factory resource.
+It should support all activities out-of-the-box but has not been thoroughly tested,
+please report any issues in the issues section and include an example of the pipeline that is not working as expected.
 
-If there's a lot of interest in this framework, then we will continue to improve it and move it to a production-ready state. 
+If there's a lot of interest in this framework, then we will continue to improve it and move it to a production-ready state.
 
 ## Features
 
 Goal: Validate that the evaluated pipeline configuration with its expressions is behaving as expected on runtime.
 
 1. Evaluate expressions with their functions and arguments instantly by using the framework's internal expression parser.
-2. Test a pipeline or activity against any state to assert the expected outcome. A state can be configured with pipeline parameters, global parameters, variables and activity outputs.
+2. Test a pipeline or activity against any state to assert the expected outcome.
+   A state can be configured with pipeline parameters, global parameters, variables and activity outputs.
 3. Simulate a pipeline run and evaluate the execution flow and outcome of each activity.
 4. Dynamically supports all activity types with all their attributes.
 
-> Pipelines and activities are not executed on any Data Factory environment, but the evaluation of the pipeline configuration is validated locally. This is different from the "validation" functionality present in the UI, which only validates the syntax of the pipeline configuration.
-
+> Pipelines and activities are not executed on any Data Factory environment,
+> but the evaluation of the pipeline configuration is validated locally.
+> This is different from the "validation" functionality present in the UI,
+> which only validates the syntax of the pipeline configuration.
 
 ## Why
 
-Data Factory does not support unit testing out of the box. The only way to validate your changes is through manual testing or running e2e tests against a deployed data factory. These tests are great to have, but miss the following benefits that unit tests, like using this unit test framework, provide:
+Data Factory does not support unit testing out of the box.
+The only way to validate your changes is through manual testing or running e2e tests against a deployed data factory.
+These tests are great to have, but miss the following benefits that unit tests, like using this unit test framework, provide:
 
-* Shift left with immediate feedback on changes - Evaluate any individual data factory resource (pipelines, activities, triggers, datasets, linked services etc..), including (complex) expressions
+* Shift left with immediate feedback on changes - Evaluate any individual data factory resource
+  (pipelines, activities, triggers, datasets, linked services etc..), including (complex) expressions
 * Allows testing individual resources (e.g. activity) for many different input values to cover more scenarios.
-* Less issues in production - due to the fast nature of writing and running unit tests, you will write more tests in less time and therefore have a higher test coverage. This means more confidence in new changes, fewer risks in breaking existing features (regression tests), and thus far fewer issues in production.
+* Less issues in production - due to the fast nature of writing and running unit tests,
+  you will write more tests in less time and therefore have a higher test coverage.
+  This means more confidence in new changes, fewer risks in breaking existing features (regression tests),
+  and thus far fewer issues in production.
 
-> Even though Data Factory is UI-driven writing unit tests, and might not be in the nature of it. How can you be confident that your changes will work as expected, and that existing pipelines will not break, without writing unit tests?
+> Even though Data Factory is UI-driven writing unit tests, and might not be in the nature of it.
+> How can you be confident that your changes will work as expected,
+> and that existing pipelines will not break, without writing unit tests?
 
 ## Getting started
 
 1. Set up an empty Python project with your favorite testing library
-   
-   More information: 
+
+   More information:
    [docs_Setup](/docs/environment_setup/unit_test_setup.md)
-   
+
 2. Install the package using your preferred package manager:
-   
+
     Pip: `pip install data-factory-testing-framework`
-   
+
 3. Create a Folder in your project and copy the JSON Files with the pipeline definitions locally.
-   
-   More information: 
+
+   More information:
    [docs Json](/docs/environment_setup/json_pipeline_files.md)
-  
+
 4. Start writing tests
 
 ## Features - Examples
 
-The samples seen below are the _only_ code that you need to write! The framework will take care of the rest. 
+The samples seen below are the _only_ code that you need to write! The framework will take care of the rest.
 
 1. Evaluate activities (e.g. a WebActivity that calls Azure Batch API)
 
@@ -86,53 +102,53 @@ The samples seen below are the _only_ code that you need to write! The framework
     assert "Job-123" == body["JobName"]
     assert "version1" == body["Version"]
    ```
-   
-   2. Evaluate Pipelines and test the flow of activities given a specific input
-
-       ```python
-       # Arrange
-       pipeline: PipelineResource = test_framework.repository.get_pipeline_by_name("batch_job")
-
-       # Runs the pipeline with the provided parameters
-       activities = test_framework.evaluate_pipeline(pipeline, [
-           RunParameter(RunParameterType.Pipeline, "JobId", "123"),
-           RunParameter(RunParameterType.Pipeline, "ContainerName", "test-container"),
-           RunParameter(RunParameterType.Global, "BaseUrl", "https://example.com"),
-       ])
-
-       set_variable_activity: Activity = next(activities)
-       assert set_variable_activity is not None
-       assert "Set JobName" == set_variable_activity.name
-       assert "JobName" == activity.type_properties["variableName"]
-       assert "Job-123" == activity.type_properties["value"].value
-
-       get_version_activity = next(activities)
-       assert get_version_activity is not None
-       assert "Get version" == get_version_activity.name
-       assert "https://example.com/version" == get_version_activity.type_properties["url"].value
-       assert "GET" == get_version_activity.type_properties["method"]
-       get_version_activity.set_result(DependencyCondition.Succeeded,{"Version": "version1"})
-
-       create_batch_activity = next(activities)
-       assert create_batch_activity is not None
-       assert "Trigger Azure Batch Job" == create_batch_activity.name
-       assert "https://example.com/jobs" == create_batch_activity.type_properties["url"].value
-       assert "POST" == create_batch_activity.type_properties["method"]
-       body = create_batch_activity.type_properties["body"].get_json_value()
-       assert "123" == body["JobId"]
-       assert "Job-123" == body["JobName"]
-       assert "version1" == body["Version"]
-
-       with pytest.raises(StopIteration):
-           next(activities)
-       ```
-   
-> See the [Examples](/examples) folder for more samples 
 
+2. Evaluate Pipelines and test the flow of activities given a specific input
+
+    ```python
+    # Arrange
+    pipeline: PipelineResource = test_framework.repository.get_pipeline_by_name("batch_job")
+
+    # Runs the pipeline with the provided parameters
+    activities = test_framework.evaluate_pipeline(pipeline, [
+        RunParameter(RunParameterType.Pipeline, "JobId", "123"),
+        RunParameter(RunParameterType.Pipeline, "ContainerName", "test-container"),
+        RunParameter(RunParameterType.Global, "BaseUrl", "https://example.com"),
+    ])
+
+    set_variable_activity: Activity = next(activities)
+    assert set_variable_activity is not None
+    assert "Set JobName" == set_variable_activity.name
+    assert "JobName" == activity.type_properties["variableName"]
+    assert "Job-123" == activity.type_properties["value"].value
+
+    get_version_activity = next(activities)
+    assert get_version_activity is not None
+    assert "Get version" == get_version_activity.name
+    assert "https://example.com/version" == get_version_activity.type_properties["url"].value
+    assert "GET" == get_version_activity.type_properties["method"]
+    get_version_activity.set_result(DependencyCondition.Succeeded,{"Version": "version1"})
+
+    create_batch_activity = next(activities)
+    assert create_batch_activity is not None
+    assert "Trigger Azure Batch Job" == create_batch_activity.name
+    assert "https://example.com/jobs" == create_batch_activity.type_properties["url"].value
+    assert "POST" == create_batch_activity.type_properties["method"]
+    body = create_batch_activity.type_properties["body"].get_json_value()
+    assert "123" == body["JobId"]
+    assert "Job-123" == body["JobName"]
+    assert "version1" == body["Version"]
+
+    with pytest.raises(StopIteration):
+        next(activities)
+    ```
+
+> See the [Examples](/examples) folder for more samples
 
 ## Registering missing expression functions
 
-As the framework is interpreting expressions containing functions, these functions are implemented in the framework, but there may be bugs in some of them. You can override their implementation through:
+As the framework is interpreting expressions containing functions, these functions are implemented in the framework,
+but there may be bugs in some of them. You can override their implementation through:
 
 ```python
    FunctionsRepository.register("concat", lambda arguments: "".join(arguments))
@@ -141,7 +157,8 @@ As the framework is interpreting expressions containing functions, these functio
 
 ## Tips
 
-1. After parsing a data factory resource file, you can use the debugger to easily discover which classes are actually initialized so that you can cast them to the correct type.
+1. After parsing a data factory resource file, you can use the debugger to easily discover which classes are actually
+   initialized so that you can cast them to the correct type.
 
 ## Recommended development workflow for Azure Data Factory v2
 
@@ -160,7 +177,7 @@ As the framework is interpreting expressions containing functions, these functio
 
 This project welcomes contributions and suggestions.  Most contributions require you to agree to a
 Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
-the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
+the rights to use your contribution. For details, visit <https://cla.opensource.microsoft.com>.
 
 When you submit a pull request, a CLA bot will automatically determine whether you need to provide
 a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
@@ -177,7 +194,3 @@ trademarks or logos is subject to and must follow
 [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).
 Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.
 Any use of third-party trademarks or logos are subject to those third-party's policies.
-
-
-
-
diff --git a/SECURITY.md b/SECURITY.md
index e138ec5d..9dc63164 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -14,7 +14,7 @@ Instead, please report them to the Microsoft Security Response Center (MSRC) at
 
 If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
 
-You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 
+You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
 
 Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
 
diff --git a/SUPPORT.md b/SUPPORT.md
index 0a4fc2db..e6bad19e 100644
--- a/SUPPORT.md
+++ b/SUPPORT.md
@@ -1,13 +1,13 @@
 # Support
 
-## How to file issues and get help  
+## How to file issues and get help
 
-This project uses GitHub Issues to track bugs and feature requests. Please search the existing 
-issues before filing new issues to avoid duplicates.  For new issues, file your bug or 
+This project uses GitHub Issues to track bugs and feature requests. Please search the existing
+issues before filing new issues to avoid duplicates.  For new issues, file your bug or
 feature request as a new Issue.
 
 For help and questions about using this project, feel free ask your question via GitHub issues. In the future we will think about other channels.
 
-## Microsoft Support Policy  
+## Microsoft Support Policy
 
 Support for this **PROJECT or PRODUCT** is limited to the resources listed above.
diff --git a/docs/environment_setup/json_pipeline_files.md b/docs/environment_setup/json_pipeline_files.md
index c83dc65b..bb7961f7 100644
--- a/docs/environment_setup/json_pipeline_files.md
+++ b/docs/environment_setup/json_pipeline_files.md
@@ -2,7 +2,9 @@
 
 ## JSON Files
 
-Ideally, you would integrate your project with a repository such as GIT. Once this is done you will have the JSON files for the Pipelines. If you need extra guidance on that the Microsoft Documentation provides very detailed information on how to do it:
+Ideally, you would integrate your project with a repository such as GIT.
+Once this is done you will have the JSON files for the Pipelines.
+If you need extra guidance on that the Microsoft Documentation provides very detailed information on how to do it:
 
 Fabric
 [Git integration process - Microsoft Fabric | Microsoft Learn](https://learn.microsoft.com/en-us/fabric/cicd/git-integration/git-integration-process)
@@ -11,9 +13,11 @@ ADF
 [Source control - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/azure/data-factory/source-control)
 
 ### Manual steps for testing purposes
-If you want just download one JSON file for a small test purpose and check how the framework works, here are some ideas on how to do it:
 
-#### ADF 
+If you want just download one JSON file for a small test purpose and check how the framework works,
+here are some ideas on how to do it:
+
+#### ADF
 
 Refer to the docs if needed: [Azure Data Factory Documentation - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/en-us/azure/data-factory/)
 
@@ -27,8 +31,4 @@ Refer to the docs if needed: [Azure Data Factory Documentation - Azure Data Fact
 
 4. The Zip file contains the JSON Definition
 
-
    ![image](/docs/environment_setup/images/download_support_files.png)
- 
-
-   
diff --git a/examples/data_factory/batch_job/README.md b/examples/data_factory/batch_job/README.md
index ef8a3111..51057c45 100644
--- a/examples/data_factory/batch_job/README.md
+++ b/examples/data_factory/batch_job/README.md
@@ -1,6 +1,7 @@
 # Batch Job
 
-This pipeline is an example on how a batch job can be triggered from an Azure Data Factory pipeline. It configures a set of variables, create a storage container to be used by the batch job, trigger the job, monitors it, once complete it moves the output files to another storage account and finally deletes the storage container.
+This pipeline is an example on how a batch job can be triggered from an Azure Data Factory pipeline.
+It configures a set of variables, create a storage container to be used by the batch job, trigger the job, monitors it,
+once complete it moves the output files to another storage account and finally deletes the storage container.
 
 ![img.png](img.png)
-
diff --git a/examples/data_factory/batch_job/pipeline/batch_job.json b/examples/data_factory/batch_job/pipeline/batch_job.json
index 243389d6..a8383a32 100644
--- a/examples/data_factory/batch_job/pipeline/batch_job.json
+++ b/examples/data_factory/batch_job/pipeline/batch_job.json
@@ -395,4 +395,4 @@
     },
     "annotations": []
   }
-}
\ No newline at end of file
+}
diff --git a/examples/data_factory/copy_blobs/README.md b/examples/data_factory/copy_blobs/README.md
index 8b4e03fb..83c4f396 100644
--- a/examples/data_factory/copy_blobs/README.md
+++ b/examples/data_factory/copy_blobs/README.md
@@ -2,7 +2,7 @@
 
 This is an example pipeline which intends to list all the blobs in a given container and copies these blobs to another container
 
-<image src="copy_blobs.png"></img>
+![image](copy_blobs.png)
 
 The pipeline has two activities:
 
diff --git a/examples/data_factory/copy_blobs/pipeline/copy_blobs.json b/examples/data_factory/copy_blobs/pipeline/copy_blobs.json
index 2db973d9..b150d6bc 100644
--- a/examples/data_factory/copy_blobs/pipeline/copy_blobs.json
+++ b/examples/data_factory/copy_blobs/pipeline/copy_blobs.json
@@ -150,4 +150,4 @@
 		},
 		"annotations": []
 	}
-}
\ No newline at end of file
+}
diff --git a/examples/fabric/batch_job/item.metadata.json b/examples/fabric/batch_job/item.metadata.json
index 4a0dd642..0fdce52a 100644
--- a/examples/fabric/batch_job/item.metadata.json
+++ b/examples/fabric/batch_job/item.metadata.json
@@ -1,4 +1,4 @@
 {
   "type": "Pipeline",
   "displayName": "batch_job"
-}
\ No newline at end of file
+}
diff --git a/examples/fabric/batch_job/pipeline-content.json b/examples/fabric/batch_job/pipeline-content.json
index ef848f6a..3dfae83e 100644
--- a/examples/fabric/batch_job/pipeline-content.json
+++ b/examples/fabric/batch_job/pipeline-content.json
@@ -386,4 +386,4 @@
     },
     "annotations": []
   }
-}
\ No newline at end of file
+}
diff --git a/pyproject.toml b/pyproject.toml
index 310e7b67..8f0da7dd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -37,7 +37,7 @@ select = [
     "B", # bugbear
     "COM", # flake8 commas
     "D", # Pydoc style docstrings
-    "E", # PEP8 conventions 
+    "E", # PEP8 conventions
     "F", # pyflakes
     "N", # PEP8 naming conventions
     "I"


Test patch:
diff --git a/docs/environment_setup/unit_test_setup.md b/docs/environment_setup/unit_test_setup.md
index 075c9ba6..87053309 100644
--- a/docs/environment_setup/unit_test_setup.md
+++ b/docs/environment_setup/unit_test_setup.md
@@ -1,10 +1,14 @@
 # Data Factory - Testing Framework
 
-## Setup 
+## Setup
 
-This is an extra step for setup in case you need additional help to do it. The Unit Test does not need to rigorously  follow these steps to work. You just need to start your Python project, choose your testing library, and start to code. Though, if you need additional assistance how to do it which library to use, and some code examples. Feel free to use this guide. 
+This is an extra step for setup in case you need additional help to do it.
+The Unit Test does not need to rigorously follow these steps to work.
+You just need to start your Python project, choose your testing library, and start to code.
+Though, if you need additional assistance how to do it which library to use, and some code examples.
+Feel free to use this guide.
 
-### Step by Step 
+### Step by Step
 
 If for example you are using Visual Studio Code:
 
@@ -12,71 +16,64 @@ For more references: [Get Started Tutorial for Python in Visual Studio Code](htt
 
 1. Open your new Python project.
 
-
-![image](/docs/environment_setup/images/new_project.png)
-
+   ![image](/docs/environment_setup/images/new_project.png)
 
 2. Pip install the following libraries from the terminal - data-factory-testing-framework:
 
    References about the vs code terminal : [Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/terminal/basics)
-  
+
 **Then data-factory-testing-framework:**
-   
+
    ```python
    pip install data-factory-testing-framework
    ```
 
 ### Additional Libraries
 
-**Additionally** you could use for example <u>pytest even another</u> test library that you prefer for the Unit test: 
+**Additionally** you could use for example *pytest even another* test library that you prefer for the Unit test:
 
 ```python
 pip install pytest
 ```
+
 You could also use Poetry as a package management library:
 
 ```python
 pip install poetry
 ```
 
-Library Docs for reference: 
+Library Docs for reference:
 
 [Introduction | Documentation | Poetry - Python dependency management and packaging made easy (python-poetry.org)](https://python-poetry.org/docs/)
 
 [pytest: helps you write better programs — pytest documentation](https://docs.pytest.org/en/7.4.x/)
 
-
 ![image](/docs/environment_setup/images/pipinstall_poetry.png)
 
-#### Poetry Configuration - steps 
-
-1. If you decide to use poetry(this is optional), please follow some additional steps to configure. Also, please consider using this reference for more information: [Introduction | Documentation | Poetry - Python dependency management and packaging made easy (python-poetry.org)](https://python-poetry.org/docs/#installation)
-
+#### Poetry Configuration - steps
 
-Run the following on the power shell, if you are using Windows:
+1. If you decide to use poetry(this is optional), please follow some additional steps to configure.
+   Also, please consider using this reference for more information:
+   [Introduction | Documentation | Poetry - Python dependency management and packaging made easy (python-poetry.org)](https://python-poetry.org/docs/#installation)
 
-```
-(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python
-```
-
-![image](/docs/environment_setup/images/power_shell_invoke.png)
+   Run the following on the power shell, if you are using Windows:
 
+   ```powershell
+   (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python
+   ```
 
-![image](/docs/environment_setup/images/installing_poetry_power_shell.png)
+   ![image](/docs/environment_setup/images/power_shell_invoke.png)
 
+   ![image](/docs/environment_setup/images/installing_poetry_power_shell.png)
 
 2. Add the bin to the PATH environment variable to the path
 
+   ![image](/docs/environment_setup/images/env_variable.png)
 
-![image](/docs/environment_setup/images/env_variable.png)
-
-
-3. Add the unit test framework for testing. 
-
-`poetry add data-factory-testing-framework`poetry 
-
+3. Add the unit test framework for testing.
 
-![image](/docs/environment_setup/images/poetry_framework.png)
+   `poetry add data-factory-testing-framework`poetry
 
+   ![image](/docs/environment_setup/images/poetry_framework.png)
 
-Let's Start testing!
+   Let's Start testing!
diff --git a/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_functional.py b/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_functional.py
index 6171429d..535faf37 100644
--- a/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_functional.py
+++ b/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_functional.py
@@ -39,10 +39,10 @@ def test_copy_blobs_pipeline(request: pytest.FixtureRequest) -> None:
         result=DependencyCondition.SUCCEEDED,
         output={
             "Response": """
-                    <EnumerationResults ServiceEndpoint="http://myaccount.blob.core.windows.net/"  ContainerName="mycontainer">  
-                        <Prefix>testfolder</Prefix>  
-                        <Delimiter>$SourceBlobDelimiter</Delimiter>  
-                        <Blobs>  
+                    <EnumerationResults ServiceEndpoint="http://myaccount.blob.core.windows.net/"  ContainerName="mycontainer">
+                        <Prefix>testfolder</Prefix>
+                        <Delimiter>$SourceBlobDelimiter</Delimiter>
+                        <Blobs>
                             <BlobPrefix>
                                 <Name>testfolder_1/$SourceBlobDelimiter</Name>
                             </BlobPrefix>
diff --git a/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_unit.py b/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_unit.py
index e70a551b..826d24b8 100644
--- a/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_unit.py
+++ b/examples/data_factory/copy_blobs/test_data_factory_copy_blobs_unit.py
@@ -72,10 +72,10 @@ def test_for_each(pipeline: Pipeline) -> None:
         status="Succeeded",
         output={
             "Response": """
-                    <EnumerationResults ServiceEndpoint="http://myaccount.blob.core.windows.net/"  ContainerName="mycontainer">  
-                        <Prefix>testfolder</Prefix>  
-                        <Delimiter>$SourceBlobDelimiter</Delimiter>  
-                        <Blobs>  
+                    <EnumerationResults ServiceEndpoint="http://myaccount.blob.core.windows.net/"  ContainerName="mycontainer">
+                        <Prefix>testfolder</Prefix>
+                        <Delimiter>$SourceBlobDelimiter</Delimiter>
+                        <Blobs>
                             <BlobPrefix>
                                 <Name>testfolder_1/$SourceBlobDelimiter</Name>
                             </BlobPrefix>
diff --git a/src/data_factory_testing_framework/functions/expression_evaluator.py b/src/data_factory_testing_framework/functions/expression_evaluator.py
index d0ba35f0..525b460e 100644
--- a/src/data_factory_testing_framework/functions/expression_evaluator.py
+++ b/src/data_factory_testing_framework/functions/expression_evaluator.py
@@ -40,7 +40,7 @@ def __init__(self) -> None:
             // TODO: add support for array index
             ?expression_start: expression_evaluation
             expression_evaluation: expression_call [expression_object_accessor]*
-            ?expression_call: expression_function_call 
+            ?expression_call: expression_function_call
                                     | expression_pipeline_reference
                                     | expression_variable_reference
                                     | expression_activity_reference
@@ -58,12 +58,12 @@ def __init__(self) -> None:
             expression_linked_service_reference: "linkedService" "()" "." EXPRESSION_PARAMETER_NAME
             expression_item_reference: "item" "()"
             expression_system_variable_reference: "pipeline" "()" "." EXPRESSION_SYSTEM_VARIABLE_NAME
-            
+
             // function call rules
             expression_function_call: EXPRESSION_FUNCTION_NAME  "(" [expression_function_parameters] ")"
             expression_function_parameters: expression_parameter ("," expression_parameter )*
             expression_parameter: EXPRESSION_WS* (EXPRESSION_NULL | EXPRESSION_INTEGER | EXPRESSION_FLOAT | EXPRESSION_BOOLEAN | EXPRESSION_STRING | expression_start) EXPRESSION_WS*
-            
+
             // expression terminals
             // EXPRESSION_PIPELINE_PROPERTY requires higher priority, because it clashes with pipeline().system_variable.field in the rule: expression_pipeline_reference
             EXPRESSION_PIPELINE_PROPERTY.2: "parameters" | "globalParameters"
@@ -83,7 +83,7 @@ def __init__(self) -> None:
 
         base_grammar = """
             ?start: ("@" expression_start) | (["@@"] literal_start) | (literal_interpolation)
-            
+
             // shared custom basic data type rules:
             ARRAY_INDEX: "[" /[0-9]+/ "]"
             NULL: "null"
diff --git a/tests/functional/activity_outputs/item.metadata.json b/tests/functional/activity_outputs/item.metadata.json
index d462369f..a0d9b364 100644
--- a/tests/functional/activity_outputs/item.metadata.json
+++ b/tests/functional/activity_outputs/item.metadata.json
@@ -1,4 +1,4 @@
 {
   "type": "Pipeline",
   "displayName": "set_version"
-}
\ No newline at end of file
+}
diff --git a/tests/functional/activity_outputs/pipeline-content.json b/tests/functional/activity_outputs/pipeline-content.json
index c35c6863..85b4370c 100644
--- a/tests/functional/activity_outputs/pipeline-content.json
+++ b/tests/functional/activity_outputs/pipeline-content.json
@@ -55,4 +55,4 @@
         },
         "annotations": []
     }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/append_variable_pipeline/item.metadata.json b/tests/functional/append_variable_pipeline/item.metadata.json
index 1987685b..5613af65 100644
--- a/tests/functional/append_variable_pipeline/item.metadata.json
+++ b/tests/functional/append_variable_pipeline/item.metadata.json
@@ -1,4 +1,4 @@
 {
   "type": "Pipeline",
   "displayName": "append-variable-test"
-}
\ No newline at end of file
+}
diff --git a/tests/functional/append_variable_pipeline/pipeline-content.json b/tests/functional/append_variable_pipeline/pipeline-content.json
index 299e2290..afe8a5ff 100644
--- a/tests/functional/append_variable_pipeline/pipeline-content.json
+++ b/tests/functional/append_variable_pipeline/pipeline-content.json
@@ -55,4 +55,4 @@
     },
     "annotations": []
   }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/execute_child_pipeline/pipeline/child.json b/tests/functional/execute_child_pipeline/pipeline/child.json
index 9ad9931c..6b5ce0fa 100644
--- a/tests/functional/execute_child_pipeline/pipeline/child.json
+++ b/tests/functional/execute_child_pipeline/pipeline/child.json
@@ -40,4 +40,4 @@
     },
     "annotations": []
   }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/execute_child_pipeline/pipeline/main.json b/tests/functional/execute_child_pipeline/pipeline/main.json
index ef4f6d3a..9454e2cd 100644
--- a/tests/functional/execute_child_pipeline/pipeline/main.json
+++ b/tests/functional/execute_child_pipeline/pipeline/main.json
@@ -39,4 +39,4 @@
     },
     "annotations": []
   }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/filter_activity_pipeline/item.metadata.json b/tests/functional/filter_activity_pipeline/item.metadata.json
index 85976989..d9a789eb 100644
--- a/tests/functional/filter_activity_pipeline/item.metadata.json
+++ b/tests/functional/filter_activity_pipeline/item.metadata.json
@@ -1,4 +1,4 @@
 {
   "type": "Pipeline",
   "displayName": "filter-test"
-}
\ No newline at end of file
+}
diff --git a/tests/functional/filter_activity_pipeline/pipeline-content.json b/tests/functional/filter_activity_pipeline/pipeline-content.json
index 14d63985..33138dc9 100644
--- a/tests/functional/filter_activity_pipeline/pipeline-content.json
+++ b/tests/functional/filter_activity_pipeline/pipeline-content.json
@@ -60,4 +60,4 @@
         },
         "annotations": []
     }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/switch_activity_pipeline/item.metadata.json b/tests/functional/switch_activity_pipeline/item.metadata.json
index d3aca3f1..cc949a39 100644
--- a/tests/functional/switch_activity_pipeline/item.metadata.json
+++ b/tests/functional/switch_activity_pipeline/item.metadata.json
@@ -1,4 +1,4 @@
 {
   "type": "Pipeline",
   "displayName": "switchtest"
-}
\ No newline at end of file
+}
diff --git a/tests/functional/switch_activity_pipeline/pipeline-content.json b/tests/functional/switch_activity_pipeline/pipeline-content.json
index 178caac1..d5bc11f4 100644
--- a/tests/functional/switch_activity_pipeline/pipeline-content.json
+++ b/tests/functional/switch_activity_pipeline/pipeline-content.json
@@ -83,4 +83,4 @@
         "lastModifiedByObjectId": "80311eb5-b33b-4d7f-bfa3-879f8c8261c1",
         "lastPublishTime": "2023-11-23T08:44:44Z"
     }
-}
\ No newline at end of file
+}