Repository: QuantConnect/lean-cli
Pull request #448 (2024-04-19 21:57:47)

Pep8 python create project
- Sanity tested backtest/research, creating, adding and using library project


Patch:
diff --git a/lean/commands/create_project.py b/lean/commands/create_project.py
index eb1a724..58420f8 100644
--- a/lean/commands/create_project.py
+++ b/lean/commands/create_project.py
@@ -29,21 +29,21 @@ from AlgorithmImports import *
 
 class $CLASS_NAME$(QCAlgorithm):
 
-    def Initialize(self):
+    def initialize(self):
         # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data
-        self.SetStartDate(2013, 10, 7)  # Set Start Date
-        self.SetEndDate(2013, 10, 11)  # Set End Date
-        self.SetCash(100000)  # Set Strategy Cash
-        self.AddEquity("SPY", Resolution.Minute)
+        self.set_start_date(2013, 10, 7)  # Set Start Date
+        self.set_end_date(2013, 10, 11)  # Set End Date
+        self.set_cash(100000)  # Set Strategy Cash
+        self.add_equity("SPY", Resolution.MINUTE)
 
-    def OnData(self, data: Slice):
-        """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
+    def on_data(self, data: Slice):
+        """on_data event is the primary entry point for your algorithm. Each new data point will be pumped in here.
             Arguments:
                 data: Slice object keyed by symbol containing the stock data
         """
-        if not self.Portfolio.Invested:
-            self.SetHoldings("SPY", 1)
-            self.Debug("Purchased Stock")
+        if not self.portfolio.invested:
+            self.set_holdings("SPY", 1)
+            self.debug("Purchased Stock")
 '''.strip() + "\n"
 
 LIBRARY_PYTHON_MAIN = '''
@@ -61,11 +61,11 @@ from AlgorithmImports import *
 ### Example using your newly imported library from 'Library.py' like so:
 ###
 ### from $PROJECT_NAME$ import Library
-### x = Library.Add(1,1)
+### x = Library.add(1,1)
 ### print(x)
 ###
 
-def Add(a: int, b: int):
+def add(a: int, b: int):
     return a + b
 '''.strip() + "\n"
 
@@ -89,13 +89,13 @@ DEFAULT_PYTHON_NOTEBOOK = """
                 "# QuantBook Analysis Tool \\n",
                 "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",
                 "qb = QuantBook()\\n",
-                "spy = qb.AddEquity(\\"SPY\\")\\n",
+                "spy = qb.add_equity(\\"SPY\\")\\n",
                 "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",
-                "qb.SetStartDate(2013, 10, 11)\\n",
-                "history = qb.History(qb.Securities.Keys, 360, Resolution.Daily)\\n",
+                "qb.set_start_date(2013, 10, 11)\\n",
+                "history = qb.history(qb.securities.keys(), 360, Resolution.DAILY)\\n",
                 "\\n",
                 "# Indicator Analysis\\n",
-                "bbdf = qb.Indicator(BollingerBands(30, 2), spy.Symbol, 360, Resolution.Daily)\\n",
+                "bbdf = qb.indicator(BollingerBands(30, 2), spy.symbol, 360, Resolution.DAILY)\\n",
                 "bbdf.drop('standarddeviation', axis=1).plot()"
             ]
         }


Test patch:
diff --git a/tests/commands/cloud/test_pull.py b/tests/commands/cloud/test_pull.py
index d561f4e..9b55dbf 100644
--- a/tests/commands/cloud/test_pull.py
+++ b/tests/commands/cloud/test_pull.py
@@ -464,20 +464,20 @@ def _get_expected_encrypted_files_content() -> dict:
     return {
         "main.py":
                 """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
-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"""
+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"""
 ,
 "research.ipynb":
                 """NIiAgzU8gzaJ3YEIWysBh0e0xxm9rpAWDE4Pir/wzKtla/wcbs98GU5cdOxgd7Gjlcu0zNbFzE5x8Eyx
@@ -490,19 +490,19 @@ lbXtLVMOVI9YYBNEunf3drQm6fCnKv+arnt/rYSIQDvhrlqem6qKS3JE4V8gVzXQDefTewx3/hppDOxL
 +ccikaUcVkIAULF1Jwp9qxCpCsiz5vLXynD47pf3mhS2FC6Dd1g30xXUVNeTmpRE7TfS/gHzkyDrtTvC
 LBvBnkImsJQjDCJl/NzLlFRh4wiY4SL/bTdxL2YZJebJ1zdw3PXQhvWvgztG0wmIRE/U+1xv95gc5w5x
 7N2WT7F9KVHI6NrtrcU6c5hWo4q/QEBxb5ETSyNpgsVHvKxKblPGslki/aH6WOexu7tSzbuA9rSwVgiS
-NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeZk39zt+oqjQ4DcYprgW/q87fFRB
-thxY4cM3BGG/IIpX9oAxvFNe7PSXIx3BBkyhqiJqJRhS3YfvasBWFnJd11h9JXVsKJudVBoJvwrzxldU
-Td2mSr1d//xkIe6TeqPK3ivofMoCNoDYyO57juki8ban9Z8q0lpgShWBM8zUPNnezctwJZIp6aVaVdfC
-nZtG49f06w1IRC0dOj6yM+adiEPx/vKxrCn1sqd0eoAeKIs5iEm398YJlt9G0eubSSpoDC6iH1GjwH8A
-NFNRoKncB4c3ocmajgNda4o32UfpwvNr+fKLmpP+57dulpA09i/FqwF2L8dDNm4JSTjfNdeooM9TIDsG
-b3CIItqmNnve8fryEykjE8WgJaP70rnsXRY6WHLivy7OTNMKG8Ij9MOyx44Wq3TWY/omRDjYgfCO4QRZ
-vTtlnIMp8VtLlBgxRc6TBPZutYZXDJyY4N4n2Jpspl3KUbe3iHNm6nwl0SCwrIl3aYbCs55BP/LOGXLx
-dNIZzkxJhnfLtomrxO4QgcUnjNEWYJ1GvRAplTa99RFFYXOuMQID4+UH+6RM2e6cqBafv+2+lpetfbBM
-gMOA+qNdar9Y+b+vLuSz2ak0MCn3h8cAAlXgKNpo4shbgn+R4TViLGfhUZbcSG9VZ0UEBYyg5nxXggqh
-fPkc80yGC7lwo0XmrQrp62IaQy3iB2MYWB29KCX9MdghcobfhmW3BEtYqDRLE61/MWYi9scowMkf0TxT
-DyMRNS9qVwJ+2gS44xD+lQmQuE1aM+rBmRkVKWA+fB5HzZe6yyN8GkM4D23hcw+DBs9opXvq6QyGd8Le
-KqLYkbp7Be44+d6mie1aGp0hRUjF9LzNapPdnYusx4QwoIlt0wYTr1waqAYMG73PhDI36B6oa4tOwuSj
-86Wje1jEfUK01LVuVYloclnG3fTQxQlUcrRyQNCbrg0M5elYWbjYybx51/gb//9McGYXW0SWltNlvLvL
-SUroK4+Yhqfk5MVeascvM94fFBfieT3erU8D+iCiaVvZGcuE5mE0bLBquXpMuO4fQ06XVI/NzlhVILrV
-yXa/cl9WaYDFPqM+eFVJfg=="""
+NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeaDioLeCA5k0ub2OkbfEN0IlXj/8
+Y2R+plJgG1DT+YWebyvY/54Ct0lsZ2Q3mKOci9cesrdoLwakcmbMcBw/+0SFXZTXKN29xMTc9aY0BLdL
+LakUDL2drQhlxQZUJ7sDKtwL1yCkcagSjXBFkptNifbT6dM64klo/mr1G8NJwWwvKBHGeEoEiDByOk+7
+7dEJDe6ogFWh0iucrmOr8c1cKeEPp5Z5MAGkDLNQWo+tosuspqJdEIReAgFVMg9U+ebp8CaUUFaj24T2
+fa/X8D9Noq3k2riBIMTtJYMxFz4iFrFfXV7NGJfI4F5+wlEZwOLypuLSk6g9upIJL0JmaHPkapeFBrc5
+JxRPUfKO/vUl7MFIcGGOYsPRTdziC4Xql13DdoRxWYxuXgZT3d41kEsOsJYUg9d0djE8+1jLDTWQ3WGJ
+Ph2j6d2HCeg2i37wsGSfEi/lxbEca3qYSNQFGe20jp+XKz5SWddK1YU+eUDI661LYiqumCQrpVp1WJT5
+IZBSK+VDp1bDEIZmNDOLx7hQ1o2ZLjubIDKA0PKDTUP/HobY/QrTM/QRYXyVFQnzSnYH02SaWYa5gKrV
+kxGUD6HHzZ8Cq20kX4rPNWpqna4u9pEdfwuWWPzFrV7R5lNoogqPPVu3BkZ48vdxWp1Y0wXlb4crQqzf
+8qj0zZeZiEf6wPA805MCoPb7M/SUpgTV1+eWePFpbBTQk9JI9utcr1nojf/eAfNEw6T4zzpg/9h8gGSh
+olU0isNw6Xn7NgOkwq9RaFbHkY/1DM6eR1tWd6qo2IGjh/M0s2C1f16rkaOLdZ2x7v5g1XbnvQTTJFUD
+HrFPt9ElvzsATZvrloOCorTqbWc5BYmXb+u4MZ4vLtnU2wq/j5B+DvSswQkXsvtlGDsNPwLyi4dZuIVV
+Oae0ese2fAU8lmosUY95ghYxEOGrMHg5ZPklje/afjpxwKAAgTfWqozYPdpNL+MJEqrVA9YRq5wSvjuX
+UGw0ehtO8qY5FmPGcUlkBGuqmd7r6aLE4mosoZrc/UyZb+clWNYJITRLFJbQpWm3EU/Xrt5UM8uWwEdV
+bFWAAkX56MyDHwJefC1nkA=="""
 }
diff --git a/tests/commands/cloud/test_push.py b/tests/commands/cloud/test_push.py
index a06ae08..9b8d48c 100644
--- a/tests/commands/cloud/test_push.py
+++ b/tests/commands/cloud/test_push.py
@@ -270,7 +270,7 @@ def test_cloud_push_sends_decrypted_files_and_turns_off_encryption_with_decrypte
     expected_arguments = {
         "name": "Python Project",
         "description": "",
-        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def Initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.SetStartDate(2013, 10, 7)  # Set Start Date\n        self.SetEndDate(2013, 10, 11)  # Set End Date\n        self.SetCash(100000)  # Set Strategy Cash\n        self.AddEquity("SPY", Resolution.Minute)\n\n    def OnData(self, data: Slice):\n        """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.Portfolio.Invested:\n            self.SetHoldings("SPY", 1)\n            self.Debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.AddEquity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.SetStartDate(2013, 10, 11)\\n",\n                "history = qb.History(qb.Securities.Keys, 360, Resolution.Daily)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.Indicator(BollingerBands(30, 2), spy.Symbol, 360, Resolution.Daily)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
+        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.set_start_date(2013, 10, 7)  # Set Start Date\n        self.set_end_date(2013, 10, 11)  # Set End Date\n        self.set_cash(100000)  # Set Strategy Cash\n        self.add_equity("SPY", Resolution.MINUTE)\n\n    def on_data(self, data: Slice):\n        """on_data event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.portfolio.invested:\n            self.set_holdings("SPY", 1)\n            self.debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.add_equity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.set_start_date(2013, 10, 11)\\n",\n                "history = qb.history(qb.securities.keys(), 360, Resolution.DAILY)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.indicator(BollingerBands(30, 2), spy.symbol, 360, Resolution.DAILY)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
         "libraries": [],
         "encryption_key": ''
     }
@@ -312,7 +312,7 @@ def test_cloud_push_sends_decrypted_files_when_project_in_encrypted_state_with_d
     expected_arguments = {
         "name": "Python Project",
         "description": "",
-        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def Initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.SetStartDate(2013, 10, 7)  # Set Start Date\n        self.SetEndDate(2013, 10, 11)  # Set End Date\n        self.SetCash(100000)  # Set Strategy Cash\n        self.AddEquity("SPY", Resolution.Minute)\n\n    def OnData(self, data: Slice):\n        """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.Portfolio.Invested:\n            self.SetHoldings("SPY", 1)\n            self.Debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.AddEquity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.SetStartDate(2013, 10, 11)\\n",\n                "history = qb.History(qb.Securities.Keys, 360, Resolution.Daily)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.Indicator(BollingerBands(30, 2), spy.Symbol, 360, Resolution.Daily)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
+        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.set_start_date(2013, 10, 7)  # Set Start Date\n        self.set_end_date(2013, 10, 11)  # Set End Date\n        self.set_cash(100000)  # Set Strategy Cash\n        self.add_equity("SPY", Resolution.MINUTE)\n\n    def on_data(self, data: Slice):\n        """on_data event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.portfolio.invested:\n            self.set_holdings("SPY", 1)\n            self.debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.add_equity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.set_start_date(2013, 10, 11)\\n",\n                "history = qb.history(qb.securities.keys(), 360, Resolution.DAILY)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.indicator(BollingerBands(30, 2), spy.symbol, 360, Resolution.DAILY)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
         "libraries": [],
         "encryption_key": ''
     }
@@ -386,7 +386,7 @@ def test_cloud_push_decrypted_when_local_files_in_decrypted_state_and_cloud_proj
     expected_arguments = {
         "name": "Python Project",
         "description": "",
-        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def Initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.SetStartDate(2013, 10, 7)  # Set Start Date\n        self.SetEndDate(2013, 10, 11)  # Set End Date\n        self.SetCash(100000)  # Set Strategy Cash\n        self.AddEquity("SPY", Resolution.Minute)\n\n    def OnData(self, data: Slice):\n        """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.Portfolio.Invested:\n            self.SetHoldings("SPY", 1)\n            self.Debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.AddEquity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.SetStartDate(2013, 10, 11)\\n",\n                "history = qb.History(qb.Securities.Keys, 360, Resolution.Daily)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.Indicator(BollingerBands(30, 2), spy.Symbol, 360, Resolution.Daily)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
+        "files": [{'name': 'main.py', 'content': '# region imports\nfrom AlgorithmImports import *\n# endregion\n\nclass PythonProject(QCAlgorithm):\n\n    def initialize(self):\n        # Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data\n        self.set_start_date(2013, 10, 7)  # Set Start Date\n        self.set_end_date(2013, 10, 11)  # Set End Date\n        self.set_cash(100000)  # Set Strategy Cash\n        self.add_equity("SPY", Resolution.MINUTE)\n\n    def on_data(self, data: Slice):\n        """on_data event is the primary entry point for your algorithm. Each new data point will be pumped in here.\n            Arguments:\n                data: Slice object keyed by symbol containing the stock data\n        """\n        if not self.portfolio.invested:\n            self.set_holdings("SPY", 1)\n            self.debug("Purchased Stock")\n'}, {'name': 'research.ipynb', 'content': '{\n    "cells": [\n        {\n            "cell_type": "markdown",\n            "metadata": {},\n            "source": [\n                "![QuantConnect Logo](https://cdn.quantconnect.com/web/i/icon.png)\\n",\n                "<hr>"\n            ]\n        },\n        {\n            "cell_type": "code",\n            "execution_count": null,\n            "metadata": {},\n            "outputs": [],\n            "source": [\n                "# QuantBook Analysis Tool \\n",\n                "# For more information see [https://www.quantconnect.com/docs/v2/our-platform/research/getting-started]\\n",\n                "qb = QuantBook()\\n",\n                "spy = qb.add_equity(\\"SPY\\")\\n",\n                "# Locally Lean installs free sample data, to download more data please visit https://www.quantconnect.com/docs/v2/lean-cli/datasets/downloading-data \\n",\n                "qb.set_start_date(2013, 10, 11)\\n",\n                "history = qb.history(qb.securities.keys(), 360, Resolution.DAILY)\\n",\n                "\\n",\n                "# Indicator Analysis\\n",\n                "bbdf = qb.indicator(BollingerBands(30, 2), spy.symbol, 360, Resolution.DAILY)\\n",\n                "bbdf.drop(\'standarddeviation\', axis=1).plot()"\n            ]\n        }\n    ],\n    "metadata": {\n        "kernelspec": {\n            "display_name": "Python 3",\n            "language": "python",\n            "name": "python3"\n        }\n    },\n    "nbformat": 4,\n    "nbformat_minor": 2\n}\n'}],
         "libraries": [],
         "encryption_key": ''
     }
@@ -427,20 +427,20 @@ def _get_expected_encrypted_files_content() -> dict:
     return {
         "main.py":
                 """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
-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"""
+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"""
 ,
 "research.ipynb":
                 """NIiAgzU8gzaJ3YEIWysBh0e0xxm9rpAWDE4Pir/wzKtla/wcbs98GU5cdOxgd7Gjlcu0zNbFzE5x8Eyx
@@ -453,20 +453,19 @@ lbXtLVMOVI9YYBNEunf3drQm6fCnKv+arnt/rYSIQDvhrlqem6qKS3JE4V8gVzXQDefTewx3/hppDOxL
 +ccikaUcVkIAULF1Jwp9qxCpCsiz5vLXynD47pf3mhS2FC6Dd1g30xXUVNeTmpRE7TfS/gHzkyDrtTvC
 LBvBnkImsJQjDCJl/NzLlFRh4wiY4SL/bTdxL2YZJebJ1zdw3PXQhvWvgztG0wmIRE/U+1xv95gc5w5x
 7N2WT7F9KVHI6NrtrcU6c5hWo4q/QEBxb5ETSyNpgsVHvKxKblPGslki/aH6WOexu7tSzbuA9rSwVgiS
-NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeZk39zt+oqjQ4DcYprgW/q87fFRB
-thxY4cM3BGG/IIpX9oAxvFNe7PSXIx3BBkyhqiJqJRhS3YfvasBWFnJd11h9JXVsKJudVBoJvwrzxldU
-Td2mSr1d//xkIe6TeqPK3ivofMoCNoDYyO57juki8ban9Z8q0lpgShWBM8zUPNnezctwJZIp6aVaVdfC
-nZtG49f06w1IRC0dOj6yM+adiEPx/vKxrCn1sqd0eoAeKIs5iEm398YJlt9G0eubSSpoDC6iH1GjwH8A
-NFNRoKncB4c3ocmajgNda4o32UfpwvNr+fKLmpP+57dulpA09i/FqwF2L8dDNm4JSTjfNdeooM9TIDsG
-b3CIItqmNnve8fryEykjE8WgJaP70rnsXRY6WHLivy7OTNMKG8Ij9MOyx44Wq3TWY/omRDjYgfCO4QRZ
-vTtlnIMp8VtLlBgxRc6TBPZutYZXDJyY4N4n2Jpspl3KUbe3iHNm6nwl0SCwrIl3aYbCs55BP/LOGXLx
-dNIZzkxJhnfLtomrxO4QgcUnjNEWYJ1GvRAplTa99RFFYXOuMQID4+UH+6RM2e6cqBafv+2+lpetfbBM
-gMOA+qNdar9Y+b+vLuSz2ak0MCn3h8cAAlXgKNpo4shbgn+R4TViLGfhUZbcSG9VZ0UEBYyg5nxXggqh
-fPkc80yGC7lwo0XmrQrp62IaQy3iB2MYWB29KCX9MdghcobfhmW3BEtYqDRLE61/MWYi9scowMkf0TxT
-DyMRNS9qVwJ+2gS44xD+lQmQuE1aM+rBmRkVKWA+fB5HzZe6yyN8GkM4D23hcw+DBs9opXvq6QyGd8Le
-KqLYkbp7Be44+d6mie1aGp0hRUjF9LzNapPdnYusx4QwoIlt0wYTr1waqAYMG73PhDI36B6oa4tOwuSj
-86Wje1jEfUK01LVuVYloclnG3fTQxQlUcrRyQNCbrg0M5elYWbjYybx51/gb//9McGYXW0SWltNlvLvL
-SUroK4+Yhqfk5MVeascvM94fFBfieT3erU8D+iCiaVvZGcuE5mE0bLBquXpMuO4fQ06XVI/NzlhVILrV
-yXa/cl9WaYDFPqM+eFVJfg=="""
+NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeaDioLeCA5k0ub2OkbfEN0IlXj/8
+Y2R+plJgG1DT+YWebyvY/54Ct0lsZ2Q3mKOci9cesrdoLwakcmbMcBw/+0SFXZTXKN29xMTc9aY0BLdL
+LakUDL2drQhlxQZUJ7sDKtwL1yCkcagSjXBFkptNifbT6dM64klo/mr1G8NJwWwvKBHGeEoEiDByOk+7
+7dEJDe6ogFWh0iucrmOr8c1cKeEPp5Z5MAGkDLNQWo+tosuspqJdEIReAgFVMg9U+ebp8CaUUFaj24T2
+fa/X8D9Noq3k2riBIMTtJYMxFz4iFrFfXV7NGJfI4F5+wlEZwOLypuLSk6g9upIJL0JmaHPkapeFBrc5
+JxRPUfKO/vUl7MFIcGGOYsPRTdziC4Xql13DdoRxWYxuXgZT3d41kEsOsJYUg9d0djE8+1jLDTWQ3WGJ
+Ph2j6d2HCeg2i37wsGSfEi/lxbEca3qYSNQFGe20jp+XKz5SWddK1YU+eUDI661LYiqumCQrpVp1WJT5
+IZBSK+VDp1bDEIZmNDOLx7hQ1o2ZLjubIDKA0PKDTUP/HobY/QrTM/QRYXyVFQnzSnYH02SaWYa5gKrV
+kxGUD6HHzZ8Cq20kX4rPNWpqna4u9pEdfwuWWPzFrV7R5lNoogqPPVu3BkZ48vdxWp1Y0wXlb4crQqzf
+8qj0zZeZiEf6wPA805MCoPb7M/SUpgTV1+eWePFpbBTQk9JI9utcr1nojf/eAfNEw6T4zzpg/9h8gGSh
+olU0isNw6Xn7NgOkwq9RaFbHkY/1DM6eR1tWd6qo2IGjh/M0s2C1f16rkaOLdZ2x7v5g1XbnvQTTJFUD
+HrFPt9ElvzsATZvrloOCorTqbWc5BYmXb+u4MZ4vLtnU2wq/j5B+DvSswQkXsvtlGDsNPwLyi4dZuIVV
+Oae0ese2fAU8lmosUY95ghYxEOGrMHg5ZPklje/afjpxwKAAgTfWqozYPdpNL+MJEqrVA9YRq5wSvjuX
+UGw0ehtO8qY5FmPGcUlkBGuqmd7r6aLE4mosoZrc/UyZb+clWNYJITRLFJbQpWm3EU/Xrt5UM8uWwEdV
+bFWAAkX56MyDHwJefC1nkA=="""
 }
-
diff --git a/tests/commands/test_create_project.py b/tests/commands/test_create_project.py
index db2a289..bc27c93 100644
--- a/tests/commands/test_create_project.py
+++ b/tests/commands/test_create_project.py
@@ -36,7 +36,7 @@ def assert_python_project_exists(path: str) -> None:
 
     with open(project_dir / main_filename) as file:
         if is_libary:
-            assert "\ndef Add(a: int, b: int):" in file.read()
+            assert "\ndef add(a: int, b: int):" in file.read()
         else:
             assert "class MyFirstProject(QCAlgorithm)" in file.read()
 
diff --git a/tests/commands/test_encrypt.py b/tests/commands/test_encrypt.py
index 1b87b82..2af2c66 100644
--- a/tests/commands/test_encrypt.py
+++ b/tests/commands/test_encrypt.py
@@ -152,20 +152,20 @@ def _get_expected_encrypted_files_content() -> dict:
     return {
         "main.py":
                 """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
-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"""
+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"""
 ,
 "research.ipynb":
                 """NIiAgzU8gzaJ3YEIWysBh0e0xxm9rpAWDE4Pir/wzKtla/wcbs98GU5cdOxgd7Gjlcu0zNbFzE5x8Eyx
@@ -178,19 +178,19 @@ lbXtLVMOVI9YYBNEunf3drQm6fCnKv+arnt/rYSIQDvhrlqem6qKS3JE4V8gVzXQDefTewx3/hppDOxL
 +ccikaUcVkIAULF1Jwp9qxCpCsiz5vLXynD47pf3mhS2FC6Dd1g30xXUVNeTmpRE7TfS/gHzkyDrtTvC
 LBvBnkImsJQjDCJl/NzLlFRh4wiY4SL/bTdxL2YZJebJ1zdw3PXQhvWvgztG0wmIRE/U+1xv95gc5w5x
 7N2WT7F9KVHI6NrtrcU6c5hWo4q/QEBxb5ETSyNpgsVHvKxKblPGslki/aH6WOexu7tSzbuA9rSwVgiS
-NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeZk39zt+oqjQ4DcYprgW/q87fFRB
-thxY4cM3BGG/IIpX9oAxvFNe7PSXIx3BBkyhqiJqJRhS3YfvasBWFnJd11h9JXVsKJudVBoJvwrzxldU
-Td2mSr1d//xkIe6TeqPK3ivofMoCNoDYyO57juki8ban9Z8q0lpgShWBM8zUPNnezctwJZIp6aVaVdfC
-nZtG49f06w1IRC0dOj6yM+adiEPx/vKxrCn1sqd0eoAeKIs5iEm398YJlt9G0eubSSpoDC6iH1GjwH8A
-NFNRoKncB4c3ocmajgNda4o32UfpwvNr+fKLmpP+57dulpA09i/FqwF2L8dDNm4JSTjfNdeooM9TIDsG
-b3CIItqmNnve8fryEykjE8WgJaP70rnsXRY6WHLivy7OTNMKG8Ij9MOyx44Wq3TWY/omRDjYgfCO4QRZ
-vTtlnIMp8VtLlBgxRc6TBPZutYZXDJyY4N4n2Jpspl3KUbe3iHNm6nwl0SCwrIl3aYbCs55BP/LOGXLx
-dNIZzkxJhnfLtomrxO4QgcUnjNEWYJ1GvRAplTa99RFFYXOuMQID4+UH+6RM2e6cqBafv+2+lpetfbBM
-gMOA+qNdar9Y+b+vLuSz2ak0MCn3h8cAAlXgKNpo4shbgn+R4TViLGfhUZbcSG9VZ0UEBYyg5nxXggqh
-fPkc80yGC7lwo0XmrQrp62IaQy3iB2MYWB29KCX9MdghcobfhmW3BEtYqDRLE61/MWYi9scowMkf0TxT
-DyMRNS9qVwJ+2gS44xD+lQmQuE1aM+rBmRkVKWA+fB5HzZe6yyN8GkM4D23hcw+DBs9opXvq6QyGd8Le
-KqLYkbp7Be44+d6mie1aGp0hRUjF9LzNapPdnYusx4QwoIlt0wYTr1waqAYMG73PhDI36B6oa4tOwuSj
-86Wje1jEfUK01LVuVYloclnG3fTQxQlUcrRyQNCbrg0M5elYWbjYybx51/gb//9McGYXW0SWltNlvLvL
-SUroK4+Yhqfk5MVeascvM94fFBfieT3erU8D+iCiaVvZGcuE5mE0bLBquXpMuO4fQ06XVI/NzlhVILrV
-yXa/cl9WaYDFPqM+eFVJfg=="""
+NWh9y3qZ6aMOMq3dDAr4wGBkkGQsirasCEt3YEa9rG5CDH8JYApCeaDioLeCA5k0ub2OkbfEN0IlXj/8
+Y2R+plJgG1DT+YWebyvY/54Ct0lsZ2Q3mKOci9cesrdoLwakcmbMcBw/+0SFXZTXKN29xMTc9aY0BLdL
+LakUDL2drQhlxQZUJ7sDKtwL1yCkcagSjXBFkptNifbT6dM64klo/mr1G8NJwWwvKBHGeEoEiDByOk+7
+7dEJDe6ogFWh0iucrmOr8c1cKeEPp5Z5MAGkDLNQWo+tosuspqJdEIReAgFVMg9U+ebp8CaUUFaj24T2
+fa/X8D9Noq3k2riBIMTtJYMxFz4iFrFfXV7NGJfI4F5+wlEZwOLypuLSk6g9upIJL0JmaHPkapeFBrc5
+JxRPUfKO/vUl7MFIcGGOYsPRTdziC4Xql13DdoRxWYxuXgZT3d41kEsOsJYUg9d0djE8+1jLDTWQ3WGJ
+Ph2j6d2HCeg2i37wsGSfEi/lxbEca3qYSNQFGe20jp+XKz5SWddK1YU+eUDI661LYiqumCQrpVp1WJT5
+IZBSK+VDp1bDEIZmNDOLx7hQ1o2ZLjubIDKA0PKDTUP/HobY/QrTM/QRYXyVFQnzSnYH02SaWYa5gKrV
+kxGUD6HHzZ8Cq20kX4rPNWpqna4u9pEdfwuWWPzFrV7R5lNoogqPPVu3BkZ48vdxWp1Y0wXlb4crQqzf
+8qj0zZeZiEf6wPA805MCoPb7M/SUpgTV1+eWePFpbBTQk9JI9utcr1nojf/eAfNEw6T4zzpg/9h8gGSh
+olU0isNw6Xn7NgOkwq9RaFbHkY/1DM6eR1tWd6qo2IGjh/M0s2C1f16rkaOLdZ2x7v5g1XbnvQTTJFUD
+HrFPt9ElvzsATZvrloOCorTqbWc5BYmXb+u4MZ4vLtnU2wq/j5B+DvSswQkXsvtlGDsNPwLyi4dZuIVV
+Oae0ese2fAU8lmosUY95ghYxEOGrMHg5ZPklje/afjpxwKAAgTfWqozYPdpNL+MJEqrVA9YRq5wSvjuX
+UGw0ehtO8qY5FmPGcUlkBGuqmd7r6aLE4mosoZrc/UyZb+clWNYJITRLFJbQpWm3EU/Xrt5UM8uWwEdV
+bFWAAkX56MyDHwJefC1nkA=="""
 }