Ver Fonte

Merge branch 'develop' into 1535-improve-style-of-metric-control

Nam Nguyen há 9 meses atrás
pai
commit
6f611e35a4

+ 30 - 23
README.md

@@ -1,6 +1,5 @@
 [![Taipy Designer banner](https://github.com/Avaiga/taipy/assets/31435778/6378ffd4-438a-498f-9385-10394f7d53fb)](https://links.taipy.io/306TwUH)
 [![Taipy Designer banner](https://github.com/Avaiga/taipy/assets/31435778/6378ffd4-438a-498f-9385-10394f7d53fb)](https://links.taipy.io/306TwUH)
 
 
-
 <div align="center">
 <div align="center">
   <a href="https://taipy.io?utm_source=github" target="_blank">
   <a href="https://taipy.io?utm_source=github" target="_blank">
   <picture>
   <picture>
@@ -23,11 +22,10 @@ From simple pilots to production-ready web applications in no time. No more comp
 <div align="center">
 <div align="center">
 
 
 **Go beyond existing libraries**
 **Go beyond existing libraries**
-</div>
-
 
 
+</div>
 
 
-  <p align="left">
+<p align="left">
     <br />
     <br />
     <a href="https://docs.taipy.io/en/latest/"><strong>📚 Explore the docs </strong></a>
     <a href="https://docs.taipy.io/en/latest/"><strong>📚 Explore the docs </strong></a>
     <br />
     <br />
@@ -39,11 +37,12 @@ From simple pilots to production-ready web applications in no time. No more comp
 &nbsp;
 &nbsp;
 
 
 ## ⭐️ What's Taipy?
 ## ⭐️ What's Taipy?
+
 Taipy is designed for data scientists and machine learning engineers to build data & AI web applications.
 Taipy is designed for data scientists and machine learning engineers to build data & AI web applications.
 &nbsp;
 &nbsp;
 
 
-⭐️ Enables building production-ready web applications. <br />
-⭐️ No need to learn new languages. Only Python is needed.<br />
+⭐️ Enables building production-ready web applications. `<br />`
+⭐️ No need to learn new languages. Only Python is needed.`<br />`
 ⭐️ Concentrate on Data and AI algorithms without development and deployment complexities.
 ⭐️ Concentrate on Data and AI algorithms without development and deployment complexities.
 
 
 &nbsp;
 &nbsp;
@@ -52,42 +51,44 @@ Taipy is designed for data scientists and machine learning engineers to build da
 Taipy is a Two-in-One Tool for UI Generation and Scenario/Data Management
 Taipy is a Two-in-One Tool for UI Generation and Scenario/Data Management
 </h4>
 </h4>
 
 
- <br />
+<br />
 
 
-| User Interface Generation  | Scenario and Data Management |
-| --------  | -------- |
-|<img src="readme_img/taipy_github_GUI_video.gif" alt="Interface Animation"  width="100%" /> | <img src="readme_img/taipy_github_scenarios_video.gif" alt="Back-End Animation"  width="100%"/>
+| User Interface Generation                                                                       | Scenario and Data Management                                                                        |
+| ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
+| `<img src="readme_img/taipy_github_GUI_video.gif" alt="Interface Animation"  width="100%" />` | `<img src="readme_img/taipy_github_scenarios_video.gif" alt="Back-End Animation"  width="100%"/>` |
 
 
 &nbsp;
 &nbsp;
 
 
 ## ✨ Features
 ## ✨ Features
+
 <img src="readme_img/taipy_github_scenario.png" alt="Scenario Banner"  width="49%" />  <img src="readme_img/taipy-github-optimized.png" alt="Back-End Animation"  width="49.7%"/>
 <img src="readme_img/taipy_github_scenario.png" alt="Scenario Banner"  width="49%" />  <img src="readme_img/taipy-github-optimized.png" alt="Back-End Animation"  width="49.7%"/>
 <img src="readme_img/taipy_github_data_support.png" alt="Back-End Animation"  width="49.7%" />
 <img src="readme_img/taipy_github_data_support.png" alt="Back-End Animation"  width="49.7%" />
 
 
-
 &nbsp;
 &nbsp;
 
 
 ## ⚙️ Quickstart
 ## ⚙️ Quickstart
+
 To install Taipy stable release run:
 To install Taipy stable release run:
+
 ```bash
 ```bash
 pip install taipy
 pip install taipy
 ```
 ```
 
 
-To install Taipy on a Conda Environment or from source, please refer to the [Installation Guide](https://docs.taipy.io/en/latest/installation/).<br />
+To install Taipy on a Conda Environment or from source, please refer to the [Installation Guide](https://docs.taipy.io/en/latest/installation/).`<br />`
 To get started with Taipy, please refer to the [Getting Started Guide](https://docs.taipy.io/en/latest/getting_started/).
 To get started with Taipy, please refer to the [Getting Started Guide](https://docs.taipy.io/en/latest/getting_started/).
 
 
 &nbsp;
 &nbsp;
 
 
 ## 🔌 Scenario and Data Management
 ## 🔌 Scenario and Data Management
 
 
-Let's create a scenario in Taipy that allows you to filter movie data based on your chosen genre.<br />
-This scenario is designed as a straightforward pipeline.<br />
-Every time you change your genre selection, the scenario runs to process your request.<br />
+Let's create a scenario in Taipy that allows you to filter movie data based on your chosen genre.`<br />`
+This scenario is designed as a straightforward pipeline.`<br />`
+Every time you change your genre selection, the scenario runs to process your request.`<br />`
 It then displays the top seven most popular movies in that genre.
 It then displays the top seven most popular movies in that genre.
 
 
 <br />
 <br />
 
 
-> ⚠️ Keep in mind, in this example, we're using a very basic pipeline that consists of just one task. However,<br />
+> ⚠️ Keep in mind, in this example, we're using a very basic pipeline that consists of just one task. However,`<br />`
 > Taipy is capable of handling much more complex pipelines 🚀
 > Taipy is capable of handling much more complex pipelines 🚀
 
 
 <br />
 <br />
@@ -102,16 +103,18 @@ def filter_genre(initial_dataset: pd.DataFrame, selected_genre):
 ```
 ```
 
 
 This is the execution graph of the scenario we are implementing
 This is the execution graph of the scenario we are implementing
+
 <p align="center">
 <p align="center">
 <img src="https://github.com/Avaiga/taipy/raw/develop/readme_img/readme_exec_graph.png" width="600" align="center" />
 <img src="https://github.com/Avaiga/taipy/raw/develop/readme_img/readme_exec_graph.png" width="600" align="center" />
 </p>
 </p>
 
 
 ### Taipy Studio
 ### Taipy Studio
-You can use the Taipy Studio extension in Visual Studio Code to configure your scenario with no code<br />
-Your configuration is automatically saved as a TOML file.<br />
+
+You can use the Taipy Studio extension in Visual Studio Code to configure your scenario with no code`<br />`
+Your configuration is automatically saved as a TOML file.`<br />`
 Check out Taipy Studio [Documentation](https://docs.taipy.io/en/latest/manuals/studio/)
 Check out Taipy Studio [Documentation](https://docs.taipy.io/en/latest/manuals/studio/)
 
 
-For more advanced use cases or if you prefer coding your configurations instead of using Taipy Studio,<br />
+For more advanced use cases or if you prefer coding your configurations instead of using Taipy Studio,`<br />`
 Check out the movie genre demo scenario creation with this [Demo](https://docs.taipy.io/en/latest/gallery/other/movie_genre_selector/).
 Check out the movie genre demo scenario creation with this [Demo](https://docs.taipy.io/en/latest/gallery/other/movie_genre_selector/).
 
 
 ![TaipyStudio](https://github.com/Avaiga/taipy/raw/develop/readme_img/readme_demo_studio.gif)
 ![TaipyStudio](https://github.com/Avaiga/taipy/raw/develop/readme_img/readme_demo_studio.gif)
@@ -119,7 +122,8 @@ Check out the movie genre demo scenario creation with this [Demo](https://docs.t
 &nbsp;
 &nbsp;
 
 
 ## User Interface Generation and Scenario & Data Management
 ## User Interface Generation and Scenario & Data Management
-This simple Taipy application demonstrates how to create a basic film recommendation system using Taipy.<br />
+
+This simple Taipy application demonstrates how to create a basic film recommendation system using Taipy.`<br />`
 The application filters a dataset of films based on the user's selected genre and displays the top seven films in that genre by popularity.
 The application filters a dataset of films based on the user's selected genre and displays the top seven films in that genre by popularity.
 Here is the full code for both the frontend and backend of the application.
 Here is the full code for both the frontend and backend of the application.
 
 
@@ -154,8 +158,8 @@ if __name__ == "__main__":
     Config.load("config.toml")
     Config.load("config.toml")
     scenario_cfg = Config.scenarios["scenario"]
     scenario_cfg = Config.scenarios["scenario"]
 
 
-    # Start Taipy Core service
-    tp.Core().run()
+    # Start Taipy Orchestrator
+    tp.Orchestrator().run()
 
 
     # Create a scenario
     # Create a scenario
     scenario = tp.create_scenario(scenario_cfg)
     scenario = tp.create_scenario(scenario_cfg)
@@ -188,17 +192,20 @@ if __name__ == "__main__":
 ```
 ```
 
 
 And the final result:
 And the final result:
-<img src="readme_img/readme_app.gif" />
+`<img src="readme_img/readme_app.gif" />`
 
 
 &nbsp;
 &nbsp;
 
 
 ## ⚒️ Contributing
 ## ⚒️ Contributing
+
 Want to help build Taipy? Check out our [Contributing Guide](https://github.com/Avaiga/taipy/blob/develop/CONTRIBUTING.md).
 Want to help build Taipy? Check out our [Contributing Guide](https://github.com/Avaiga/taipy/blob/develop/CONTRIBUTING.md).
 
 
 ## 🪄 Code of conduct
 ## 🪄 Code of conduct
+
 Want to be part of the Taipy community? Check out our [Code of Conduct](https://github.com/Avaiga/taipy/blob/develop/CODE_OF_CONDUCT.md)
 Want to be part of the Taipy community? Check out our [Code of Conduct](https://github.com/Avaiga/taipy/blob/develop/CODE_OF_CONDUCT.md)
 
 
 ## 🪪 License
 ## 🪪 License
+
 Copyright 2021-2024 Avaiga Private Limited
 Copyright 2021-2024 Avaiga Private Limited
 
 
 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with

+ 101 - 112
frontend/taipy-gui/package-lock.json

@@ -137,9 +137,9 @@
       }
       }
     },
     },
     "node_modules/@babel/compat-data": {
     "node_modules/@babel/compat-data": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
-      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
+      "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
       "dev": true,
       "dev": true,
       "engines": {
       "engines": {
         "node": ">=6.9.0"
         "node": ">=6.9.0"
@@ -191,11 +191,11 @@
       }
       }
     },
     },
     "node_modules/@babel/generator": {
     "node_modules/@babel/generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
-      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.4.tgz",
+      "integrity": "sha512-NFtZmZsyzDPJnk9Zg3BbTfKKc9UlHYzD0E//p2Z3B9nCwwtJW9T0gVbCz8+fBngnn4zf1Dr3IK8PHQQHq0lDQw==",
       "dependencies": {
       "dependencies": {
-        "@babel/types": "^7.25.0",
+        "@babel/types": "^7.25.4",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
         "jsesc": "^2.5.1"
@@ -334,11 +334,11 @@
       }
       }
     },
     },
     "node_modules/@babel/parser": {
     "node_modules/@babel/parser": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
-      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz",
+      "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==",
       "dependencies": {
       "dependencies": {
-        "@babel/types": "^7.25.2"
+        "@babel/types": "^7.25.4"
       },
       },
       "bin": {
       "bin": {
         "parser": "bin/babel-parser.js"
         "parser": "bin/babel-parser.js"
@@ -555,12 +555,12 @@
       }
       }
     },
     },
     "node_modules/@babel/plugin-syntax-typescript": {
     "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
-      "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz",
+      "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==",
       "dev": true,
       "dev": true,
       "dependencies": {
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       },
       "engines": {
       "engines": {
         "node": ">=6.9.0"
         "node": ">=6.9.0"
@@ -570,9 +570,9 @@
       }
       }
     },
     },
     "node_modules/@babel/runtime": {
     "node_modules/@babel/runtime": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz",
-      "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz",
+      "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==",
       "dependencies": {
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
         "regenerator-runtime": "^0.14.0"
       },
       },
@@ -594,15 +594,15 @@
       }
       }
     },
     },
     "node_modules/@babel/traverse": {
     "node_modules/@babel/traverse": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
-      "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz",
+      "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==",
       "dependencies": {
       "dependencies": {
         "@babel/code-frame": "^7.24.7",
         "@babel/code-frame": "^7.24.7",
-        "@babel/generator": "^7.25.0",
-        "@babel/parser": "^7.25.3",
+        "@babel/generator": "^7.25.4",
+        "@babel/parser": "^7.25.4",
         "@babel/template": "^7.25.0",
         "@babel/template": "^7.25.0",
-        "@babel/types": "^7.25.2",
+        "@babel/types": "^7.25.4",
         "debug": "^4.3.1",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
         "globals": "^11.1.0"
       },
       },
@@ -611,9 +611,9 @@
       }
       }
     },
     },
     "node_modules/@babel/types": {
     "node_modules/@babel/types": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
-      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+      "version": "7.25.4",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz",
+      "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
       "dependencies": {
       "dependencies": {
         "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-validator-identifier": "^7.24.7",
         "@babel/helper-validator-identifier": "^7.24.7",
@@ -703,14 +703,14 @@
       "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
       "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
     },
     },
     "node_modules/@emotion/react": {
     "node_modules/@emotion/react": {
-      "version": "11.13.0",
-      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz",
-      "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==",
+      "version": "11.13.3",
+      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz",
+      "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==",
       "dependencies": {
       "dependencies": {
         "@babel/runtime": "^7.18.3",
         "@babel/runtime": "^7.18.3",
         "@emotion/babel-plugin": "^11.12.0",
         "@emotion/babel-plugin": "^11.12.0",
         "@emotion/cache": "^11.13.0",
         "@emotion/cache": "^11.13.0",
-        "@emotion/serialize": "^1.3.0",
+        "@emotion/serialize": "^1.3.1",
         "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
         "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
         "@emotion/utils": "^1.4.0",
         "@emotion/utils": "^1.4.0",
         "@emotion/weak-memoize": "^0.4.0",
         "@emotion/weak-memoize": "^0.4.0",
@@ -726,13 +726,13 @@
       }
       }
     },
     },
     "node_modules/@emotion/serialize": {
     "node_modules/@emotion/serialize": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz",
-      "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz",
+      "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==",
       "dependencies": {
       "dependencies": {
         "@emotion/hash": "^0.9.2",
         "@emotion/hash": "^0.9.2",
         "@emotion/memoize": "^0.9.0",
         "@emotion/memoize": "^0.9.0",
-        "@emotion/unitless": "^0.9.0",
+        "@emotion/unitless": "^0.10.0",
         "@emotion/utils": "^1.4.0",
         "@emotion/utils": "^1.4.0",
         "csstype": "^3.0.2"
         "csstype": "^3.0.2"
       }
       }
@@ -765,9 +765,9 @@
       }
       }
     },
     },
     "node_modules/@emotion/unitless": {
     "node_modules/@emotion/unitless": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz",
-      "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ=="
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+      "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="
     },
     },
     "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
     "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
       "version": "1.1.0",
       "version": "1.1.0",
@@ -2097,9 +2097,9 @@
       }
       }
     },
     },
     "node_modules/@mui/x-date-pickers": {
     "node_modules/@mui/x-date-pickers": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.12.1.tgz",
-      "integrity": "sha512-Zj8kt3SCQbJp1qhMi+A3I4KqB8i5OY2Q11mdOEathFhqN/SQm1sUjIa1G09cGP1dPDgK1a6KM6qJGNtcw/nuWA==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.13.0.tgz",
+      "integrity": "sha512-cmpAfkzOjUgL4I8WenU4elm1QJO8vWpGmIPCezT3Q9wFjGL1QApQhJ5gMZ+X4tM6Gha9AhIWNQX5eXHKbSoyFQ==",
       "dependencies": {
       "dependencies": {
         "@babel/runtime": "^7.25.0",
         "@babel/runtime": "^7.25.0",
         "@mui/system": "^5.16.5",
         "@mui/system": "^5.16.5",
@@ -2161,9 +2161,9 @@
       }
       }
     },
     },
     "node_modules/@mui/x-internals": {
     "node_modules/@mui/x-internals": {
-      "version": "7.12.0",
-      "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.12.0.tgz",
-      "integrity": "sha512-zgu/JqSXBflSvtzfFN8lNi5Wxw79czBv6V/crOrXqCCOzxAIsrcup2FZlwvXlzetm3otS7o/Tzfo/O5dE68NkA==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.13.0.tgz",
+      "integrity": "sha512-eUK7iykkDWU+wBfTzE/S0qh4awgVgsORfrpvuPbUp+E6qUj1Xhu9M/WKzbwz0CPFnTJZwBQ9KYrxpGXnPBEpRQ==",
       "dependencies": {
       "dependencies": {
         "@babel/runtime": "^7.25.0",
         "@babel/runtime": "^7.25.0",
         "@mui/utils": "^5.16.5"
         "@mui/utils": "^5.16.5"
@@ -2180,14 +2180,14 @@
       }
       }
     },
     },
     "node_modules/@mui/x-tree-view": {
     "node_modules/@mui/x-tree-view": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.12.1.tgz",
-      "integrity": "sha512-WEejS6mzKQzwm0vKT5W1XqlHxqIFv0AV/MYDgvru39WwaCUCyip32sjvl7cDNwrsC8CkwyBCaEvNDEE9Jx0BkA==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.13.0.tgz",
+      "integrity": "sha512-ADixvp85a0iZ7AOzBuCPQ+yl+gMq0BlIWhg3GfbX+57sMhjcdOEUUxcGIcIt6pw1V05bVXE2/QP+5qzDamiGPw==",
       "dependencies": {
       "dependencies": {
         "@babel/runtime": "^7.25.0",
         "@babel/runtime": "^7.25.0",
         "@mui/system": "^5.16.5",
         "@mui/system": "^5.16.5",
         "@mui/utils": "^5.16.5",
         "@mui/utils": "^5.16.5",
-        "@mui/x-internals": "7.12.0",
+        "@mui/x-internals": "7.13.0",
         "@types/react-transition-group": "^4.4.10",
         "@types/react-transition-group": "^4.4.10",
         "clsx": "^2.1.1",
         "clsx": "^2.1.1",
         "prop-types": "^15.8.1",
         "prop-types": "^15.8.1",
@@ -2336,17 +2336,17 @@
       }
       }
     },
     },
     "node_modules/@remix-run/router": {
     "node_modules/@remix-run/router": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz",
-      "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==",
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
+      "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==",
       "engines": {
       "engines": {
         "node": ">=14.0.0"
         "node": ">=14.0.0"
       }
       }
     },
     },
     "node_modules/@shikijs/core": {
     "node_modules/@shikijs/core": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.1.tgz",
-      "integrity": "sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==",
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.14.1.tgz",
+      "integrity": "sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==",
       "dev": true,
       "dev": true,
       "dependencies": {
       "dependencies": {
         "@types/hast": "^3.0.4"
         "@types/hast": "^3.0.4"
@@ -2769,16 +2769,6 @@
         "@types/json-schema": "*"
         "@types/json-schema": "*"
       }
       }
     },
     },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
-      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "dev": true,
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
     "node_modules/@types/estree": {
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@@ -2949,9 +2939,9 @@
       "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
       "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
     },
     },
     "node_modules/@types/react": {
     "node_modules/@types/react": {
-      "version": "18.3.3",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
-      "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
+      "version": "18.3.4",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz",
+      "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==",
       "dependencies": {
       "dependencies": {
         "@types/prop-types": "*",
         "@types/prop-types": "*",
         "csstype": "^3.0.2"
         "csstype": "^3.0.2"
@@ -3057,9 +3047,9 @@
       "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
       "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
     },
     },
     "node_modules/@types/unist": {
     "node_modules/@types/unist": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-      "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+      "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="
     },
     },
     "node_modules/@types/uuid": {
     "node_modules/@types/uuid": {
       "version": "10.0.0",
       "version": "10.0.0",
@@ -3897,9 +3887,9 @@
       }
       }
     },
     },
     "node_modules/async": {
     "node_modules/async": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
-      "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
+      "version": "3.2.6",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
       "dev": true
       "dev": true
     },
     },
     "node_modules/asynckit": {
     "node_modules/asynckit": {
@@ -5002,9 +4992,9 @@
       }
       }
     },
     },
     "node_modules/core-js": {
     "node_modules/core-js": {
-      "version": "3.38.0",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz",
-      "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==",
+      "version": "3.38.1",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
+      "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
       "hasInstallScript": true,
       "hasInstallScript": true,
       "funding": {
       "funding": {
         "type": "opencollective",
         "type": "opencollective",
@@ -5937,9 +5927,9 @@
       }
       }
     },
     },
     "node_modules/electron-to-chromium": {
     "node_modules/electron-to-chromium": {
-      "version": "1.5.7",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz",
-      "integrity": "sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw=="
+      "version": "1.5.13",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz",
+      "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q=="
     },
     },
     "node_modules/element-size": {
     "node_modules/element-size": {
       "version": "1.1.1",
       "version": "1.1.1",
@@ -7993,9 +7983,9 @@
       }
       }
     },
     },
     "node_modules/husky": {
     "node_modules/husky": {
-      "version": "9.1.4",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz",
-      "integrity": "sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==",
+      "version": "9.1.5",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.5.tgz",
+      "integrity": "sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==",
       "dev": true,
       "dev": true,
       "bin": {
       "bin": {
         "husky": "bin.js"
         "husky": "bin.js"
@@ -8266,9 +8256,9 @@
       }
       }
     },
     },
     "node_modules/is-core-module": {
     "node_modules/is-core-module": {
-      "version": "2.15.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
-      "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
       "dependencies": {
       "dependencies": {
         "hasown": "^2.0.2"
         "hasown": "^2.0.2"
       },
       },
@@ -12610,9 +12600,9 @@
       }
       }
     },
     },
     "node_modules/parse-entities/node_modules/@types/unist": {
     "node_modules/parse-entities/node_modules/@types/unist": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
-      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+      "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="
     },
     },
     "node_modules/parse-json": {
     "node_modules/parse-json": {
       "version": "5.2.0",
       "version": "5.2.0",
@@ -13371,11 +13361,11 @@
       }
       }
     },
     },
     "node_modules/react-router": {
     "node_modules/react-router": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz",
-      "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
+      "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
       "dependencies": {
       "dependencies": {
-        "@remix-run/router": "1.19.0"
+        "@remix-run/router": "1.19.1"
       },
       },
       "engines": {
       "engines": {
         "node": ">=14.0.0"
         "node": ">=14.0.0"
@@ -13385,12 +13375,12 @@
       }
       }
     },
     },
     "node_modules/react-router-dom": {
     "node_modules/react-router-dom": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz",
-      "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
+      "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
       "dependencies": {
       "dependencies": {
-        "@remix-run/router": "1.19.0",
-        "react-router": "6.26.0"
+        "@remix-run/router": "1.19.1",
+        "react-router": "6.26.1"
       },
       },
       "engines": {
       "engines": {
         "node": ">=14.0.0"
         "node": ">=14.0.0"
@@ -14109,12 +14099,12 @@
       }
       }
     },
     },
     "node_modules/shiki": {
     "node_modules/shiki": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.1.tgz",
-      "integrity": "sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg==",
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.14.1.tgz",
+      "integrity": "sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==",
       "dev": true,
       "dev": true,
       "dependencies": {
       "dependencies": {
-        "@shikijs/core": "1.12.1",
+        "@shikijs/core": "1.14.1",
         "@types/hast": "^3.0.4"
         "@types/hast": "^3.0.4"
       }
       }
     },
     },
@@ -15302,9 +15292,9 @@
       }
       }
     },
     },
     "node_modules/typedoc": {
     "node_modules/typedoc": {
-      "version": "0.26.5",
-      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz",
-      "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==",
+      "version": "0.26.6",
+      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.6.tgz",
+      "integrity": "sha512-SfEU3SH3wHNaxhFPjaZE2kNl/NFtLNW5c1oHsg7mti7GjmUj1Roq6osBQeMd+F4kL0BoRBBr8gQAuqBlfFu8LA==",
       "dev": true,
       "dev": true,
       "dependencies": {
       "dependencies": {
         "lunr": "^2.3.9",
         "lunr": "^2.3.9",
@@ -15324,9 +15314,9 @@
       }
       }
     },
     },
     "node_modules/typedoc-plugin-markdown": {
     "node_modules/typedoc-plugin-markdown": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.2.4.tgz",
-      "integrity": "sha512-9jdYqF5Sx1qxvSo7wV1mUHA2XYn3Y1DJ/ttCWW1V4lHdzDAwIA/EB9U92Ryx3GOSD73X1u8eTu8fBjoCmkURTQ==",
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.2.5.tgz",
+      "integrity": "sha512-ZWIfc0OqwEtQfuaqbmM1kesMi/Fhc++W+5f3TDEm1Tsi28pHSoZk4WCOm4lNuN30WtEImwAHhhXC4DIWki1DiA==",
       "dev": true,
       "dev": true,
       "engines": {
       "engines": {
         "node": ">= 18"
         "node": ">= 18"
@@ -15710,12 +15700,11 @@
       }
       }
     },
     },
     "node_modules/webpack": {
     "node_modules/webpack": {
-      "version": "5.93.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
-      "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
+      "version": "5.94.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
+      "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
       "dev": true,
       "dev": true,
       "dependencies": {
       "dependencies": {
-        "@types/eslint-scope": "^3.7.3",
         "@types/estree": "^1.0.5",
         "@types/estree": "^1.0.5",
         "@webassemblyjs/ast": "^1.12.1",
         "@webassemblyjs/ast": "^1.12.1",
         "@webassemblyjs/wasm-edit": "^1.12.1",
         "@webassemblyjs/wasm-edit": "^1.12.1",
@@ -15724,7 +15713,7 @@
         "acorn-import-attributes": "^1.9.5",
         "acorn-import-attributes": "^1.9.5",
         "browserslist": "^4.21.10",
         "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.0",
+        "enhanced-resolve": "^5.17.1",
         "es-module-lexer": "^1.2.1",
         "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
         "events": "^3.2.0",

+ 1 - 1
frontend/taipy-gui/src/components/Taipy/Chat.tsx

@@ -56,7 +56,7 @@ const ENTER_KEY = "Enter";
 const indicWidth = 0.7;
 const indicWidth = 0.7;
 const avatarWidth = 24;
 const avatarWidth = 24;
 const chatAvatarSx = { ...avatarSx, width: avatarWidth, height: avatarWidth };
 const chatAvatarSx = { ...avatarSx, width: avatarWidth, height: avatarWidth };
-const avatarColSx = { width: 1.5 * avatarWidth };
+const avatarColSx = { width: 1.5 * avatarWidth, minWidth: 1.5 * avatarWidth };
 const senderMsgSx = {
 const senderMsgSx = {
     width: "fit-content",
     width: "fit-content",
     maxWidth: "80%",
     maxWidth: "80%",

+ 10 - 10
taipy/_run.py

@@ -14,15 +14,15 @@ import typing as t
 
 
 from flask import Flask
 from flask import Flask
 
 
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.gui import Gui
 from taipy.gui import Gui
 from taipy.rest import Rest
 from taipy.rest import Rest
 
 
 if sys.version_info >= (3, 10):
 if sys.version_info >= (3, 10):
     from typing import TypeGuard
     from typing import TypeGuard
 
 
-_AppType = t.Union[Gui, Rest, Core]
-_AppTypeT = t.TypeVar("_AppTypeT", Gui, Rest, Core)
+_AppType = t.Union[Gui, Rest, Orchestrator]
+_AppTypeT = t.TypeVar("_AppTypeT", Gui, Rest, Orchestrator)
 
 
 
 
 def _run(*services: _AppType, **kwargs) -> t.Optional[Flask]:
 def _run(*services: _AppType, **kwargs) -> t.Optional[Flask]:
@@ -31,7 +31,7 @@ def _run(*services: _AppType, **kwargs) -> t.Optional[Flask]:
     A Taipy service is an instance of a class that runs code as a Web application.
     A Taipy service is an instance of a class that runs code as a Web application.
 
 
     Parameters:
     Parameters:
-        *services (Union[`Gui^`, `Rest^`, `Core^`]): Services to run, as separate arguments.<br/>
+        *services (Union[`Gui^`, `Rest^`, `Orchestrator^`]): Services to run, as separate arguments.<br/>
             If several services are provided, all the services run simultaneously.<br/>
             If several services are provided, all the services run simultaneously.<br/>
             If this is empty or set to None, this method does nothing.
             If this is empty or set to None, this method does nothing.
         **kwargs: Other parameters to provide to the services.
         **kwargs: Other parameters to provide to the services.
@@ -39,19 +39,19 @@ def _run(*services: _AppType, **kwargs) -> t.Optional[Flask]:
 
 
     gui = __get_app(services, Gui)
     gui = __get_app(services, Gui)
     rest = __get_app(services, Rest)
     rest = __get_app(services, Rest)
-    core = __get_app(services, Core)
+    orchestrator = __get_app(services, Orchestrator)
 
 
-    if gui and core:
+    if gui and orchestrator:
         from taipy.core._cli._core_cli_factory import _CoreCLIFactory
         from taipy.core._cli._core_cli_factory import _CoreCLIFactory
         from taipy.gui._gui_cli import _GuiCLI
         from taipy.gui._gui_cli import _GuiCLI
 
 
         _CoreCLIFactory._build_cli().create_parser()
         _CoreCLIFactory._build_cli().create_parser()
         _GuiCLI.create_parser()
         _GuiCLI.create_parser()
 
 
-    if rest or core:
-        if not core:
-            core = Core()
-        core.run()
+    if rest or orchestrator:
+        if not orchestrator:
+            orchestrator = Orchestrator()
+        orchestrator.run()
 
 
     if not rest and not gui:
     if not rest and not gui:
         return None
         return None

+ 1 - 1
taipy/config/common/_config_blocker.py

@@ -40,7 +40,7 @@ class _ConfigBlocker:
             def _check_if_is_blocking(*args, **kwargs):
             def _check_if_is_blocking(*args, **kwargs):
                 if cls.__block_config_update:
                 if cls.__block_config_update:
                     error_message = (
                     error_message = (
-                        "The Core service should be stopped by running core.stop() before"
+                        "The Orchestrator service should be stopped by running orchestrator.stop() before"
                         " modifying the Configuration."
                         " modifying the Configuration."
                     )
                     )
                     cls.__logger.error(f"ConfigurationUpdateBlocked: {error_message}")
                     cls.__logger.error(f"ConfigurationUpdateBlocked: {error_message}")

+ 2 - 2
taipy/config/config.pyi

@@ -861,7 +861,7 @@ class Config:
         force: Optional[bool] = None,
         force: Optional[bool] = None,
         **properties,
         **properties,
     ) -> "CoreSection":
     ) -> "CoreSection":
-        """Configure the Core service.
+        """Configure the Orchestrator service.
 
 
         Parameters:
         Parameters:
             root_folder (Optional[str]): Path of the base folder for the taipy application.
             root_folder (Optional[str]): Path of the base folder for the taipy application.
@@ -887,7 +887,7 @@ class Config:
             force (Optional[bool]): If True, Taipy will override a version even if the configuration
             force (Optional[bool]): If True, Taipy will override a version even if the configuration
                 has changed and run the application.
                 has changed and run the application.
             **properties (Dict[str, Any]): A keyworded variable length list of additional arguments configure the
             **properties (Dict[str, Any]): A keyworded variable length list of additional arguments configure the
-                behavior of the `Core^` service.
+                behavior of the `Orchestrator^` service.
         Returns:
         Returns:
             The Core configuration.
             The Core configuration.
         """
         """

+ 5 - 4
taipy/core/__init__.py

@@ -30,11 +30,12 @@ in the following section on [Function](#functions). In particular, the most used
 
 
 !!! Note
 !!! Note
 
 
-    Taipy Core provides a runnable service, `Core^` that runs as a service in a dedicated thread. The purpose is to
-    have a dedicated thread responsible for dispatching the submitted jobs to an available executor for their execution.
+    Taipy provides a runnable service, `Orchestrator^` that runs as a service in a dedicated thread.
+    The purpose is to have a dedicated thread responsible for dispatching the submitted jobs to an available
+    executor for their execution.
 
 
-    In particular, this `Core^` service is automatically run when Core is used with Taipy REST or Taipy GUI. See the
-    [running services](../../../run-deploy/run/running_services.md) page of the user manual for more details.
+    In particular, this `Orchestrator^` service is automatically run when used with Taipy REST or Taipy GUI.
+    See the [running services](../../../run-deploy/run/running_services.md) page of the user manual for more details.
 """
 """
 
 
 from ._init import *
 from ._init import *

+ 1 - 1
taipy/core/_init.py

@@ -9,7 +9,6 @@
 # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 # specific language governing permissions and limitations under the License.
 # specific language governing permissions and limitations under the License.
 
 
-from ._core import Core
 from ._entity.submittable import Submittable
 from ._entity.submittable import Submittable
 from .cycle.cycle import Cycle
 from .cycle.cycle import Cycle
 from .cycle.cycle_id import CycleId
 from .cycle.cycle_id import CycleId
@@ -18,6 +17,7 @@ from .data.data_node_id import DataNodeId
 from .job.job import Job
 from .job.job import Job
 from .job.job_id import JobId
 from .job.job_id import JobId
 from .job.status import Status
 from .job.status import Status
+from .orchestrator import Orchestrator
 from .scenario.scenario import Scenario
 from .scenario.scenario import Scenario
 from .scenario.scenario_id import ScenarioId
 from .scenario.scenario_id import ScenarioId
 from .sequence.sequence import Sequence
 from .sequence.sequence import Sequence

+ 2 - 2
taipy/core/common/_warnings.py

@@ -24,14 +24,14 @@ def _warn_deprecated(deprecated: str, suggest: Optional[str] = None, stacklevel:
     warnings.warn(message=message, category=category, stacklevel=stacklevel)
     warnings.warn(message=message, category=category, stacklevel=stacklevel)
 
 
 
 
-def _warn_no_core_service(specific_message, stacklevel: int = 3):
+def _warn_no_orchestrator_service(specific_message, stacklevel: int = 3):
     def inner(f):
     def inner(f):
         @functools.wraps(f)
         @functools.wraps(f)
         def _check_if_core_service_is_running(*args, **kwargs):
         def _check_if_core_service_is_running(*args, **kwargs):
             from .._orchestrator._orchestrator_factory import _OrchestratorFactory
             from .._orchestrator._orchestrator_factory import _OrchestratorFactory
 
 
             if not _OrchestratorFactory._dispatcher:
             if not _OrchestratorFactory._dispatcher:
-                message = f"The Core service is NOT running. {specific_message}"
+                message = f"The Orchestrator service is NOT running. {specific_message}"
                 warnings.warn(message=message, category=ResourceWarning, stacklevel=stacklevel)
                 warnings.warn(message=message, category=ResourceWarning, stacklevel=stacklevel)
 
 
             return f(*args, **kwargs)
             return f(*args, **kwargs)

+ 1 - 1
taipy/core/config/config.schema.json

@@ -6,7 +6,7 @@
   "type": "object",
   "type": "object",
   "properties": {
   "properties": {
     "CORE": {
     "CORE": {
-      "description": "Core service",
+      "description": "Orchestrator service",
       "type": "object",
       "type": "object",
       "properties": {
       "properties": {
         "core_version": {
         "core_version": {

+ 4 - 4
taipy/core/config/core_section.py

@@ -32,7 +32,7 @@ from ..exceptions.exceptions import ConfigCoreVersionMismatched
 
 
 class CoreSection(UniqueSection):
 class CoreSection(UniqueSection):
     """
     """
-    Configuration parameters for running the `Core^` service.
+    Configuration parameters for running the `Orchestrator^` service.
 
 
     Attributes:
     Attributes:
         root_folder (str): Path of the base folder for the taipy application. The default value is "./taipy/"
         root_folder (str): Path of the base folder for the taipy application. The default value is "./taipy/"
@@ -46,7 +46,7 @@ class CoreSection(UniqueSection):
             repository.
             repository.
         read_entity_retry (int): Number of retries to read an entity from the repository before return failure.
         read_entity_retry (int): Number of retries to read an entity from the repository before return failure.
             The default value is 3.
             The default value is 3.
-        mode (str): The Taipy operating mode. By default, the `Core^` service runs in "development" mode.
+        mode (str): The Taipy operating mode. By default, the `Orchestrator^` service runs in "development" mode.
             Please refer to the [Versioning management](../../userman/versioning/index.md)
             Please refer to the [Versioning management](../../userman/versioning/index.md)
             documentation page for more details.
             documentation page for more details.
         version_number (str)): The identifier of the user application version. Please refer to the
         version_number (str)): The identifier of the user application version. Please refer to the
@@ -354,7 +354,7 @@ class CoreSection(UniqueSection):
         force: Optional[bool] = None,
         force: Optional[bool] = None,
         **properties,
         **properties,
     ) -> "CoreSection":
     ) -> "CoreSection":
-        """Configure the Core service.
+        """Configure the Orchestrator service.
 
 
         Parameters:
         Parameters:
             root_folder (Optional[str]): Path of the base folder for the taipy application.
             root_folder (Optional[str]): Path of the base folder for the taipy application.
@@ -380,7 +380,7 @@ class CoreSection(UniqueSection):
             force (Optional[bool]): If True, Taipy will override a version even if the configuration
             force (Optional[bool]): If True, Taipy will override a version even if the configuration
                 has changed and run the application.
                 has changed and run the application.
             **properties (Dict[str, Any]): A keyworded variable length list of additional arguments configure the
             **properties (Dict[str, Any]): A keyworded variable length list of additional arguments configure the
-                behavior of the `Core^` service.
+                behavior of the `Orchestrator^` service.
         Returns:
         Returns:
             The Core configuration.
             The Core configuration.
         """
         """

+ 2 - 2
taipy/core/exceptions/exceptions.py

@@ -23,8 +23,8 @@ class ConfigCoreVersionMismatched(Exception):
         )
         )
 
 
 
 
-class CoreServiceIsAlreadyRunning(Exception):
-    """Raised if the Core service is already running."""
+class OrchestratorServiceIsAlreadyRunning(Exception):
+    """Raised if the Orchestrator service is already running."""
 
 
 
 
 class CycleAlreadyExists(Exception):
 class CycleAlreadyExists(Exception):

+ 11 - 11
taipy/core/_core.py → taipy/core/orchestrator.py

@@ -21,12 +21,12 @@ from ._orchestrator._orchestrator import _Orchestrator
 from ._orchestrator._orchestrator_factory import _OrchestratorFactory
 from ._orchestrator._orchestrator_factory import _OrchestratorFactory
 from ._version._version_manager_factory import _VersionManagerFactory
 from ._version._version_manager_factory import _VersionManagerFactory
 from .config import CoreSection
 from .config import CoreSection
-from .exceptions.exceptions import CoreServiceIsAlreadyRunning
+from .exceptions.exceptions import OrchestratorServiceIsAlreadyRunning
 
 
 
 
-class Core:
+class Orchestrator:
     """
     """
-    Core service
+    Orchestrator service
     """
     """
 
 
     _is_running = False
     _is_running = False
@@ -42,30 +42,30 @@ class Core:
 
 
     def __init__(self) -> None:
     def __init__(self) -> None:
         """
         """
-        Initialize a Core service.
+        Initialize a Orchestrator service.
         """
         """
         pass
         pass
 
 
     def run(self, force_restart=False):
     def run(self, force_restart=False):
         """
         """
-        Start a Core service.
+        Start a Orchestrator service.
 
 
         This function checks and locks the configuration, manages application's version,
         This function checks and locks the configuration, manages application's version,
         and starts a job dispatcher.
         and starts a job dispatcher.
         """
         """
         if self.__class__._is_running:
         if self.__class__._is_running:
-            raise CoreServiceIsAlreadyRunning
+            raise OrchestratorServiceIsAlreadyRunning
 
 
         with self.__class__.__lock_is_running:
         with self.__class__.__lock_is_running:
             self.__class__._is_running = True
             self.__class__._is_running = True
 
 
         self._manage_version_and_block_config()
         self._manage_version_and_block_config()
         self.__start_dispatcher(force_restart)
         self.__start_dispatcher(force_restart)
-        self.__logger.info("Core service has been started.")
+        self.__logger.info("Orchestrator service has been started.")
 
 
     def stop(self, wait: bool = True, timeout: Optional[float] = None):
     def stop(self, wait: bool = True, timeout: Optional[float] = None):
         """
         """
-        Stop the Core service.
+        Stop the Orchestrator service.
         This function stops the dispatcher and unblock the Config for update.
         This function stops the dispatcher and unblock the Config for update.
 
 
         Parameters:
         Parameters:
@@ -82,7 +82,7 @@ class Core:
             self.__class__._is_running = False
             self.__class__._is_running = False
         with self.__class__.__lock_version_is_initialized:
         with self.__class__.__lock_version_is_initialized:
             self.__class__._version_is_initialized = False
             self.__class__._version_is_initialized = False
-        self.__logger.info("Core service has been stopped.")
+        self.__logger.info("Orchestrator service has been stopped.")
 
 
     @classmethod
     @classmethod
     def _manage_version_and_block_config(cls):
     def _manage_version_and_block_config(cls):
@@ -95,12 +95,12 @@ class Core:
         with cls.__lock_version_is_initialized:
         with cls.__lock_version_is_initialized:
             cls._version_is_initialized = True
             cls._version_is_initialized = True
 
 
-        cls.__update_core_section()
+        cls.__update_orchestrator_section()
         cls.__manage_version()
         cls.__manage_version()
         cls.__check_and_block_config()
         cls.__check_and_block_config()
 
 
     @classmethod
     @classmethod
-    def __update_core_section(cls):
+    def __update_orchestrator_section(cls):
         cls.__logger.info("Updating configuration with command-line arguments...")
         cls.__logger.info("Updating configuration with command-line arguments...")
         _core_cli = _CoreCLIFactory._build_cli()
         _core_cli = _CoreCLIFactory._build_cli()
         _core_cli.create_parser()
         _core_cli.create_parser()

+ 5 - 5
taipy/core/taipy.py

@@ -15,7 +15,6 @@ from typing import Any, Callable, Dict, List, Literal, Optional, Set, Union, ove
 from taipy.config import Scope
 from taipy.config import Scope
 from taipy.logger._taipy_logger import _TaipyLogger
 from taipy.logger._taipy_logger import _TaipyLogger
 
 
-from ._core import Core
 from ._entity._entity import _Entity
 from ._entity._entity import _Entity
 from ._version._version_manager_factory import _VersionManagerFactory
 from ._version._version_manager_factory import _VersionManagerFactory
 from .common._check_instance import (
 from .common._check_instance import (
@@ -27,7 +26,7 @@ from .common._check_instance import (
     _is_submission,
     _is_submission,
     _is_task,
     _is_task,
 )
 )
-from .common._warnings import _warn_deprecated, _warn_no_core_service
+from .common._warnings import _warn_deprecated, _warn_no_orchestrator_service
 from .config.data_node_config import DataNodeConfig
 from .config.data_node_config import DataNodeConfig
 from .config.scenario_config import ScenarioConfig
 from .config.scenario_config import ScenarioConfig
 from .cycle._cycle_manager_factory import _CycleManagerFactory
 from .cycle._cycle_manager_factory import _CycleManagerFactory
@@ -40,6 +39,7 @@ from .exceptions.exceptions import DataNodeConfigIsNotGlobal, ModelNotFound, Non
 from .job._job_manager_factory import _JobManagerFactory
 from .job._job_manager_factory import _JobManagerFactory
 from .job.job import Job
 from .job.job import Job
 from .job.job_id import JobId
 from .job.job_id import JobId
+from .orchestrator import Orchestrator
 from .reason import EntityDoesNotExist, EntityIsNotSubmittableEntity, ReasonCollection
 from .reason import EntityDoesNotExist, EntityIsNotSubmittableEntity, ReasonCollection
 from .scenario._scenario_manager_factory import _ScenarioManagerFactory
 from .scenario._scenario_manager_factory import _ScenarioManagerFactory
 from .scenario.scenario import Scenario
 from .scenario.scenario import Scenario
@@ -216,7 +216,7 @@ def is_readable(
     return ReasonCollection()._add_reason(str(entity), EntityDoesNotExist(str(entity)))
     return ReasonCollection()._add_reason(str(entity), EntityDoesNotExist(str(entity)))
 
 
 
 
-@_warn_no_core_service("The submitted entity will not be executed until the Core service is running.")
+@_warn_no_orchestrator_service("The submitted entity will not be executed until the Orchestrator service is running.")
 def submit(
 def submit(
     entity: Union[Scenario, Sequence, Task],
     entity: Union[Scenario, Sequence, Task],
     force: bool = False,
     force: bool = False,
@@ -922,7 +922,7 @@ def create_scenario(
         SystemExit: If the configuration check returns some errors.
         SystemExit: If the configuration check returns some errors.
 
 
     """
     """
-    Core._manage_version_and_block_config()
+    Orchestrator._manage_version_and_block_config()
 
 
     return _ScenarioManagerFactory._build_manager()._create(config, creation_date, name)
     return _ScenarioManagerFactory._build_manager()._create(config, creation_date, name)
 
 
@@ -947,7 +947,7 @@ def create_global_data_node(config: DataNodeConfig) -> DataNode:
     if config.scope is not Scope.GLOBAL:
     if config.scope is not Scope.GLOBAL:
         raise DataNodeConfigIsNotGlobal(config.id)
         raise DataNodeConfigIsNotGlobal(config.id)
 
 
-    Core._manage_version_and_block_config()
+    Orchestrator._manage_version_and_block_config()
 
 
     if dns := _DataManagerFactory._build_manager()._get_by_config_id(config.id):
     if dns := _DataManagerFactory._build_manager()._get_by_config_id(config.id):
         return dns[0]
         return dns[0]

+ 24 - 28
taipy/gui/data/pandas_data_accessor.py

@@ -56,7 +56,7 @@ class _PandasDataAccessor(_DataAccessor):
 
 
     @staticmethod
     @staticmethod
     def get_supported_classes() -> t.List[t.Type]:
     def get_supported_classes() -> t.List[t.Type]:
-        return  list(_PandasDataAccessor.__types)
+        return list(_PandasDataAccessor.__types)
 
 
     @staticmethod
     @staticmethod
     def __user_function(
     def __user_function(
@@ -88,37 +88,34 @@ class _PandasDataAccessor(_DataAccessor):
         new_indexes: t.Optional[np.ndarray] = None,
         new_indexes: t.Optional[np.ndarray] = None,
         handle_nan: t.Optional[bool] = False,
         handle_nan: t.Optional[bool] = False,
     ) -> pd.DataFrame:
     ) -> pd.DataFrame:
+        dataframe = dataframe.iloc[new_indexes] if new_indexes is not None else dataframe
         if isinstance(payload_cols, list) and len(payload_cols):
         if isinstance(payload_cols, list) and len(payload_cols):
             col_types = dataframe.dtypes[dataframe.dtypes.index.astype(str).isin(payload_cols)]
             col_types = dataframe.dtypes[dataframe.dtypes.index.astype(str).isin(payload_cols)]
         else:
         else:
             col_types = dataframe.dtypes
             col_types = dataframe.dtypes
         cols = col_types.index.astype(str).tolist()
         cols = col_types.index.astype(str).tolist()
+        new_cols = {}
         if styles:
         if styles:
-            if not is_copied:
-                # copy the df so that we don't "mess" with the user's data
-                dataframe = dataframe.copy()
-                is_copied = True
             for k, v in styles.items():
             for k, v in styles.items():
-                col_applied = False
+                col_applied = ""
                 func = self._gui._get_user_function(v)
                 func = self._gui._get_user_function(v)
                 if callable(func):
                 if callable(func):
-                    col_applied = self.__apply_user_function(func, k if k in cols else None, v, dataframe, "tps__")
-                if not col_applied:
-                    dataframe[v] = v
-                cols.append(col_applied or v)
+                    col_applied, new_data = self.__apply_user_function(
+                        func, k if k in cols else None, v, dataframe, "tps__"
+                    )
+                new_cols[col_applied or v] = new_data if col_applied else v
         if tooltips:
         if tooltips:
-            if not is_copied:
-                # copy the df so that we don't "mess" with the user's data
-                dataframe = dataframe.copy()
-                is_copied = True
             for k, v in tooltips.items():
             for k, v in tooltips.items():
-                col_applied = False
+                col_applied = ""
                 func = self._gui._get_user_function(v)
                 func = self._gui._get_user_function(v)
                 if callable(func):
                 if callable(func):
-                    col_applied = self.__apply_user_function(func, k if k in cols else None, v, dataframe, "tpt__")
-                cols.append(col_applied or v)
+                    col_applied, new_data = self.__apply_user_function(
+                        func, k if k in cols else None, v, dataframe, "tpt__"
+                    )
+                    if col_applied:
+                        new_cols[col_applied] = new_data
         # deal with dates
         # deal with dates
-        datecols = col_types[col_types.astype(str).str.startswith("datetime")].index.tolist()  # type: ignore
+        datecols = col_types[col_types.astype(str).str.startswith("datetime")].index.tolist()
         if len(datecols) != 0:
         if len(datecols) != 0:
             if not is_copied:
             if not is_copied:
                 # copy the df so that we don't "mess" with the user's data
                 # copy the df so that we don't "mess" with the user's data
@@ -126,11 +123,10 @@ class _PandasDataAccessor(_DataAccessor):
             tz = Gui._get_timezone()
             tz = Gui._get_timezone()
             for col in datecols:
             for col in datecols:
                 newcol = _get_date_col_str_name(cols, col)
                 newcol = _get_date_col_str_name(cols, col)
-                cols.append(newcol)
                 re_type = _RE_PD_TYPE.match(str(col_types[col]))
                 re_type = _RE_PD_TYPE.match(str(col_types[col]))
                 grps = re_type.groups() if re_type else ()
                 grps = re_type.groups() if re_type else ()
                 if len(grps) > 4 and grps[4]:
                 if len(grps) > 4 and grps[4]:
-                    dataframe[newcol] = (
+                    new_cols[newcol] = (
                         dataframe[col]
                         dataframe[col]
                         .dt.tz_convert("UTC")
                         .dt.tz_convert("UTC")
                         .dt.strftime(_DataAccessor._WS_DATE_FORMAT)
                         .dt.strftime(_DataAccessor._WS_DATE_FORMAT)
@@ -138,7 +134,7 @@ class _PandasDataAccessor(_DataAccessor):
                         .replace("nan", "NaT" if handle_nan else None)
                         .replace("nan", "NaT" if handle_nan else None)
                     )
                     )
                 else:
                 else:
-                    dataframe[newcol] = (
+                    new_cols[newcol] = (
                         dataframe[col]
                         dataframe[col]
                         .dt.tz_localize(tz)
                         .dt.tz_localize(tz)
                         .dt.tz_convert("UTC")
                         .dt.tz_convert("UTC")
@@ -149,8 +145,10 @@ class _PandasDataAccessor(_DataAccessor):
 
 
             # remove the date columns from the list of columns
             # remove the date columns from the list of columns
             cols = list(set(cols) - set(datecols))
             cols = list(set(cols) - set(datecols))
-        dataframe = dataframe.iloc[new_indexes] if new_indexes is not None else dataframe
-        dataframe = dataframe.loc[:, dataframe.dtypes[dataframe.dtypes.index.astype(str).isin(cols)].index]  # type: ignore
+        if new_cols:
+            dataframe = dataframe.assign(**new_cols)
+        cols += list(new_cols.keys())
+        dataframe = dataframe.loc[:, dataframe.dtypes[dataframe.dtypes.index.astype(str).isin(cols)].index]  # type: ignore[index]
         return dataframe
         return dataframe
 
 
     def __apply_user_function(
     def __apply_user_function(
@@ -163,15 +161,14 @@ class _PandasDataAccessor(_DataAccessor):
     ):
     ):
         try:
         try:
             new_col_name = f"{prefix}{column_name}__{function_name}" if column_name else function_name
             new_col_name = f"{prefix}{column_name}__{function_name}" if column_name else function_name
-            data[new_col_name] = data.apply(
+            return new_col_name, data.apply(
                 _PandasDataAccessor.__user_function,
                 _PandasDataAccessor.__user_function,
                 axis=1,
                 axis=1,
                 args=(self._gui, column_name, user_function, function_name),
                 args=(self._gui, column_name, user_function, function_name),
             )
             )
-            return new_col_name
         except Exception as e:
         except Exception as e:
             _warn(f"Exception raised when invoking user function {function_name}()", e)
             _warn(f"Exception raised when invoking user function {function_name}()", e)
-        return False
+        return "", data
 
 
     def __format_data(
     def __format_data(
         self,
         self,
@@ -246,9 +243,8 @@ class _PandasDataAccessor(_DataAccessor):
         # add index if not chart
         # add index if not chart
         if paged:
         if paged:
             if _PandasDataAccessor.__INDEX_COL not in df.columns:
             if _PandasDataAccessor.__INDEX_COL not in df.columns:
-                df = df.copy()
                 is_copied = True
                 is_copied = True
-                df[_PandasDataAccessor.__INDEX_COL] = df.index
+                df = df.assign(**{_PandasDataAccessor.__INDEX_COL: df.index})
             if columns and _PandasDataAccessor.__INDEX_COL not in columns:
             if columns and _PandasDataAccessor.__INDEX_COL not in columns:
                 columns.append(_PandasDataAccessor.__INDEX_COL)
                 columns.append(_PandasDataAccessor.__INDEX_COL)
 
 

+ 1 - 1
taipy/templates/default/cookiecutter.json

@@ -11,7 +11,7 @@
     "__main_file": "{{ cookiecutter['Application main Python file'][:-3] if cookiecutter['Application main Python file'].endswith('.py') else cookiecutter['Application main Python file'] }}",
     "__main_file": "{{ cookiecutter['Application main Python file'][:-3] if cookiecutter['Application main Python file'].endswith('.py') else cookiecutter['Application main Python file'] }}",
     "__application_title": "{{ cookiecutter['Application title'] }}",
     "__application_title": "{{ cookiecutter['Application title'] }}",
     "__pages": "{{ cookiecutter['Page names in multi-page application?'] }}",
     "__pages": "{{ cookiecutter['Page names in multi-page application?'] }}",
-    "__core": "{{ cookiecutter['Does the application use scenario management or version management?'] }}",
+    "__orchestrator": "{{ cookiecutter['Does the application use scenario management or version management?'] }}",
     "__rest": "{{ cookiecutter['Does the application use Rest API?'] }}",
     "__rest": "{{ cookiecutter['Does the application use Rest API?'] }}",
     "__git": "{{ cookiecutter['Do you want to initialize a new Git repository?']}}"
     "__git": "{{ cookiecutter['Do you want to initialize a new Git repository?']}}"
 }
 }

+ 11 - 11
taipy/templates/default/hooks/post_gen_project.py

@@ -14,8 +14,8 @@ import shutil
 import subprocess
 import subprocess
 
 
 
 
-def handle_services(use_rest, use_core):
-    if use_core or use_rest:
+def handle_services(use_rest, use_orchestrator):
+    if use_orchestrator or use_rest:
         # Write "import taipy as tp" at the third line of the import.txt file
         # Write "import taipy as tp" at the third line of the import.txt file
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "r") as import_file:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "r") as import_file:
             import_lines = import_file.readlines()
             import_lines = import_file.readlines()
@@ -24,12 +24,12 @@ def handle_services(use_rest, use_core):
             import_file.writelines(import_lines)
             import_file.writelines(import_lines)
 
 
     # Import the necessary services
     # Import the necessary services
-    if use_core and use_rest:
+    if use_orchestrator and use_rest:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
-            import_file.write("from taipy import Core, Rest\n")
-    elif use_core:
+            import_file.write("from taipy import Orchestrator, Rest\n")
+    elif use_orchestrator:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
-            import_file.write("from taipy import Core\n")
+            import_file.write("from taipy import Orchestrator\n")
     elif use_rest:
     elif use_rest:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
             import_file.write("from taipy import Rest\n")
             import_file.write("from taipy import Rest\n")
@@ -39,12 +39,12 @@ def handle_services(use_rest, use_core):
         with open(os.path.join(os.getcwd(), "sections", "main.txt"), "a") as main_file:
         with open(os.path.join(os.getcwd(), "sections", "main.txt"), "a") as main_file:
             main_file.write("    rest = Rest()\n")
             main_file.write("    rest = Rest()\n")
 
 
-    if use_core:
+    if use_orchestrator:
         # Create and submit the placeholder scenario
         # Create and submit the placeholder scenario
         with open(os.path.join(os.getcwd(), "sections", "main.txt"), "a") as main_file:
         with open(os.path.join(os.getcwd(), "sections", "main.txt"), "a") as main_file:
-            main_file.write("    core = Core()\n")
+            main_file.write("    orchestrator = Orchestrator()\n")
             if not use_rest:
             if not use_rest:
-                main_file.write("    core.run()\n")
+                main_file.write("    orchestrator.run()\n")
             main_file.write("    # #############################################################################\n")
             main_file.write("    # #############################################################################\n")
             main_file.write("    # PLACEHOLDER: Create and submit your scenario here                           #\n")
             main_file.write("    # PLACEHOLDER: Create and submit your scenario here                           #\n")
             main_file.write("    #                                                                             #\n")
             main_file.write("    #                                                                             #\n")
@@ -171,9 +171,9 @@ def initialize_as_git_project(project_dir: str) -> str:
     return msg
     return msg
 
 
 
 
-use_core = "{{ cookiecutter.__core }}".upper()
+use_orchestrator = "{{ cookiecutter.__orchestrator }}".upper()
 use_rest = "{{ cookiecutter.__rest }}".upper()
 use_rest = "{{ cookiecutter.__rest }}".upper()
-handle_services(use_rest in ["YES", "Y"], use_core in ["YES", "Y"])
+handle_services(use_rest in ["YES", "Y"], use_orchestrator in ["YES", "Y"])
 
 
 pages = "{{ cookiecutter.__pages }}".split(" ")
 pages = "{{ cookiecutter.__pages }}".split(" ")
 # Remove empty string from pages list
 # Remove empty string from pages list

+ 1 - 1
taipy/templates/default/{{cookiecutter.__root_folder_name}}/configuration/config.py

@@ -12,7 +12,7 @@
 """
 """
 Contain the application's configuration including the scenario configurations.
 Contain the application's configuration including the scenario configurations.
 
 
-The configuration is run by the Core service.
+The configuration is run when starting the Orchestrator.
 """
 """
 
 
 from algorithms import *
 from algorithms import *

+ 4 - 4
taipy/templates/scenario-management/{{cookiecutter.__root_folder_name}}/{{cookiecutter.__main_file}}.py

@@ -14,7 +14,7 @@ from pages import job_page, scenario_page
 from pages.root import content, root, selected_data_node, selected_scenario
 from pages.root import content, root, selected_data_node, selected_scenario
 
 
 import taipy as tp
 import taipy as tp
-from taipy import Core, Gui
+from taipy import Gui, Orchestrator
 
 
 
 
 def on_init(state):
 def on_init(state):
@@ -34,10 +34,10 @@ pages = {
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
-    # Instantiate, configure and run the Core
-    core = Core()
+    # Instantiate, configure and run the Orchestrator
+    orchestrator = Orchestrator()
     default_scenario_cfg = configure()
     default_scenario_cfg = configure()
-    core.run()
+    orchestrator.run()
 
 
     # ##################################################################################################################
     # ##################################################################################################################
     # PLACEHOLDER: Initialize your data application here                                                               #
     # PLACEHOLDER: Initialize your data application here                                                               #

+ 7 - 7
tests/core/_orchestrator/test_orchestrator__submit.py

@@ -18,7 +18,7 @@ import pytest
 
 
 from taipy import Scenario, Scope, Task
 from taipy import Scenario, Scope, Task
 from taipy.config import Config
 from taipy.config import Config
-from taipy.core import Core, taipy
+from taipy.core import Orchestrator, taipy
 from taipy.core._orchestrator._orchestrator import _Orchestrator
 from taipy.core._orchestrator._orchestrator import _Orchestrator
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core.config import JobConfig
 from taipy.core.config import JobConfig
@@ -520,8 +520,8 @@ def task_sleep_2():
 
 
 
 
 def test_submit_duration_development_mode():
 def test_submit_duration_development_mode():
-    core = Core()
-    core.run()
+    orchestrator = Orchestrator()
+    orchestrator.run()
 
 
     task_1 = Task("task_config_id_1", {}, task_sleep_1, [], [])
     task_1 = Task("task_config_id_1", {}, task_sleep_1, [], [])
     task_2 = Task("task_config_id_2", {}, task_sleep_2, [], [])
     task_2 = Task("task_config_id_2", {}, task_sleep_2, [], [])
@@ -533,7 +533,7 @@ def test_submit_duration_development_mode():
     _ScenarioManager._set(scenario)
     _ScenarioManager._set(scenario)
     submission = taipy.submit(scenario)
     submission = taipy.submit(scenario)
     jobs = submission.jobs
     jobs = submission.jobs
-    core.stop()
+    orchestrator.stop()
 
 
     assert all(isinstance(job.execution_started_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_started_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_ended_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_ended_at, datetime) for job in jobs)
@@ -550,8 +550,8 @@ def test_submit_duration_development_mode():
 @pytest.mark.standalone
 @pytest.mark.standalone
 def test_submit_duration_standalone_mode():
 def test_submit_duration_standalone_mode():
     Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE)
     Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE)
-    core = Core()
-    core.run()
+    orchestrator = Orchestrator()
+    orchestrator.run()
 
 
     task_1 = Task("task_config_id_1", {}, task_sleep_1, [], [])
     task_1 = Task("task_config_id_1", {}, task_sleep_1, [], [])
     task_2 = Task("task_config_id_2", {}, task_sleep_2, [], [])
     task_2 = Task("task_config_id_2", {}, task_sleep_2, [], [])
@@ -566,7 +566,7 @@ def test_submit_duration_standalone_mode():
 
 
     assert_true_after_time(jobs[1].is_completed)
     assert_true_after_time(jobs[1].is_completed)
 
 
-    core.stop()
+    orchestrator.stop()
 
 
     assert all(isinstance(job.execution_started_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_started_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_ended_at, datetime) for job in jobs)
     assert all(isinstance(job.execution_ended_at, datetime) for job in jobs)

+ 34 - 34
tests/core/_version/test_version_cli.py

@@ -18,7 +18,7 @@ from taipy._entrypoint import _entrypoint
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.scope import Scope
 from taipy.config.common.scope import Scope
 from taipy.config.config import Config
 from taipy.config.config import Config
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.core._version._cli._version_cli_factory import _VersionCLIFactory
 from taipy.core._version._cli._version_cli_factory import _VersionCLIFactory
 from taipy.core._version._version_manager import _VersionManager
 from taipy.core._version._version_manager import _VersionManager
 from taipy.core.data._data_manager import _DataManager
 from taipy.core.data._data_manager import _DataManager
@@ -39,32 +39,32 @@ def test_delete_version(caplog):
     scenario_config = config_scenario()
     scenario_config = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.1"]):
     with patch("sys.argv", ["prog", "--experiment", "1.1"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     all_versions = [version.id for version in _VersionManager._get_all()]
     all_versions = [version.id for version in _VersionManager._get_all()]
     assert len(all_versions) == 4
     assert len(all_versions) == 4
@@ -91,19 +91,19 @@ def test_delete_version(caplog):
 
 
 def test_list_versions(capsys):
 def test_list_versions(capsys):
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
     sleep(0.05)
     sleep(0.05)
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
     sleep(0.05)
     sleep(0.05)
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
 
 
     _VersionCLIFactory._build_cli().create_parser()
     _VersionCLIFactory._build_cli().create_parser()
     with pytest.raises(SystemExit):
     with pytest.raises(SystemExit):
@@ -123,18 +123,18 @@ def test_rename_version(caplog):
     scenario_config = config_scenario()
     scenario_config = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     dev_ver = _VersionManager._get_development_version()
     dev_ver = _VersionManager._get_development_version()
 
 
@@ -168,11 +168,11 @@ def test_compare_version_config(caplog, init_config):
     scenario_config_1 = config_scenario()
     scenario_config_1 = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config_1)
         scenario = _ScenarioManager._create(scenario_config_1)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     init_config()
     init_config()
 
 
@@ -180,11 +180,11 @@ def test_compare_version_config(caplog, init_config):
     Config.configure_data_node(id="d2", storage_type="csv", default_path="bar.csv")
     Config.configure_data_node(id="d2", storage_type="csv", default_path="bar.csv")
 
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config_2)
         scenario = _ScenarioManager._create(scenario_config_2)
         _ScenarioManager._submit(scenario)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     _VersionCLIFactory._build_cli().create_parser()
     _VersionCLIFactory._build_cli().create_parser()
     with pytest.raises(SystemExit):
     with pytest.raises(SystemExit):

+ 13 - 13
tests/core/config/test_core_section.py

@@ -16,7 +16,7 @@ import pytest
 
 
 from taipy.config import Config
 from taipy.config import Config
 from taipy.config.exceptions.exceptions import MissingEnvVariableError
 from taipy.config.exceptions.exceptions import MissingEnvVariableError
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
 from taipy.core.config import CoreSection
 from taipy.core.config import CoreSection
 from tests.core.utils.named_temporary_file import NamedTemporaryFile
 from tests.core.utils.named_temporary_file import NamedTemporaryFile
@@ -24,21 +24,21 @@ from tests.core.utils.named_temporary_file import NamedTemporaryFile
 
 
 def test_core_section():
 def test_core_section():
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
     assert Config.core.mode == "development"
     assert Config.core.mode == "development"
     assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
     assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
     assert not Config.core.force
     assert not Config.core.force
-    core.stop()
+    orchestrator.stop()
 
 
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
         Config.configure_core(mode="experiment", version_number="test_num", force=True)
         Config.configure_core(mode="experiment", version_number="test_num", force=True)
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
     assert Config.core.mode == "experiment"
     assert Config.core.mode == "experiment"
     assert Config.core.version_number == "test_num"
     assert Config.core.version_number == "test_num"
     assert Config.core.force
     assert Config.core.force
-    core.stop()
+    orchestrator.stop()
 
 
     toml_config = NamedTemporaryFile(
     toml_config = NamedTemporaryFile(
         content="""
         content="""
@@ -52,20 +52,20 @@ force = "true:bool"
     )
     )
     Config.load(toml_config.filename)
     Config.load(toml_config.filename)
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
     assert Config.core.mode == "experiment"
     assert Config.core.mode == "experiment"
     assert Config.core.version_number == "test_num_2"
     assert Config.core.version_number == "test_num_2"
     assert Config.core.force
     assert Config.core.force
-    core.stop()
+    orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "test_num_3", "--no-taipy-force"]):
     with patch("sys.argv", ["prog", "--experiment", "test_num_3", "--no-taipy-force"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == "test_num_3"
         assert Config.core.version_number == "test_num_3"
         assert not Config.core.force
         assert not Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_config_attribute_overiden_by_code_config_including_env_variable_values():
 def test_config_attribute_overiden_by_code_config_including_env_variable_values():

+ 3 - 3
tests/core/conftest.py

@@ -25,7 +25,6 @@ from taipy.config.checker._checker import _Checker
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.scope import Scope
 from taipy.config.common.scope import Scope
 from taipy.config.config import Config
 from taipy.config.config import Config
-from taipy.core._core import Core
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core._version._version import _Version
 from taipy.core._version._version import _Version
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
@@ -48,6 +47,7 @@ from taipy.core.job._job_manager_factory import _JobManagerFactory
 from taipy.core.job.job import Job
 from taipy.core.job.job import Job
 from taipy.core.job.job_id import JobId
 from taipy.core.job.job_id import JobId
 from taipy.core.notification.notifier import Notifier
 from taipy.core.notification.notifier import Notifier
+from taipy.core.orchestrator import Orchestrator
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario._scenario_model import _ScenarioModel
 from taipy.core.scenario._scenario_model import _ScenarioModel
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.scenario.scenario import Scenario
@@ -354,8 +354,8 @@ def init_config(reset_configuration_singleton, inject_core_sections):
         _Checker.add_checker(_ScenarioConfigChecker)
         _Checker.add_checker(_ScenarioConfigChecker)
 
 
         Config.configure_core(read_entity_retry=0)
         Config.configure_core(read_entity_retry=0)
-        Core._is_running = False
-        Core._version_is_initialized = False
+        Orchestrator._is_running = False
+        Orchestrator._version_is_initialized = False
 
 
     return _init_config
     return _init_config
 
 

+ 7 - 7
tests/core/test_complex_application.py

@@ -17,7 +17,7 @@ import pandas as pd
 
 
 import taipy.core.taipy as tp
 import taipy.core.taipy as tp
 from taipy.config import Config
 from taipy.config import Config
-from taipy.core import Core, Status
+from taipy.core import Orchestrator, Status
 
 
 # ################################  USER FUNCTIONS  ##################################
 # ################################  USER FUNCTIONS  ##################################
 
 
@@ -75,8 +75,8 @@ def test_skipped_jobs():
     task_config_2 = Config.configure_task("second", mult_by_2, intermediate_config, output_config, skippable=True)
     task_config_2 = Config.configure_task("second", mult_by_2, intermediate_config, output_config, skippable=True)
     scenario_config = Config.configure_scenario("scenario", [task_config_1, task_config_2])
     scenario_config = Config.configure_scenario("scenario", [task_config_1, task_config_2])
 
 
-    core = Core()
-    core.run()
+    orchestrator = Orchestrator()
+    orchestrator.run()
 
 
     scenario = tp.create_scenario(scenario_config)
     scenario = tp.create_scenario(scenario_config)
     scenario.input_dn.write(2)
     scenario.input_dn.write(2)
@@ -92,7 +92,7 @@ def test_skipped_jobs():
             assert job.status == Status.SKIPPED
             assert job.status == Status.SKIPPED
             skipped.append(job)
             skipped.append(job)
     assert len(skipped) == 2
     assert len(skipped) == 2
-    core.stop()
+    orchestrator.stop()
 
 
 
 
 def test_complex():
 def test_complex():
@@ -171,11 +171,11 @@ def test_complex():
         ],
         ],
     )
     )
 
 
-    core = Core()
-    core.run()
+    orchestrator = Orchestrator()
+    orchestrator.run()
     scenario = tp.create_scenario(scenario_config)
     scenario = tp.create_scenario(scenario_config)
     tp.submit(scenario)
     tp.submit(scenario)
-    core.stop()
+    orchestrator.stop()
 
 
     csv_sum_res = pd.read_csv(csv_path_sum)
     csv_sum_res = pd.read_csv(csv_path_sum)
     excel_sum_res = pd.read_excel(excel_path_sum)
     excel_sum_res = pd.read_excel(excel_path_sum)

+ 50 - 50
tests/core/test_core.py

@@ -14,103 +14,103 @@ import pytest
 
 
 from taipy.config import Config
 from taipy.config import Config
 from taipy.config.exceptions.exceptions import ConfigurationUpdateBlocked
 from taipy.config.exceptions.exceptions import ConfigurationUpdateBlocked
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.core._orchestrator._dispatcher import _DevelopmentJobDispatcher, _StandaloneJobDispatcher
 from taipy.core._orchestrator._dispatcher import _DevelopmentJobDispatcher, _StandaloneJobDispatcher
 from taipy.core._orchestrator._orchestrator import _Orchestrator
 from taipy.core._orchestrator._orchestrator import _Orchestrator
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core.config.job_config import JobConfig
 from taipy.core.config.job_config import JobConfig
-from taipy.core.exceptions.exceptions import CoreServiceIsAlreadyRunning
+from taipy.core.exceptions.exceptions import OrchestratorServiceIsAlreadyRunning
 
 
 
 
-class TestCore:
-    def test_run_core_trigger_config_check(self, caplog):
+class TestOrchestrator:
+    def test_run_orchestrator_trigger_config_check(self, caplog):
         Config.configure_data_node(id="d0", storage_type="toto")
         Config.configure_data_node(id="d0", storage_type="toto")
         with pytest.raises(SystemExit):
         with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
+            orchestrator = Orchestrator()
+            orchestrator.run()
         expected_error_message = (
         expected_error_message = (
             "`storage_type` field of DataNodeConfig `d0` must be either csv, sql_table,"
             "`storage_type` field of DataNodeConfig `d0` must be either csv, sql_table,"
             " sql, mongo_collection, pickle, excel, generic, json, parquet, s3_object, or in_memory."
             " sql, mongo_collection, pickle, excel, generic, json, parquet, s3_object, or in_memory."
             ' Current value of property `storage_type` is "toto".'
             ' Current value of property `storage_type` is "toto".'
         )
         )
         assert expected_error_message in caplog.text
         assert expected_error_message in caplog.text
-        core.stop()
+        orchestrator.stop()
 
 
-    def test_run_core_as_a_service_development_mode(self):
+    def test_run_orchestrator_as_a_service_development_mode(self):
         _OrchestratorFactory._dispatcher = None
         _OrchestratorFactory._dispatcher = None
 
 
-        core = Core()
-        assert core._orchestrator is None
-        assert core._dispatcher is None
+        orchestrator = Orchestrator()
+        assert orchestrator._orchestrator is None
+        assert orchestrator._dispatcher is None
         assert _OrchestratorFactory._dispatcher is None
         assert _OrchestratorFactory._dispatcher is None
 
 
-        core.run()
-        assert core._orchestrator is not None
-        assert core._orchestrator == _Orchestrator
+        orchestrator.run()
+        assert orchestrator._orchestrator is not None
+        assert orchestrator._orchestrator == _Orchestrator
         assert _OrchestratorFactory._orchestrator is not None
         assert _OrchestratorFactory._orchestrator is not None
         assert _OrchestratorFactory._orchestrator == _Orchestrator
         assert _OrchestratorFactory._orchestrator == _Orchestrator
-        assert core._dispatcher is not None
-        assert isinstance(core._dispatcher, _DevelopmentJobDispatcher)
+        assert orchestrator._dispatcher is not None
+        assert isinstance(orchestrator._dispatcher, _DevelopmentJobDispatcher)
         assert isinstance(_OrchestratorFactory._dispatcher, _DevelopmentJobDispatcher)
         assert isinstance(_OrchestratorFactory._dispatcher, _DevelopmentJobDispatcher)
-        core.stop()
+        orchestrator.stop()
 
 
-    def test_run_core_as_a_service_standalone_mode(self):
+    def test_run_orchestrator_as_a_service_standalone_mode(self):
         _OrchestratorFactory._dispatcher = None
         _OrchestratorFactory._dispatcher = None
 
 
-        core = Core()
-        assert core._orchestrator is None
+        orchestrator = Orchestrator()
+        assert orchestrator._orchestrator is None
 
 
-        assert core._dispatcher is None
+        assert orchestrator._dispatcher is None
         assert _OrchestratorFactory._dispatcher is None
         assert _OrchestratorFactory._dispatcher is None
 
 
         Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE, max_nb_of_workers=2)
         Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE, max_nb_of_workers=2)
-        core.run()
-        assert core._orchestrator is not None
-        assert core._orchestrator == _Orchestrator
+        orchestrator.run()
+        assert orchestrator._orchestrator is not None
+        assert orchestrator._orchestrator == _Orchestrator
         assert _OrchestratorFactory._orchestrator is not None
         assert _OrchestratorFactory._orchestrator is not None
         assert _OrchestratorFactory._orchestrator == _Orchestrator
         assert _OrchestratorFactory._orchestrator == _Orchestrator
-        assert core._dispatcher is not None
-        assert isinstance(core._dispatcher, _StandaloneJobDispatcher)
+        assert orchestrator._dispatcher is not None
+        assert isinstance(orchestrator._dispatcher, _StandaloneJobDispatcher)
         assert isinstance(_OrchestratorFactory._dispatcher, _StandaloneJobDispatcher)
         assert isinstance(_OrchestratorFactory._dispatcher, _StandaloneJobDispatcher)
-        assert core._dispatcher.is_running()
+        assert orchestrator._dispatcher.is_running()
         assert _OrchestratorFactory._dispatcher.is_running()
         assert _OrchestratorFactory._dispatcher.is_running()
-        core.stop()
+        orchestrator.stop()
 
 
-    def test_core_service_can_only_be_run_once(self):
-        core_instance_1 = Core()
-        core_instance_2 = Core()
+    def test_orchestrator_service_can_only_be_run_once(self):
+        orchestrator_instance_1 = Orchestrator()
+        orchestrator_instance_2 = Orchestrator()
 
 
-        core_instance_1.run()
+        orchestrator_instance_1.run()
 
 
-        with pytest.raises(CoreServiceIsAlreadyRunning):
-            core_instance_1.run()
-        with pytest.raises(CoreServiceIsAlreadyRunning):
-            core_instance_2.run()
+        with pytest.raises(OrchestratorServiceIsAlreadyRunning):
+            orchestrator_instance_1.run()
+        with pytest.raises(OrchestratorServiceIsAlreadyRunning):
+            orchestrator_instance_2.run()
 
 
-        # Stop the Core service and run it again should work
-        core_instance_1.stop()
+        # Stop the Orchestrator service and run it again should work
+        orchestrator_instance_1.stop()
 
 
-        core_instance_1.run()
-        core_instance_1.stop()
-        core_instance_2.run()
-        core_instance_2.stop()
+        orchestrator_instance_1.run()
+        orchestrator_instance_1.stop()
+        orchestrator_instance_2.run()
+        orchestrator_instance_2.stop()
 
 
-    def test_block_config_update_when_core_service_is_running_development_mode(self):
+    def test_block_config_update_when_orchestrator_service_is_running_development_mode(self):
         _OrchestratorFactory._dispatcher = None
         _OrchestratorFactory._dispatcher = None
 
 
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         with pytest.raises(ConfigurationUpdateBlocked):
         with pytest.raises(ConfigurationUpdateBlocked):
             Config.configure_data_node(id="i1")
             Config.configure_data_node(id="i1")
-        core.stop()
+        orchestrator.stop()
 
 
     @pytest.mark.standalone
     @pytest.mark.standalone
-    def test_block_config_update_when_core_service_is_running_standalone_mode(self):
+    def test_block_config_update_when_orchestrator_service_is_running_standalone_mode(self):
         _OrchestratorFactory._dispatcher = None
         _OrchestratorFactory._dispatcher = None
 
 
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE, max_nb_of_workers=2)
         Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE, max_nb_of_workers=2)
-        core.run()
+        orchestrator.run()
         with pytest.raises(ConfigurationUpdateBlocked):
         with pytest.raises(ConfigurationUpdateBlocked):
             Config.configure_data_node(id="i1")
             Config.configure_data_node(id="i1")
-        core.stop()
+        orchestrator.stop()

+ 79 - 79
tests/core/test_core_cli.py

@@ -16,7 +16,7 @@ import pytest
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.frequency import Frequency
 from taipy.config.common.scope import Scope
 from taipy.config.common.scope import Scope
 from taipy.config.config import Config
 from taipy.config.config import Config
-from taipy.core import Core, taipy
+from taipy.core import Orchestrator, taipy
 from taipy.core._version._version_manager import _VersionManager
 from taipy.core._version._version_manager import _VersionManager
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
 from taipy.core._version._version_manager_factory import _VersionManagerFactory
 from taipy.core.common._utils import _load_fct
 from taipy.core.common._utils import _load_fct
@@ -29,63 +29,63 @@ from taipy.core.sequence._sequence_manager import _SequenceManager
 from taipy.core.task._task_manager import _TaskManager
 from taipy.core.task._task_manager import _TaskManager
 
 
 
 
-def test_core_cli_no_arguments():
+def test_orchestrator_cli_no_arguments():
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         assert Config.core.mode == "development"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
         assert not Config.core.force
         assert not Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 
 
-def test_core_cli_development_mode():
+def test_orchestrator_cli_development_mode():
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         assert Config.core.mode == "development"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
-        core.stop()
+        orchestrator.stop()
 
 
 
 
-def test_core_cli_dev_mode():
+def test_orchestrator_cli_dev_mode():
     with patch("sys.argv", ["prog", "-dev"]):
     with patch("sys.argv", ["prog", "-dev"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         assert Config.core.mode == "development"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
-        core.stop()
+        orchestrator.stop()
 
 
 
 
-def test_core_cli_experiment_mode():
+def test_orchestrator_cli_experiment_mode():
     with patch("sys.argv", ["prog", "--experiment"]):
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_latest_version()
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_latest_version()
         assert not Config.core.force
         assert not Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 
 
-def test_core_cli_experiment_mode_with_version():
+def test_orchestrator_cli_experiment_mode_with_version():
     with patch("sys.argv", ["prog", "--experiment", "2.1"]):
     with patch("sys.argv", ["prog", "--experiment", "2.1"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == "2.1"
         assert Config.core.version_number == "2.1"
         assert not Config.core.force
         assert not Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 
 
-def test_core_cli_experiment_mode_with_force_version(init_config):
+def test_orchestrator_cli_experiment_mode_with_force_version(init_config):
     with patch("sys.argv", ["prog", "--experiment", "2.1", "--taipy-force"]):
     with patch("sys.argv", ["prog", "--experiment", "2.1", "--taipy-force"]):
         init_config()
         init_config()
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == "2.1"
         assert Config.core.version_number == "2.1"
         assert Config.core.force
         assert Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_dev_mode_clean_all_entities_of_the_latest_version():
 def test_dev_mode_clean_all_entities_of_the_latest_version():
@@ -93,11 +93,11 @@ def test_dev_mode_clean_all_entities_of_the_latest_version():
 
 
     # Create a scenario in development mode
     # Create a scenario in development mode
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     # Initial assertion
     # Initial assertion
     assert len(_DataManager._get_all(version_number="all")) == 2
     assert len(_DataManager._get_all(version_number="all")) == 2
@@ -109,11 +109,11 @@ def test_dev_mode_clean_all_entities_of_the_latest_version():
 
 
     # Create a new scenario in experiment mode
     # Create a new scenario in experiment mode
     with patch("sys.argv", ["prog", "--experiment"]):
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     # Assert number of entities in 2nd version
     # Assert number of entities in 2nd version
     assert len(_DataManager._get_all(version_number="all")) == 4
     assert len(_DataManager._get_all(version_number="all")) == 4
@@ -126,8 +126,8 @@ def test_dev_mode_clean_all_entities_of_the_latest_version():
 
 
     # Run development mode again
     # Run development mode again
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
 
 
         # The 1st dev version should be deleted run with development mode
         # The 1st dev version should be deleted run with development mode
         assert len(_DataManager._get_all(version_number="all")) == 2
         assert len(_DataManager._get_all(version_number="all")) == 2
@@ -140,7 +140,7 @@ def test_dev_mode_clean_all_entities_of_the_latest_version():
         # Submit new dev version
         # Submit new dev version
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
         # Assert number of entities with 1 dev version and 1 exp version
         # Assert number of entities with 1 dev version and 1 exp version
         assert len(_DataManager._get_all(version_number="all")) == 4
         assert len(_DataManager._get_all(version_number="all")) == 4
@@ -191,11 +191,11 @@ def test_dev_mode_clean_all_entities_when_config_is_alternated():
 
 
     # Create a scenario in development mode with the doppelganger function
     # Create a scenario in development mode with the doppelganger function
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
     # Delete the twice_doppelganger function
     # Delete the twice_doppelganger function
     # and clear cache of _load_fct() to simulate a new run
     # and clear cache of _load_fct() to simulate a new run
@@ -205,75 +205,75 @@ def test_dev_mode_clean_all_entities_when_config_is_alternated():
     # Create a scenario in development mode with another function
     # Create a scenario in development mode with another function
     scenario_config = config_scenario()
     scenario_config = config_scenario()
     with patch("sys.argv", ["prog"]):
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_version_number_when_switching_mode():
 def test_version_number_when_switching_mode():
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_1 = _VersionManager._get_latest_version()
         ver_1 = _VersionManager._get_latest_version()
         ver_dev = _VersionManager._get_development_version()
         ver_dev = _VersionManager._get_development_version()
         assert ver_1 == ver_dev
         assert ver_1 == ver_dev
         assert len(_VersionManager._get_all()) == 1
         assert len(_VersionManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
 
     # Run with dev mode, the version number is the same
     # Run with dev mode, the version number is the same
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_2 = _VersionManager._get_latest_version()
         ver_2 = _VersionManager._get_latest_version()
         assert ver_2 == ver_dev
         assert ver_2 == ver_dev
         assert len(_VersionManager._get_all()) == 1
         assert len(_VersionManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
 
     # When run with experiment mode, a new version is created
     # When run with experiment mode, a new version is created
     with patch("sys.argv", ["prog", "--experiment"]):
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_3 = _VersionManager._get_latest_version()
         ver_3 = _VersionManager._get_latest_version()
         assert ver_3 != ver_dev
         assert ver_3 != ver_dev
         assert len(_VersionManager._get_all()) == 2
         assert len(_VersionManager._get_all()) == 2
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment", "2.1"]):
     with patch("sys.argv", ["prog", "--experiment", "2.1"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_4 = _VersionManager._get_latest_version()
         ver_4 = _VersionManager._get_latest_version()
         assert ver_4 == "2.1"
         assert ver_4 == "2.1"
         assert len(_VersionManager._get_all()) == 3
         assert len(_VersionManager._get_all()) == 3
-        core.stop()
+        orchestrator.stop()
 
 
     with patch("sys.argv", ["prog", "--experiment"]):
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_5 = _VersionManager._get_latest_version()
         ver_5 = _VersionManager._get_latest_version()
         assert ver_5 != ver_3
         assert ver_5 != ver_3
         assert ver_5 != ver_4
         assert ver_5 != ver_4
         assert ver_5 != ver_dev
         assert ver_5 != ver_dev
         assert len(_VersionManager._get_all()) == 4
         assert len(_VersionManager._get_all()) == 4
-        core.stop()
+        orchestrator.stop()
 
 
     # Run with dev mode, the version number is the same as the first dev version to override it
     # Run with dev mode, the version number is the same as the first dev version to override it
     with patch("sys.argv", ["prog", "--development"]):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_7 = _VersionManager._get_latest_version()
         ver_7 = _VersionManager._get_latest_version()
         assert ver_1 == ver_7
         assert ver_1 == ver_7
         assert len(_VersionManager._get_all()) == 4
         assert len(_VersionManager._get_all()) == 4
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_force_override_experiment_version():
 def test_force_override_experiment_version():
     scenario_config = config_scenario()
     scenario_config = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_1 = _VersionManager._get_latest_version()
         ver_1 = _VersionManager._get_latest_version()
         assert ver_1 == "1.0"
         assert ver_1 == "1.0"
         # When create new experiment version, a development version entity is also created as a placeholder
         # When create new experiment version, a development version entity is also created as a placeholder
@@ -288,21 +288,21 @@ def test_force_override_experiment_version():
         assert len(_ScenarioManager._get_all()) == 1
         assert len(_ScenarioManager._get_all()) == 1
         assert len(_CycleManager._get_all()) == 1
         assert len(_CycleManager._get_all()) == 1
         assert len(_JobManager._get_all()) == 1
         assert len(_JobManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
 
     Config.configure_global_app(foo="bar")
     Config.configure_global_app(foo="bar")
 
 
     # Without --taipy-force parameter, a SystemExit will be raised
     # Without --taipy-force parameter, a SystemExit will be raised
     with pytest.raises(SystemExit):
     with pytest.raises(SystemExit):
         with patch("sys.argv", ["prog", "--experiment", "1.0"]):
         with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-            core = Core()
-            core.run()
-    core.stop()
+            orchestrator = Orchestrator()
+            orchestrator.run()
+    orchestrator.stop()
 
 
     # With --taipy-force parameter
     # With --taipy-force parameter
     with patch("sys.argv", ["prog", "--experiment", "1.0", "--taipy-force"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0", "--taipy-force"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_2 = _VersionManager._get_latest_version()
         ver_2 = _VersionManager._get_latest_version()
         assert ver_2 == "1.0"
         assert ver_2 == "1.0"
         assert len(_VersionManager._get_all()) == 2  # 2 version include 1 experiment 1 development
         assert len(_VersionManager._get_all()) == 2  # 2 version include 1 experiment 1 development
@@ -317,36 +317,36 @@ def test_force_override_experiment_version():
         assert len(_ScenarioManager._get_all()) == 2
         assert len(_ScenarioManager._get_all()) == 2
         assert len(_CycleManager._get_all()) == 1
         assert len(_CycleManager._get_all()) == 1
         assert len(_JobManager._get_all()) == 2
         assert len(_JobManager._get_all()) == 2
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_modified_job_configuration_dont_block_application_run(caplog, init_config):
 def test_modified_job_configuration_dont_block_application_run(caplog, init_config):
     _ = config_scenario()
     _ = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode="development")
         Config.configure_job_executions(mode="development")
-        core.run()
-        core.stop()
+        orchestrator.run()
+        orchestrator.stop()
     init_config()
     init_config()
     _ = config_scenario()
     _ = config_scenario()
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode="standalone", max_nb_of_workers=3)
         Config.configure_job_executions(mode="standalone", max_nb_of_workers=3)
-        core.run()
+        orchestrator.run()
         error_message = str(caplog.text)
         error_message = str(caplog.text)
         assert 'JOB "mode" was modified' in error_message
         assert 'JOB "mode" was modified' in error_message
         assert 'JOB "max_nb_of_workers" was added' in error_message
         assert 'JOB "max_nb_of_workers" was added' in error_message
-        core.stop()
+        orchestrator.stop()
 
 
 
 
 def test_modified_config_properties_without_force(caplog, init_config):
 def test_modified_config_properties_without_force(caplog, init_config):
     _ = config_scenario()
     _ = config_scenario()
 
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
 
 
     init_config()
     init_config()
 
 
@@ -354,9 +354,9 @@ def test_modified_config_properties_without_force(caplog, init_config):
 
 
     with pytest.raises(SystemExit):
     with pytest.raises(SystemExit):
         with patch("sys.argv", ["prog", "--experiment", "1.0"]):
         with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-            core = Core()
-            core.run()
-    core.stop()
+            orchestrator = Orchestrator()
+            orchestrator.run()
+    orchestrator.stop()
     error_message = str(caplog.text)
     error_message = str(caplog.text)
 
 
     assert 'DATA_NODE "d3" was added' in error_message
     assert 'DATA_NODE "d3" was added' in error_message

+ 8 - 8
tests/core/test_taipy.py

@@ -20,11 +20,11 @@ from taipy.config.common.scope import Scope
 from taipy.config.config import Config
 from taipy.config.config import Config
 from taipy.config.exceptions.exceptions import ConfigurationUpdateBlocked
 from taipy.config.exceptions.exceptions import ConfigurationUpdateBlocked
 from taipy.core import (
 from taipy.core import (
-    Core,
     Cycle,
     Cycle,
     CycleId,
     CycleId,
     DataNodeId,
     DataNodeId,
     JobId,
     JobId,
+    Orchestrator,
     Scenario,
     Scenario,
     ScenarioId,
     ScenarioId,
     Sequence,
     Sequence,
@@ -348,7 +348,7 @@ class TestTaipy:
                 tp.submit(scenario)
                 tp.submit(scenario)
 
 
         assert len(warning) == 1
         assert len(warning) == 1
-        assert "The Core service is NOT running" in warning[0].message.args[0]
+        assert "The Orchestrator service is NOT running" in warning[0].message.args[0]
 
 
     def test_get_tasks(self):
     def test_get_tasks(self):
         with mock.patch("taipy.core.task._task_manager._TaskManager._get_all") as mck:
         with mock.patch("taipy.core.task._task_manager._TaskManager._get_all") as mck:
@@ -642,19 +642,19 @@ class TestTaipy:
             tp.get_latest_submission(task)
             tp.get_latest_submission(task)
             mck.assert_called_once_with(task)
             mck.assert_called_once_with(task)
 
 
-    def test_block_config_when_core_is_running(self):
+    def test_block_config_when_orchestrator_is_running(self):
         input_cfg_1 = Config.configure_data_node(id="i1", storage_type="pickle", scope=Scope.SCENARIO, default_data=1)
         input_cfg_1 = Config.configure_data_node(id="i1", storage_type="pickle", scope=Scope.SCENARIO, default_data=1)
         output_cfg_1 = Config.configure_data_node(id="o1", storage_type="pickle", scope=Scope.SCENARIO)
         output_cfg_1 = Config.configure_data_node(id="o1", storage_type="pickle", scope=Scope.SCENARIO)
         task_cfg_1 = Config.configure_task("t1", print, input_cfg_1, output_cfg_1)
         task_cfg_1 = Config.configure_task("t1", print, input_cfg_1, output_cfg_1)
         Config.configure_scenario("s1", [task_cfg_1], [], Frequency.DAILY)
         Config.configure_scenario("s1", [task_cfg_1], [], Frequency.DAILY)
 
 
         with mock.patch("sys.argv", ["prog"]):
         with mock.patch("sys.argv", ["prog"]):
-            core = Core()
-            core.run()
+            orchestrator = Orchestrator()
+            orchestrator.run()
 
 
         with pytest.raises(ConfigurationUpdateBlocked):
         with pytest.raises(ConfigurationUpdateBlocked):
             Config.configure_scenario("block_scenario", [task_cfg_1])
             Config.configure_scenario("block_scenario", [task_cfg_1])
-        core.stop()
+        orchestrator.stop()
 
 
     def test_get_data_node(self, data_node):
     def test_get_data_node(self, data_node):
         with mock.patch("taipy.core.data._data_manager._DataManager._get") as mck:
         with mock.patch("taipy.core.data._data_manager._DataManager._get") as mck:
@@ -699,7 +699,7 @@ class TestTaipy:
         dn_cfg_global = DataNodeConfig("id", "pickle", Scope.GLOBAL)
         dn_cfg_global = DataNodeConfig("id", "pickle", Scope.GLOBAL)
         dn_cfg_scenario = DataNodeConfig("id", "pickle", Scope.SCENARIO)
         dn_cfg_scenario = DataNodeConfig("id", "pickle", Scope.SCENARIO)
         with mock.patch("taipy.core.data._data_manager._DataManager._create_and_set") as dn_create_mock:
         with mock.patch("taipy.core.data._data_manager._DataManager._create_and_set") as dn_create_mock:
-            with mock.patch("taipy.core._core.Core._manage_version_and_block_config") as mv_mock:
+            with mock.patch("taipy.core.orchestrator.Orchestrator._manage_version_and_block_config") as mv_mock:
                 dn = tp.create_global_data_node(dn_cfg_global)
                 dn = tp.create_global_data_node(dn_cfg_global)
                 dn_create_mock.assert_called_once_with(dn_cfg_global, None, None)
                 dn_create_mock.assert_called_once_with(dn_cfg_global, None, None)
                 mv_mock.assert_called_once()
                 mv_mock.assert_called_once()
@@ -719,7 +719,7 @@ class TestTaipy:
     def test_create_scenario(self):
     def test_create_scenario(self):
         scenario_config = ScenarioConfig("scenario_config")
         scenario_config = ScenarioConfig("scenario_config")
         with mock.patch("taipy.core.scenario._scenario_manager._ScenarioManager._create") as mck:
         with mock.patch("taipy.core.scenario._scenario_manager._ScenarioManager._create") as mck:
-            with mock.patch("taipy.core._core.Core._manage_version_and_block_config") as mv_mock:
+            with mock.patch("taipy.core.orchestrator.Orchestrator._manage_version_and_block_config") as mv_mock:
                 tp.create_scenario(scenario_config)
                 tp.create_scenario(scenario_config)
                 mck.assert_called_once_with(scenario_config, None, None)
                 mck.assert_called_once_with(scenario_config, None, None)
                 mv_mock.assert_called_once()
                 mv_mock.assert_called_once()

+ 35 - 0
tests/gui/data/test_pandas_data_accessor.py

@@ -72,6 +72,41 @@ def test_slice(gui: Gui, helpers, small_dataframe):
     assert len(data) == 2
     assert len(data) == 2
 
 
 
 
+def test_style(gui: Gui, helpers, small_dataframe):
+    accessor = _PandasDataAccessor(gui)
+    pd = pandas.DataFrame(data=small_dataframe)
+    gui.run(run_server=False)
+    cid = helpers.create_scope_and_get_sid(gui)
+    with gui.get_flask_app().test_request_context(f"/taipy-jsx/test/?client_id={cid}", data={"client_id": cid}):
+        g.client_id = cid
+        value = accessor.get_data("x", pd, {"start": 0, "end": 1, "styles": {"st": "test_style"}}, _DataFormat.JSON)[
+            "value"
+        ]
+        assert value["rowcount"] == 3
+        data = value["data"]
+        assert len(data) == 2
+        assert "test_style" in data[0]
+
+
+def test_tooltip(gui: Gui, helpers, small_dataframe):
+    def tt(state, value, index: int, row, column_name: str):
+        return f"{column_name}[{index}]: {value}"
+
+    accessor = _PandasDataAccessor(gui)
+    pd = pandas.DataFrame(data=small_dataframe)
+    gui.run(run_server=False)
+    cid = helpers.create_scope_and_get_sid(gui)
+    with gui.get_flask_app().test_request_context(f"/taipy-jsx/test/?client_id={cid}", data={"client_id": cid}):
+        gui._bind_var_val("tt", tt)
+        gui._get_locals_bind_from_context(None)["tt"] = tt
+        g.client_id = cid
+        value = accessor.get_data("x", pd, {"start": 0, "end": 1, "tooltips": {"tt": "tt"}}, _DataFormat.JSON)["value"]
+        assert value["rowcount"] == 3
+        data = value["data"]
+        assert len(data) == 2
+        assert "tt" in data[0]
+
+
 def test_sort(gui: Gui, helpers, small_dataframe):
 def test_sort(gui: Gui, helpers, small_dataframe):
     accessor = _PandasDataAccessor(gui)
     accessor = _PandasDataAccessor(gui)
     pd = pandas.DataFrame(data=small_dataframe)
     pd = pandas.DataFrame(data=small_dataframe)

+ 4 - 4
tests/templates/test_default_template.py

@@ -58,7 +58,7 @@ def test_main_file_with_and_without_extension(tmpdir):
     assert sorted(os.listdir(os.path.join(tmpdir, "foo_app"))) == sorted(["requirements.txt", "app.py"])
     assert sorted(os.listdir(os.path.join(tmpdir, "foo_app"))) == sorted(["requirements.txt", "app.py"])
 
 
 
 
-def test_with_core_service(tmpdir):
+def test_with_orchestrator_service(tmpdir):
     cookiecutter(
     cookiecutter(
         template="taipy/templates/default",
         template="taipy/templates/default",
         output_dir=str(tmpdir),
         output_dir=str(tmpdir),
@@ -73,7 +73,7 @@ def test_with_core_service(tmpdir):
         ["requirements.txt", "main.py", "configuration", "algorithms"]
         ["requirements.txt", "main.py", "configuration", "algorithms"]
     )
     )
     with open(os.path.join(tmpdir, "taipy_application", "main.py")) as main_file:
     with open(os.path.join(tmpdir, "taipy_application", "main.py")) as main_file:
-        assert "core = Core()" in main_file.read()
+        assert "orchestrator = Orchestrator()" in main_file.read()
 
 
     taipy_path = os.getcwd()
     taipy_path = os.getcwd()
     stdout = _run_template(taipy_path, os.path.join(tmpdir, "taipy_application"), "main.py")
     stdout = _run_template(taipy_path, os.path.join(tmpdir, "taipy_application"), "main.py")
@@ -106,7 +106,7 @@ def test_with_rest_service(tmpdir):
     assert "[Taipy][INFO] Development mode: " in stdout
     assert "[Taipy][INFO] Development mode: " in stdout
 
 
 
 
-def test_with_both_core_rest_services(tmpdir):
+def test_with_both_orchestrator_rest_services(tmpdir):
     cookiecutter(
     cookiecutter(
         template="taipy/templates/default",
         template="taipy/templates/default",
         output_dir=str(tmpdir),
         output_dir=str(tmpdir),
@@ -122,7 +122,7 @@ def test_with_both_core_rest_services(tmpdir):
     )
     )
     with open(os.path.join(tmpdir, "taipy_application", "main.py")) as main_file:
     with open(os.path.join(tmpdir, "taipy_application", "main.py")) as main_file:
         assert "rest = Rest()" in main_file.read()
         assert "rest = Rest()" in main_file.read()
-        assert "core = Core()" not in main_file.read()
+        assert "orchestrator = Orchestrator()" not in main_file.read()
 
 
     taipy_path = os.getcwd()
     taipy_path = os.getcwd()
     stdout = _run_template(taipy_path, os.path.join(tmpdir, "taipy_application"), "main.py")
     stdout = _run_template(taipy_path, os.path.join(tmpdir, "taipy_application"), "main.py")

+ 19 - 19
tests/test_run.py

@@ -12,7 +12,7 @@
 from unittest import mock
 from unittest import mock
 
 
 from taipy._run import _run
 from taipy._run import _run
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.gui import Gui
 from taipy.gui import Gui
 from taipy.rest import Rest
 from taipy.rest import Rest
 
 
@@ -23,41 +23,41 @@ def test_run_pass_with_gui(gui_run):
     gui_run.assert_called_once()
     gui_run.assert_called_once()
 
 
 
 
-@mock.patch("taipy.core.Core.run")
-def test_run_pass_with_core(core_run):
-    _run(Core())
-    core_run.assert_called_once()
+@mock.patch("taipy.core.Orchestrator.run")
+def test_run_pass_with_core(orchestrator_run):
+    _run(Orchestrator())
+    orchestrator_run.assert_called_once()
 
 
 
 
 @mock.patch("taipy.rest.Rest.run")
 @mock.patch("taipy.rest.Rest.run")
-@mock.patch("taipy.core.Core.run")
-def test_run_pass_with_rest(rest_run, core_run):
+@mock.patch("taipy.core.Orchestrator.run")
+def test_run_pass_with_rest(rest_run, orchestrator_run):
     _run(Rest())
     _run(Rest())
     rest_run.assert_called_once()
     rest_run.assert_called_once()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()
 
 
 
 
 @mock.patch("taipy.rest.Rest.run")
 @mock.patch("taipy.rest.Rest.run")
-@mock.patch("taipy.core.Core.run")
-def test_run_pass_with_core_and_rest(core_run, rest_run):
-    _run(Core(), Rest())
-    core_run.assert_called_once()
+@mock.patch("taipy.core.Orchestrator.run")
+def test_run_pass_with_core_and_rest(orchestrator_run, rest_run):
+    _run(Orchestrator(), Rest())
+    orchestrator_run.assert_called_once()
     rest_run.assert_called_once()
     rest_run.assert_called_once()
 
 
 
 
 @mock.patch("taipy.gui.Gui.run")
 @mock.patch("taipy.gui.Gui.run")
 @mock.patch("taipy.rest.Rest.run")
 @mock.patch("taipy.rest.Rest.run")
-@mock.patch("taipy.core.Core.run")
-def test_run_pass_with_gui_and_rest(core_run, rest_run, gui_run):
+@mock.patch("taipy.core.Orchestrator.run")
+def test_run_pass_with_gui_and_rest(orchestrator_run, rest_run, gui_run):
     _run(Gui(), Rest())
     _run(Gui(), Rest())
     gui_run.assert_called_once()
     gui_run.assert_called_once()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()
     rest_run.assert_not_called()
     rest_run.assert_not_called()
 
 
 
 
 @mock.patch("taipy.gui.Gui.run")
 @mock.patch("taipy.gui.Gui.run")
-@mock.patch("taipy.core.Core.run")
-def test_run_pass_with_gui_and_core(core_run, gui_run):
-    _run(Gui(), Core())
+@mock.patch("taipy.core.Orchestrator.run")
+def test_run_pass_with_gui_and_core(orchestrator_run, gui_run):
+    _run(Gui(), Orchestrator())
     gui_run.assert_called_once()
     gui_run.assert_called_once()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()