Explorar o código

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

Nam Nguyen hai 9 meses
pai
achega
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)
 
-
 <div align="center">
   <a href="https://taipy.io?utm_source=github" target="_blank">
   <picture>
@@ -23,11 +22,10 @@ From simple pilots to production-ready web applications in no time. No more comp
 <div align="center">
 
 **Go beyond existing libraries**
-</div>
-
 
+</div>
 
-  <p align="left">
+<p align="left">
     <br />
     <a href="https://docs.taipy.io/en/latest/"><strong>📚 Explore the docs </strong></a>
     <br />
@@ -39,11 +37,12 @@ From simple pilots to production-ready web applications in no time. No more comp
 &nbsp;
 
 ## ⭐️ What's Taipy?
+
 Taipy is designed for data scientists and machine learning engineers to build data & AI web applications.
 &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.
 
 &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
 </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;
 
 ## ✨ 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_data_support.png" alt="Back-End Animation"  width="49.7%" />
 
-
 &nbsp;
 
 ## ⚙️ Quickstart
+
 To install Taipy stable release run:
+
 ```bash
 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/).
 
 &nbsp;
 
 ## 🔌 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.
 
 <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 🚀
 
 <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
+
 <p align="center">
 <img src="https://github.com/Avaiga/taipy/raw/develop/readme_img/readme_exec_graph.png" width="600" align="center" />
 </p>
 
 ### 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/)
 
-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/).
 
 ![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;
 
 ## 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.
 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")
     scenario_cfg = Config.scenarios["scenario"]
 
-    # Start Taipy Core service
-    tp.Core().run()
+    # Start Taipy Orchestrator
+    tp.Orchestrator().run()
 
     # Create a scenario
     scenario = tp.create_scenario(scenario_cfg)
@@ -188,17 +192,20 @@ if __name__ == "__main__":
 ```
 
 And the final result:
-<img src="readme_img/readme_app.gif" />
+`<img src="readme_img/readme_app.gif" />`
 
 &nbsp;
 
 ## ⚒️ Contributing
+
 Want to help build Taipy? Check out our [Contributing Guide](https://github.com/Avaiga/taipy/blob/develop/CONTRIBUTING.md).
 
 ## 🪄 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)
 
 ## 🪪 License
+
 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

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

@@ -137,9 +137,9 @@
       }
     },
     "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,
       "engines": {
         "node": ">=6.9.0"
@@ -191,11 +191,11 @@
       }
     },
     "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": {
-        "@babel/types": "^7.25.0",
+        "@babel/types": "^7.25.4",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
@@ -334,11 +334,11 @@
       }
     },
     "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": {
-        "@babel/types": "^7.25.2"
+        "@babel/types": "^7.25.4"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -555,12 +555,12 @@
       }
     },
     "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,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -570,9 +570,9 @@
       }
     },
     "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": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -594,15 +594,15 @@
       }
     },
     "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": {
         "@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/types": "^7.25.2",
+        "@babel/types": "^7.25.4",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -611,9 +611,9 @@
       }
     },
     "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": {
         "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-validator-identifier": "^7.24.7",
@@ -703,14 +703,14 @@
       "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
     },
     "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": {
         "@babel/runtime": "^7.18.3",
         "@emotion/babel-plugin": "^11.12.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/utils": "^1.4.0",
         "@emotion/weak-memoize": "^0.4.0",
@@ -726,13 +726,13 @@
       }
     },
     "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": {
         "@emotion/hash": "^0.9.2",
         "@emotion/memoize": "^0.9.0",
-        "@emotion/unitless": "^0.9.0",
+        "@emotion/unitless": "^0.10.0",
         "@emotion/utils": "^1.4.0",
         "csstype": "^3.0.2"
       }
@@ -765,9 +765,9 @@
       }
     },
     "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": {
       "version": "1.1.0",
@@ -2097,9 +2097,9 @@
       }
     },
     "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": {
         "@babel/runtime": "^7.25.0",
         "@mui/system": "^5.16.5",
@@ -2161,9 +2161,9 @@
       }
     },
     "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": {
         "@babel/runtime": "^7.25.0",
         "@mui/utils": "^5.16.5"
@@ -2180,14 +2180,14 @@
       }
     },
     "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": {
         "@babel/runtime": "^7.25.0",
         "@mui/system": "^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",
         "clsx": "^2.1.1",
         "prop-types": "^15.8.1",
@@ -2336,17 +2336,17 @@
       }
     },
     "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": {
         "node": ">=14.0.0"
       }
     },
     "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,
       "dependencies": {
         "@types/hast": "^3.0.4"
@@ -2769,16 +2769,6 @@
         "@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": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@@ -2949,9 +2939,9 @@
       "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
     },
     "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": {
         "@types/prop-types": "*",
         "csstype": "^3.0.2"
@@ -3057,9 +3047,9 @@
       "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
     },
     "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": {
       "version": "10.0.0",
@@ -3897,9 +3887,9 @@
       }
     },
     "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
     },
     "node_modules/asynckit": {
@@ -5002,9 +4992,9 @@
       }
     },
     "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,
       "funding": {
         "type": "opencollective",
@@ -5937,9 +5927,9 @@
       }
     },
     "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": {
       "version": "1.1.1",
@@ -7993,9 +7983,9 @@
       }
     },
     "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,
       "bin": {
         "husky": "bin.js"
@@ -8266,9 +8256,9 @@
       }
     },
     "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": {
         "hasown": "^2.0.2"
       },
@@ -12610,9 +12600,9 @@
       }
     },
     "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": {
       "version": "5.2.0",
@@ -13371,11 +13361,11 @@
       }
     },
     "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": {
-        "@remix-run/router": "1.19.0"
+        "@remix-run/router": "1.19.1"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -13385,12 +13375,12 @@
       }
     },
     "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": {
-        "@remix-run/router": "1.19.0",
-        "react-router": "6.26.0"
+        "@remix-run/router": "1.19.1",
+        "react-router": "6.26.1"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -14109,12 +14099,12 @@
       }
     },
     "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,
       "dependencies": {
-        "@shikijs/core": "1.12.1",
+        "@shikijs/core": "1.14.1",
         "@types/hast": "^3.0.4"
       }
     },
@@ -15302,9 +15292,9 @@
       }
     },
     "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,
       "dependencies": {
         "lunr": "^2.3.9",
@@ -15324,9 +15314,9 @@
       }
     },
     "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,
       "engines": {
         "node": ">= 18"
@@ -15710,12 +15700,11 @@
       }
     },
     "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,
       "dependencies": {
-        "@types/eslint-scope": "^3.7.3",
         "@types/estree": "^1.0.5",
         "@webassemblyjs/ast": "^1.12.1",
         "@webassemblyjs/wasm-edit": "^1.12.1",
@@ -15724,7 +15713,7 @@
         "acorn-import-attributes": "^1.9.5",
         "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.0",
+        "enhanced-resolve": "^5.17.1",
         "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "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 avatarWidth = 24;
 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 = {
     width: "fit-content",
     maxWidth: "80%",

+ 10 - 10
taipy/_run.py

@@ -14,15 +14,15 @@ import typing as t
 
 from flask import Flask
 
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.gui import Gui
 from taipy.rest import Rest
 
 if sys.version_info >= (3, 10):
     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]:
@@ -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.
 
     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 this is empty or set to None, this method does nothing.
         **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)
     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.gui._gui_cli import _GuiCLI
 
         _CoreCLIFactory._build_cli().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:
         return None

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

@@ -40,7 +40,7 @@ class _ConfigBlocker:
             def _check_if_is_blocking(*args, **kwargs):
                 if cls.__block_config_update:
                     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."
                     )
                     cls.__logger.error(f"ConfigurationUpdateBlocked: {error_message}")

+ 2 - 2
taipy/config/config.pyi

@@ -861,7 +861,7 @@ class Config:
         force: Optional[bool] = None,
         **properties,
     ) -> "CoreSection":
-        """Configure the Core service.
+        """Configure the Orchestrator service.
 
         Parameters:
             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
                 has changed and run the application.
             **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:
             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
 
-    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 *

+ 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
 # specific language governing permissions and limitations under the License.
 
-from ._core import Core
 from ._entity.submittable import Submittable
 from .cycle.cycle import Cycle
 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_id import JobId
 from .job.status import Status
+from .orchestrator import Orchestrator
 from .scenario.scenario import Scenario
 from .scenario.scenario_id import ScenarioId
 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)
 
 
-def _warn_no_core_service(specific_message, stacklevel: int = 3):
+def _warn_no_orchestrator_service(specific_message, stacklevel: int = 3):
     def inner(f):
         @functools.wraps(f)
         def _check_if_core_service_is_running(*args, **kwargs):
             from .._orchestrator._orchestrator_factory import _OrchestratorFactory
 
             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)
 
             return f(*args, **kwargs)

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

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

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

@@ -32,7 +32,7 @@ from ..exceptions.exceptions import ConfigCoreVersionMismatched
 
 class CoreSection(UniqueSection):
     """
-    Configuration parameters for running the `Core^` service.
+    Configuration parameters for running the `Orchestrator^` service.
 
     Attributes:
         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.
         read_entity_retry (int): Number of retries to read an entity from the repository before return failure.
             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)
             documentation page for more details.
         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,
         **properties,
     ) -> "CoreSection":
-        """Configure the Core service.
+        """Configure the Orchestrator service.
 
         Parameters:
             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
                 has changed and run the application.
             **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:
             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):

+ 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 ._version._version_manager_factory import _VersionManagerFactory
 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
@@ -42,30 +42,30 @@ class Core:
 
     def __init__(self) -> None:
         """
-        Initialize a Core service.
+        Initialize a Orchestrator service.
         """
         pass
 
     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,
         and starts a job dispatcher.
         """
         if self.__class__._is_running:
-            raise CoreServiceIsAlreadyRunning
+            raise OrchestratorServiceIsAlreadyRunning
 
         with self.__class__.__lock_is_running:
             self.__class__._is_running = True
 
         self._manage_version_and_block_config()
         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):
         """
-        Stop the Core service.
+        Stop the Orchestrator service.
         This function stops the dispatcher and unblock the Config for update.
 
         Parameters:
@@ -82,7 +82,7 @@ class Core:
             self.__class__._is_running = False
         with self.__class__.__lock_version_is_initialized:
             self.__class__._version_is_initialized = False
-        self.__logger.info("Core service has been stopped.")
+        self.__logger.info("Orchestrator service has been stopped.")
 
     @classmethod
     def _manage_version_and_block_config(cls):
@@ -95,12 +95,12 @@ class Core:
         with cls.__lock_version_is_initialized:
             cls._version_is_initialized = True
 
-        cls.__update_core_section()
+        cls.__update_orchestrator_section()
         cls.__manage_version()
         cls.__check_and_block_config()
 
     @classmethod
-    def __update_core_section(cls):
+    def __update_orchestrator_section(cls):
         cls.__logger.info("Updating configuration with command-line arguments...")
         _core_cli = _CoreCLIFactory._build_cli()
         _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.logger._taipy_logger import _TaipyLogger
 
-from ._core import Core
 from ._entity._entity import _Entity
 from ._version._version_manager_factory import _VersionManagerFactory
 from .common._check_instance import (
@@ -27,7 +26,7 @@ from .common._check_instance import (
     _is_submission,
     _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.scenario_config import ScenarioConfig
 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 import Job
 from .job.job_id import JobId
+from .orchestrator import Orchestrator
 from .reason import EntityDoesNotExist, EntityIsNotSubmittableEntity, ReasonCollection
 from .scenario._scenario_manager_factory import _ScenarioManagerFactory
 from .scenario.scenario import Scenario
@@ -216,7 +216,7 @@ def is_readable(
     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(
     entity: Union[Scenario, Sequence, Task],
     force: bool = False,
@@ -922,7 +922,7 @@ def create_scenario(
         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)
 
@@ -947,7 +947,7 @@ def create_global_data_node(config: DataNodeConfig) -> DataNode:
     if config.scope is not Scope.GLOBAL:
         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):
         return dns[0]

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

@@ -56,7 +56,7 @@ class _PandasDataAccessor(_DataAccessor):
 
     @staticmethod
     def get_supported_classes() -> t.List[t.Type]:
-        return  list(_PandasDataAccessor.__types)
+        return list(_PandasDataAccessor.__types)
 
     @staticmethod
     def __user_function(
@@ -88,37 +88,34 @@ class _PandasDataAccessor(_DataAccessor):
         new_indexes: t.Optional[np.ndarray] = None,
         handle_nan: t.Optional[bool] = False,
     ) -> pd.DataFrame:
+        dataframe = dataframe.iloc[new_indexes] if new_indexes is not None else dataframe
         if isinstance(payload_cols, list) and len(payload_cols):
             col_types = dataframe.dtypes[dataframe.dtypes.index.astype(str).isin(payload_cols)]
         else:
             col_types = dataframe.dtypes
         cols = col_types.index.astype(str).tolist()
+        new_cols = {}
         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():
-                col_applied = False
+                col_applied = ""
                 func = self._gui._get_user_function(v)
                 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 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():
-                col_applied = False
+                col_applied = ""
                 func = self._gui._get_user_function(v)
                 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
-        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 not is_copied:
                 # 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()
             for col in datecols:
                 newcol = _get_date_col_str_name(cols, col)
-                cols.append(newcol)
                 re_type = _RE_PD_TYPE.match(str(col_types[col]))
                 grps = re_type.groups() if re_type else ()
                 if len(grps) > 4 and grps[4]:
-                    dataframe[newcol] = (
+                    new_cols[newcol] = (
                         dataframe[col]
                         .dt.tz_convert("UTC")
                         .dt.strftime(_DataAccessor._WS_DATE_FORMAT)
@@ -138,7 +134,7 @@ class _PandasDataAccessor(_DataAccessor):
                         .replace("nan", "NaT" if handle_nan else None)
                     )
                 else:
-                    dataframe[newcol] = (
+                    new_cols[newcol] = (
                         dataframe[col]
                         .dt.tz_localize(tz)
                         .dt.tz_convert("UTC")
@@ -149,8 +145,10 @@ class _PandasDataAccessor(_DataAccessor):
 
             # remove the date columns from the list of columns
             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
 
     def __apply_user_function(
@@ -163,15 +161,14 @@ class _PandasDataAccessor(_DataAccessor):
     ):
         try:
             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,
                 axis=1,
                 args=(self._gui, column_name, user_function, function_name),
             )
-            return new_col_name
         except Exception as e:
             _warn(f"Exception raised when invoking user function {function_name}()", e)
-        return False
+        return "", data
 
     def __format_data(
         self,
@@ -246,9 +243,8 @@ class _PandasDataAccessor(_DataAccessor):
         # add index if not chart
         if paged:
             if _PandasDataAccessor.__INDEX_COL not in df.columns:
-                df = df.copy()
                 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:
                 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'] }}",
     "__application_title": "{{ cookiecutter['Application title'] }}",
     "__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?'] }}",
     "__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
 
 
-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
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "r") as import_file:
             import_lines = import_file.readlines()
@@ -24,12 +24,12 @@ def handle_services(use_rest, use_core):
             import_file.writelines(import_lines)
 
     # 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:
-            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:
-            import_file.write("from taipy import Core\n")
+            import_file.write("from taipy import Orchestrator\n")
     elif use_rest:
         with open(os.path.join(os.getcwd(), "sections", "import.txt"), "a") as import_file:
             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:
             main_file.write("    rest = Rest()\n")
 
-    if use_core:
+    if use_orchestrator:
         # Create and submit the placeholder scenario
         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:
-                main_file.write("    core.run()\n")
+                main_file.write("    orchestrator.run()\n")
             main_file.write("    # #############################################################################\n")
             main_file.write("    # PLACEHOLDER: Create and submit your scenario here                           #\n")
             main_file.write("    #                                                                             #\n")
@@ -171,9 +171,9 @@ def initialize_as_git_project(project_dir: str) -> str:
     return msg
 
 
-use_core = "{{ cookiecutter.__core }}".upper()
+use_orchestrator = "{{ cookiecutter.__orchestrator }}".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(" ")
 # 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.
 
-The configuration is run by the Core service.
+The configuration is run when starting the Orchestrator.
 """
 
 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
 
 import taipy as tp
-from taipy import Core, Gui
+from taipy import Gui, Orchestrator
 
 
 def on_init(state):
@@ -34,10 +34,10 @@ pages = {
 
 
 if __name__ == "__main__":
-    # Instantiate, configure and run the Core
-    core = Core()
+    # Instantiate, configure and run the Orchestrator
+    orchestrator = Orchestrator()
     default_scenario_cfg = configure()
-    core.run()
+    orchestrator.run()
 
     # ##################################################################################################################
     # 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.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_factory import _OrchestratorFactory
 from taipy.core.config import JobConfig
@@ -520,8 +520,8 @@ def task_sleep_2():
 
 
 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_2 = Task("task_config_id_2", {}, task_sleep_2, [], [])
@@ -533,7 +533,7 @@ def test_submit_duration_development_mode():
     _ScenarioManager._set(scenario)
     submission = taipy.submit(scenario)
     jobs = submission.jobs
-    core.stop()
+    orchestrator.stop()
 
     assert all(isinstance(job.execution_started_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
 def test_submit_duration_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_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)
 
-    core.stop()
+    orchestrator.stop()
 
     assert all(isinstance(job.execution_started_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.scope import Scope
 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._version_manager import _VersionManager
 from taipy.core.data._data_manager import _DataManager
@@ -39,32 +39,32 @@ def test_delete_version(caplog):
     scenario_config = config_scenario()
 
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment", "1.1"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     all_versions = [version.id for version in _VersionManager._get_all()]
     assert len(all_versions) == 4
@@ -91,19 +91,19 @@ def test_delete_version(caplog):
 
 def test_list_versions(capsys):
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
     sleep(0.05)
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
     sleep(0.05)
     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()
     with pytest.raises(SystemExit):
@@ -123,18 +123,18 @@ def test_rename_version(caplog):
     scenario_config = config_scenario()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     dev_ver = _VersionManager._get_development_version()
 
@@ -168,11 +168,11 @@ def test_compare_version_config(caplog, init_config):
     scenario_config_1 = config_scenario()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config_1)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     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")
 
     with patch("sys.argv", ["prog", "--experiment", "2.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config_2)
         _ScenarioManager._submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     _VersionCLIFactory._build_cli().create_parser()
     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.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.config import CoreSection
 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():
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
     assert Config.core.mode == "development"
     assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
     assert not Config.core.force
-    core.stop()
+    orchestrator.stop()
 
     with patch("sys.argv", ["prog"]):
         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.version_number == "test_num"
     assert Config.core.force
-    core.stop()
+    orchestrator.stop()
 
     toml_config = NamedTemporaryFile(
         content="""
@@ -52,20 +52,20 @@ force = "true:bool"
     )
     Config.load(toml_config.filename)
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
     assert Config.core.mode == "experiment"
     assert Config.core.version_number == "test_num_2"
     assert Config.core.force
-    core.stop()
+    orchestrator.stop()
 
     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.version_number == "test_num_3"
         assert not Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 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.scope import Scope
 from taipy.config.config import Config
-from taipy.core._core import Core
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 from taipy.core._version._version import _Version
 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_id import JobId
 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_model import _ScenarioModel
 from taipy.core.scenario.scenario import Scenario
@@ -354,8 +354,8 @@ def init_config(reset_configuration_singleton, inject_core_sections):
         _Checker.add_checker(_ScenarioConfigChecker)
 
         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
 

+ 7 - 7
tests/core/test_complex_application.py

@@ -17,7 +17,7 @@ import pandas as pd
 
 import taipy.core.taipy as tp
 from taipy.config import Config
-from taipy.core import Core, Status
+from taipy.core import Orchestrator, Status
 
 # ################################  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)
     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.input_dn.write(2)
@@ -92,7 +92,7 @@ def test_skipped_jobs():
             assert job.status == Status.SKIPPED
             skipped.append(job)
     assert len(skipped) == 2
-    core.stop()
+    orchestrator.stop()
 
 
 def test_complex():
@@ -171,11 +171,11 @@ def test_complex():
         ],
     )
 
-    core = Core()
-    core.run()
+    orchestrator = Orchestrator()
+    orchestrator.run()
     scenario = tp.create_scenario(scenario_config)
     tp.submit(scenario)
-    core.stop()
+    orchestrator.stop()
 
     csv_sum_res = pd.read_csv(csv_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.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._orchestrator import _Orchestrator
 from taipy.core._orchestrator._orchestrator_factory import _OrchestratorFactory
 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")
         with pytest.raises(SystemExit):
-            core = Core()
-            core.run()
+            orchestrator = Orchestrator()
+            orchestrator.run()
         expected_error_message = (
             "`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."
             ' Current value of property `storage_type` is "toto".'
         )
         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
 
-        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
 
-        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 == _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)
-        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
 
-        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
 
         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 == _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 core._dispatcher.is_running()
+        assert orchestrator._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
 
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         with pytest.raises(ConfigurationUpdateBlocked):
             Config.configure_data_node(id="i1")
-        core.stop()
+        orchestrator.stop()
 
     @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
 
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode=JobConfig._STANDALONE_MODE, max_nb_of_workers=2)
-        core.run()
+        orchestrator.run()
         with pytest.raises(ConfigurationUpdateBlocked):
             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.scope import Scope
 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_factory import _VersionManagerFactory
 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
 
 
-def test_core_cli_no_arguments():
+def test_orchestrator_cli_no_arguments():
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_development_version()
         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"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         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"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "development"
         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"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == _VersionManagerFactory._build_manager()._get_latest_version()
         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"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == "2.1"
         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"]):
         init_config()
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         assert Config.core.mode == "experiment"
         assert Config.core.version_number == "2.1"
         assert Config.core.force
-        core.stop()
+        orchestrator.stop()
 
 
 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
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     # Initial assertion
     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
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     # Assert number of entities in 2nd version
     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
     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
         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
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
         # Assert number of entities with 1 dev version and 1 exp version
         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
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
     # Delete the twice_doppelganger function
     # 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
     scenario_config = config_scenario()
     with patch("sys.argv", ["prog"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         scenario = _ScenarioManager._create(scenario_config)
         taipy.submit(scenario)
-        core.stop()
+        orchestrator.stop()
 
 
 def test_version_number_when_switching_mode():
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_1 = _VersionManager._get_latest_version()
         ver_dev = _VersionManager._get_development_version()
         assert ver_1 == ver_dev
         assert len(_VersionManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
     # Run with dev mode, the version number is the same
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_2 = _VersionManager._get_latest_version()
         assert ver_2 == ver_dev
         assert len(_VersionManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
     # When run with experiment mode, a new version is created
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_3 = _VersionManager._get_latest_version()
         assert ver_3 != ver_dev
         assert len(_VersionManager._get_all()) == 2
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment", "2.1"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_4 = _VersionManager._get_latest_version()
         assert ver_4 == "2.1"
         assert len(_VersionManager._get_all()) == 3
-        core.stop()
+        orchestrator.stop()
 
     with patch("sys.argv", ["prog", "--experiment"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_5 = _VersionManager._get_latest_version()
         assert ver_5 != ver_3
         assert ver_5 != ver_4
         assert ver_5 != ver_dev
         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
     with patch("sys.argv", ["prog", "--development"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_7 = _VersionManager._get_latest_version()
         assert ver_1 == ver_7
         assert len(_VersionManager._get_all()) == 4
-        core.stop()
+        orchestrator.stop()
 
 
 def test_force_override_experiment_version():
     scenario_config = config_scenario()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_1 = _VersionManager._get_latest_version()
         assert ver_1 == "1.0"
         # 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(_CycleManager._get_all()) == 1
         assert len(_JobManager._get_all()) == 1
-        core.stop()
+        orchestrator.stop()
 
     Config.configure_global_app(foo="bar")
 
     # Without --taipy-force parameter, a SystemExit will be raised
     with pytest.raises(SystemExit):
         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 patch("sys.argv", ["prog", "--experiment", "1.0", "--taipy-force"]):
-        core = Core()
-        core.run()
+        orchestrator = Orchestrator()
+        orchestrator.run()
         ver_2 = _VersionManager._get_latest_version()
         assert ver_2 == "1.0"
         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(_CycleManager._get_all()) == 1
         assert len(_JobManager._get_all()) == 2
-        core.stop()
+        orchestrator.stop()
 
 
 def test_modified_job_configuration_dont_block_application_run(caplog, init_config):
     _ = config_scenario()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode="development")
-        core.run()
-        core.stop()
+        orchestrator.run()
+        orchestrator.stop()
     init_config()
     _ = config_scenario()
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
+        orchestrator = Orchestrator()
         Config.configure_job_executions(mode="standalone", max_nb_of_workers=3)
-        core.run()
+        orchestrator.run()
         error_message = str(caplog.text)
         assert 'JOB "mode" was modified' 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):
     _ = config_scenario()
 
     with patch("sys.argv", ["prog", "--experiment", "1.0"]):
-        core = Core()
-        core.run()
-        core.stop()
+        orchestrator = Orchestrator()
+        orchestrator.run()
+        orchestrator.stop()
 
     init_config()
 
@@ -354,9 +354,9 @@ def test_modified_config_properties_without_force(caplog, init_config):
 
     with pytest.raises(SystemExit):
         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)
 
     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.exceptions.exceptions import ConfigurationUpdateBlocked
 from taipy.core import (
-    Core,
     Cycle,
     CycleId,
     DataNodeId,
     JobId,
+    Orchestrator,
     Scenario,
     ScenarioId,
     Sequence,
@@ -348,7 +348,7 @@ class TestTaipy:
                 tp.submit(scenario)
 
         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):
         with mock.patch("taipy.core.task._task_manager._TaskManager._get_all") as mck:
@@ -642,19 +642,19 @@ class TestTaipy:
             tp.get_latest_submission(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)
         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)
         Config.configure_scenario("s1", [task_cfg_1], [], Frequency.DAILY)
 
         with mock.patch("sys.argv", ["prog"]):
-            core = Core()
-            core.run()
+            orchestrator = Orchestrator()
+            orchestrator.run()
 
         with pytest.raises(ConfigurationUpdateBlocked):
             Config.configure_scenario("block_scenario", [task_cfg_1])
-        core.stop()
+        orchestrator.stop()
 
     def test_get_data_node(self, data_node):
         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_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._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_create_mock.assert_called_once_with(dn_cfg_global, None, None)
                 mv_mock.assert_called_once()
@@ -719,7 +719,7 @@ class TestTaipy:
     def test_create_scenario(self):
         scenario_config = ScenarioConfig("scenario_config")
         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)
                 mck.assert_called_once_with(scenario_config, None, None)
                 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
 
 
+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):
     accessor = _PandasDataAccessor(gui)
     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"])
 
 
-def test_with_core_service(tmpdir):
+def test_with_orchestrator_service(tmpdir):
     cookiecutter(
         template="taipy/templates/default",
         output_dir=str(tmpdir),
@@ -73,7 +73,7 @@ def test_with_core_service(tmpdir):
         ["requirements.txt", "main.py", "configuration", "algorithms"]
     )
     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()
     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
 
 
-def test_with_both_core_rest_services(tmpdir):
+def test_with_both_orchestrator_rest_services(tmpdir):
     cookiecutter(
         template="taipy/templates/default",
         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:
         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()
     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 taipy._run import _run
-from taipy.core import Core
+from taipy.core import Orchestrator
 from taipy.gui import Gui
 from taipy.rest import Rest
 
@@ -23,41 +23,41 @@ def test_run_pass_with_gui(gui_run):
     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.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())
     rest_run.assert_called_once()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()
 
 
 @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()
 
 
 @mock.patch("taipy.gui.Gui.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())
     gui_run.assert_called_once()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()
     rest_run.assert_not_called()
 
 
 @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()
-    core_run.assert_called_once()
+    orchestrator_run.assert_called_once()