flwr-nightly 1.8.0.dev20240315__tar.gz → 1.11.0.dev20240813__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flwr-nightly might be problematic. Click here for more details.
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/PKG-INFO +10 -6
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/README.md +5 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/pyproject.toml +19 -26
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/app.py +7 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/build.py +150 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/config_utils.py +219 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/example.py +3 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/install.py +227 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/new.py +285 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/.gitignore.tpl +160 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +56 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/README.md.tpl +1 -5
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +1 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +65 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +56 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +93 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +3 -2
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +58 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +97 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +60 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +15 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/app.py.tpl +89 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/client.py.tpl +126 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/config.yaml.tpl +34 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +57 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +59 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/server.py.tpl +48 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/flwr_tune/static_config.yaml.tpl +11 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +23 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +20 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +20 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +20 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +31 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +24 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +29 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +99 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +57 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +102 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +28 -23
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +53 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +39 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +38 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +34 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +39 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +32 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +36 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +33 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +36 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/run/run.py +219 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/cli/utils.py +138 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/__init__.py +6 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/app.py +239 -248
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/client_app.py +70 -9
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/dpfedavg_numpy_client.py +1 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_adapter_client/__init__.py +15 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_adapter_client/connection.py +97 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_client/connection.py +18 -5
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_rere_client/__init__.py +1 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_rere_client/client_interceptor.py +158 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_rere_client/connection.py +127 -33
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +140 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/heartbeat.py +74 -0
- {flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet → flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/message_handler}/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/message_handler/message_handler.py +7 -7
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/__init__.py +5 -5
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/centraldp_mods.py +4 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/comms_mods.py +4 -4
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/localdp_mod.py +9 -4
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/utils.py +1 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/node_state.py +98 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/node_state_tests.py +4 -3
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/rest_client/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/rest_client/connection.py +177 -157
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/supernode/__init__.py +26 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/client/supernode/app.py +464 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/typing.py +1 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/__init__.py +13 -11
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/address.py +1 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/config.py +193 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/constant.py +42 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/context.py +26 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/date.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/dp.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/grpc.py +6 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/logger.py +79 -8
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/message.py +385 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/object_ref.py +241 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/parametersrecord.py +0 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/record/recordset.py +130 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/recordset_compat.py +8 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/retry_invoker.py +25 -13
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +21 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/quantization.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/serde.py +209 -3
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/telemetry.py +25 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/typing.py +38 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/common/version.py +42 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2.py +41 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2.pyi +110 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2_grpc.py +101 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/clientappio_pb2_grpc.pyi +40 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2.py +36 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2.pyi +121 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/driver_pb2.py +51 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2.pyi +34 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2_grpc.py +70 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/driver_pb2_grpc.pyi +28 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2.py +43 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2.pyi +95 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2_grpc.py +101 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/exec_pb2_grpc.pyi +41 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2.py +30 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2.pyi +56 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fleet_pb2.py +56 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2.pyi +33 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2_grpc.py +102 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/fleet_pb2_grpc.pyi +35 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2.py +32 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2.pyi +43 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2_grpc.py +66 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +24 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2.py +41 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2.pyi +122 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/node_pb2_grpc.py +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/node_pb2_grpc.pyi +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/recordset_pb2_grpc.py +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/recordset_pb2_grpc.pyi +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2.py +35 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2.pyi +76 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2_grpc.py +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/run_pb2_grpc.pyi +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2.py +33 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/task_pb2.pyi +8 -5
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2_grpc.py +4 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/task_pb2_grpc.pyi +4 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/__init__.py +4 -8
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/app.py +298 -350
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/app.py +6 -57
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/app_utils.py +5 -4
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/driver_client_proxy.py +29 -48
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/legacy_context.py +5 -4
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/driver/__init__.py +2 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/driver.py +146 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/grpc_driver.py +279 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/driver/inmemory_driver.py +183 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/history.py +20 -20
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/run_serverapp.py +274 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server.py +11 -7
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server_app.py +59 -10
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/serverapp_components.py +52 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/bulyan.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +3 -3
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dp_fixed_clipping.py +4 -3
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/dpfedavg_fixed.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedadagrad.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedadam.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavg_android.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavgm.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedmedian.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedopt.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedprox.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_bagging.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_cyclic.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedyogi.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/krum.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/qfedavg.py +1 -1
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/driver/__init__.py +15 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/driver/driver_grpc.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/driver/driver_servicer.py +51 -4
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/__init__.py +24 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/disk_ffs.py +104 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/ffs/ffs.py +79 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/__init__.py +15 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +15 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +131 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +15 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +8 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +30 -2
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +214 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +15 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +42 -2
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +15 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +59 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +5 -5
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +53 -56
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +190 -127
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/in_memory_state.py +159 -42
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/sqlite_state.py +243 -39
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/state.py +81 -6
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/state/state_factory.py +11 -2
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/server/superlink/state/utils.py +62 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/typing.py +2 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/tensorboard.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/utils/validator.py +23 -9
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/default_workflows.py +67 -25
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +18 -6
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/__init__.py +7 -4
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/app.py +67 -36
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/ray_actor.py +20 -46
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +36 -16
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/run_simulation.py +308 -92
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/__init__.py +21 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/app.py +184 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/deployment.py +185 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/exec_grpc.py +55 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/exec_servicer.py +70 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/executor.py +75 -0
- flwr_nightly-1.11.0.dev20240813/src/py/flwr/superexec/simulation.py +193 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/flower_toml.py +0 -140
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/new.py +0 -154
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -1
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -46
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -1
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -12
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -28
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -1
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/flower.toml.tpl +0 -13
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -19
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -21
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -21
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.numpy.txt.tpl +0 -2
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.pytorch.txt.tpl +0 -4
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/new/templates/app/requirements.tensorflow.txt.tpl +0 -4
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/run/run.py +0 -68
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/cli/utils.py +0 -67
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/client/message_handler/__init__.py +0 -15
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/client/node_state.py +0 -48
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/message.py +0 -323
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/object_ref.py +0 -140
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/record/recordset.py +0 -79
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/common/version.py +0 -28
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/driver_pb2.py +0 -44
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/fleet_pb2.py +0 -50
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2.py +0 -34
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/driver/driver.py +0 -256
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/driver/grpc_driver.py +0 -129
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/run_serverapp.py +0 -187
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/driver/__init__.py +0 -15
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -15
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -15
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -15
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/LICENSE +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/__init__.py +1 -1
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/__init__.py +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/error_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2_grpc.py +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/error_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/common_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/error_pb2.pyi +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/node_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/node_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/recordset_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/recordset_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2_grpc.py → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- flwr_nightly-1.8.0.dev20240315/src/py/flwr/proto/task_pb2_grpc.pyi → flwr_nightly-1.11.0.dev20240813/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/__init__.py +2 -2
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.11.0.dev20240813
|
|
4
4
|
Summary: Flower: A Friendly Federated Learning Framework
|
|
5
5
|
Home-page: https://flower.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -33,16 +33,17 @@ Classifier: Typing :: Typed
|
|
|
33
33
|
Provides-Extra: rest
|
|
34
34
|
Provides-Extra: simulation
|
|
35
35
|
Requires-Dist: cryptography (>=42.0.4,<43.0.0)
|
|
36
|
-
Requires-Dist: grpcio (>=1.60.0,<2.0.0)
|
|
36
|
+
Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4)
|
|
37
37
|
Requires-Dist: iterators (>=0.0.2,<0.0.3)
|
|
38
38
|
Requires-Dist: numpy (>=1.21.0,<2.0.0)
|
|
39
|
+
Requires-Dist: pathspec (>=0.12.1,<0.13.0)
|
|
39
40
|
Requires-Dist: protobuf (>=4.25.2,<5.0.0)
|
|
40
41
|
Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist: ray (==2.6.3) ; extra == "simulation"
|
|
42
|
+
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.8" and python_version < "3.12") and (extra == "simulation")
|
|
43
43
|
Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
|
|
44
44
|
Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
|
|
45
45
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
|
46
|
+
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
|
46
47
|
Requires-Dist: typer[all] (>=0.9.0,<0.10.0)
|
|
47
48
|
Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
|
|
48
49
|
Project-URL: Documentation, https://flower.ai
|
|
@@ -194,14 +195,17 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
194
195
|
- [PyTorch: From Centralized to Federated](https://github.com/adap/flower/tree/main/examples/pytorch-from-centralized-to-federated)
|
|
195
196
|
- [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
|
|
196
197
|
- [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
|
|
197
|
-
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/
|
|
198
|
+
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
|
|
198
199
|
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit-finetune)
|
|
199
200
|
- [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
|
|
200
201
|
- [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
|
|
201
202
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
202
203
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
203
204
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
204
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
205
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
206
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
207
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
208
|
+
- [Flower with a Tabular Dataset](https://github.com/adap/flower/tree/main/examples/fl-tabular)
|
|
205
209
|
|
|
206
210
|
## Community
|
|
207
211
|
|
|
@@ -143,14 +143,17 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
|
|
|
143
143
|
- [PyTorch: From Centralized to Federated](https://github.com/adap/flower/tree/main/examples/pytorch-from-centralized-to-federated)
|
|
144
144
|
- [Vertical FL](https://github.com/adap/flower/tree/main/examples/vertical-fl)
|
|
145
145
|
- [Federated Finetuning of OpenAI's Whisper](https://github.com/adap/flower/tree/main/examples/whisper-federated-finetuning)
|
|
146
|
-
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/
|
|
146
|
+
- [Federated Finetuning of Large Language Model](https://github.com/adap/flower/tree/main/examples/llm-flowertune)
|
|
147
147
|
- [Federated Finetuning of a Vision Transformer](https://github.com/adap/flower/tree/main/examples/vit-finetune)
|
|
148
148
|
- [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
|
|
149
149
|
- [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
|
|
150
150
|
- Single-Machine Simulation of Federated Learning Systems ([PyTorch](https://github.com/adap/flower/tree/main/examples/simulation-pytorch)) ([Tensorflow](https://github.com/adap/flower/tree/main/examples/simulation-tensorflow))
|
|
151
151
|
- [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
|
|
152
152
|
- [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
|
|
153
|
-
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-
|
|
153
|
+
- [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
|
|
154
|
+
- [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
|
|
155
|
+
- [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
|
|
156
|
+
- [Flower with a Tabular Dataset](https://github.com/adap/flower/tree/main/examples/fl-tabular)
|
|
154
157
|
|
|
155
158
|
## Community
|
|
156
159
|
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "flwr-nightly"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.11.0.dev20240813"
|
|
8
8
|
description = "Flower: A Friendly Federated Learning Framework"
|
|
9
9
|
license = "Apache-2.0"
|
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
|
@@ -53,34 +53,36 @@ exclude = [
|
|
|
53
53
|
|
|
54
54
|
[tool.poetry.scripts]
|
|
55
55
|
flwr = "flwr.cli.app:app"
|
|
56
|
-
flower-driver-api = "flwr.server:run_driver_api"
|
|
57
|
-
flower-fleet-api = "flwr.server:run_fleet_api"
|
|
58
56
|
flower-superlink = "flwr.server:run_superlink"
|
|
57
|
+
flower-superexec = "flwr.superexec:run_superexec"
|
|
58
|
+
flower-supernode = "flwr.client:run_supernode"
|
|
59
59
|
flower-client-app = "flwr.client:run_client_app"
|
|
60
60
|
flower-server-app = "flwr.server:run_server_app"
|
|
61
|
-
flower-simulation = "flwr.simulation:run_simulation_from_cli"
|
|
61
|
+
flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
|
|
62
|
+
flwr-clientapp = "flwr.client.supernode:flwr_clientapp"
|
|
62
63
|
|
|
63
64
|
[tool.poetry.dependencies]
|
|
64
65
|
python = "^3.8"
|
|
65
66
|
# Mandatory dependencies
|
|
66
67
|
numpy = "^1.21.0"
|
|
67
|
-
grpcio = "^1.60.0"
|
|
68
|
+
grpcio = "^1.60.0,!=1.64.2,!=1.65.1,!=1.65.2,!=1.65.4"
|
|
68
69
|
protobuf = "^4.25.2"
|
|
69
70
|
cryptography = "^42.0.4"
|
|
70
71
|
pycryptodome = "^3.18.0"
|
|
71
72
|
iterators = "^0.0.2"
|
|
72
|
-
typer = { version = "^0.9.0", extras=["all"] }
|
|
73
|
+
typer = { version = "^0.9.0", extras = ["all"] }
|
|
73
74
|
tomli = "^2.0.1"
|
|
75
|
+
tomli-w = "^1.0.0"
|
|
76
|
+
pathspec = "^0.12.1"
|
|
74
77
|
# Optional dependencies (Simulation Engine)
|
|
75
|
-
ray = { version = "==2.
|
|
76
|
-
pydantic = { version = "<2.0.0", optional = true }
|
|
78
|
+
ray = { version = "==2.10.0", optional = true, python = ">=3.8,<3.12" }
|
|
77
79
|
# Optional dependencies (REST transport layer)
|
|
78
80
|
requests = { version = "^2.31.0", optional = true }
|
|
79
81
|
starlette = { version = "^0.31.0", optional = true }
|
|
80
82
|
uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
|
|
81
83
|
|
|
82
84
|
[tool.poetry.extras]
|
|
83
|
-
simulation = ["ray"
|
|
85
|
+
simulation = ["ray"]
|
|
84
86
|
rest = ["requests", "starlette", "uvicorn"]
|
|
85
87
|
|
|
86
88
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -104,7 +106,8 @@ jupyterlab = "==4.0.12"
|
|
|
104
106
|
rope = "==1.11.0"
|
|
105
107
|
semver = "==3.0.2"
|
|
106
108
|
sphinx = "==6.2.1"
|
|
107
|
-
sphinx-intl = "==2.
|
|
109
|
+
sphinx-intl = "==2.2.0"
|
|
110
|
+
sphinx-click = "==5.1.0"
|
|
108
111
|
myst-parser = "==1.0.0"
|
|
109
112
|
sphinx-design = "==0.5.0"
|
|
110
113
|
sphinx-copybutton = "==0.5.2"
|
|
@@ -112,7 +115,7 @@ sphinxcontrib-mermaid = "==0.9.2"
|
|
|
112
115
|
sphinxcontrib-youtube = "==1.4.1"
|
|
113
116
|
furo = "==2023.9.10"
|
|
114
117
|
sphinx-reredirects = "==0.1.3"
|
|
115
|
-
nbsphinx = "==0.9.
|
|
118
|
+
nbsphinx = "==0.9.4"
|
|
116
119
|
nbstripout = "==0.6.1"
|
|
117
120
|
ruff = "==0.1.9"
|
|
118
121
|
sphinx-argparse = "==0.4.0"
|
|
@@ -121,21 +124,18 @@ mdformat-gfm = "==0.3.5"
|
|
|
121
124
|
mdformat-frontmatter = "==2.0.1"
|
|
122
125
|
mdformat-beautysh = "==0.1.1"
|
|
123
126
|
mdformat-myst = "==0.1.5"
|
|
124
|
-
twine = "==
|
|
127
|
+
twine = "==5.1.1"
|
|
125
128
|
pyroma = "==4.2"
|
|
126
129
|
check-wheel-contents = "==0.4.0"
|
|
127
130
|
GitPython = "==3.1.32"
|
|
128
131
|
PyGithub = "==2.1.1"
|
|
129
132
|
licensecheck = "==2024"
|
|
133
|
+
pre-commit = "==3.5.0"
|
|
134
|
+
sphinx-substitution-extensions = "2022.02.16"
|
|
130
135
|
|
|
131
136
|
[tool.isort]
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
multi_line_output = 3
|
|
135
|
-
include_trailing_comma = true
|
|
136
|
-
force_grid_wrap = 0
|
|
137
|
-
use_parentheses = true
|
|
138
|
-
known_first_party = ["flwr", "flwr_experimental", "flwr_tool"]
|
|
137
|
+
profile = "black"
|
|
138
|
+
known_first_party = ["flwr", "flwr_tool"]
|
|
139
139
|
|
|
140
140
|
[tool.black]
|
|
141
141
|
line-length = 88
|
|
@@ -169,13 +169,6 @@ plugins = [
|
|
|
169
169
|
ignore_missing_imports = true
|
|
170
170
|
strict = true
|
|
171
171
|
|
|
172
|
-
[[tool.mypy.overrides]]
|
|
173
|
-
module = [
|
|
174
|
-
"flwr_example.*",
|
|
175
|
-
"flwr_experimental.*",
|
|
176
|
-
]
|
|
177
|
-
ignore_errors = true
|
|
178
|
-
|
|
179
172
|
[[tool.mypy.overrides]]
|
|
180
173
|
module = [
|
|
181
174
|
"importlib.metadata.*",
|
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
"""Flower command line interface."""
|
|
16
16
|
|
|
17
17
|
import typer
|
|
18
|
+
from typer.main import get_command
|
|
18
19
|
|
|
20
|
+
from .build import build
|
|
19
21
|
from .example import example
|
|
22
|
+
from .install import install
|
|
20
23
|
from .new import new
|
|
21
24
|
from .run import run
|
|
22
25
|
|
|
@@ -32,6 +35,10 @@ app = typer.Typer(
|
|
|
32
35
|
app.command()(new)
|
|
33
36
|
app.command()(example)
|
|
34
37
|
app.command()(run)
|
|
38
|
+
app.command()(build)
|
|
39
|
+
app.command()(install)
|
|
40
|
+
|
|
41
|
+
typer_click_object = get_command(app)
|
|
35
42
|
|
|
36
43
|
if __name__ == "__main__":
|
|
37
44
|
app()
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Flower command line interface `build` command."""
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
import zipfile
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Optional
|
|
21
|
+
|
|
22
|
+
import pathspec
|
|
23
|
+
import tomli_w
|
|
24
|
+
import typer
|
|
25
|
+
from typing_extensions import Annotated
|
|
26
|
+
|
|
27
|
+
from .config_utils import load_and_validate
|
|
28
|
+
from .utils import get_sha256_hash, is_valid_project_name
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# pylint: disable=too-many-locals
|
|
32
|
+
def build(
|
|
33
|
+
app: Annotated[
|
|
34
|
+
Optional[Path],
|
|
35
|
+
typer.Option(help="Path of the Flower App to bundle into a FAB"),
|
|
36
|
+
] = None,
|
|
37
|
+
) -> str:
|
|
38
|
+
"""Build a Flower App into a Flower App Bundle (FAB).
|
|
39
|
+
|
|
40
|
+
You can run ``flwr build`` without any arguments to bundle the app located in the
|
|
41
|
+
current directory. Alternatively, you can you can specify a path using the ``--app``
|
|
42
|
+
option to bundle an app located at the provided path. For example:
|
|
43
|
+
|
|
44
|
+
``flwr build --app ./apps/flower-hello-world``.
|
|
45
|
+
"""
|
|
46
|
+
if app is None:
|
|
47
|
+
app = Path.cwd()
|
|
48
|
+
|
|
49
|
+
app = app.resolve()
|
|
50
|
+
if not app.is_dir():
|
|
51
|
+
typer.secho(
|
|
52
|
+
f"❌ The path {app} is not a valid path to a Flower app.",
|
|
53
|
+
fg=typer.colors.RED,
|
|
54
|
+
bold=True,
|
|
55
|
+
)
|
|
56
|
+
raise typer.Exit(code=1)
|
|
57
|
+
|
|
58
|
+
if not is_valid_project_name(app.name):
|
|
59
|
+
typer.secho(
|
|
60
|
+
f"❌ The project name {app.name} is invalid, "
|
|
61
|
+
"a valid project name must start with a letter or an underscore, "
|
|
62
|
+
"and can only contain letters, digits, and underscores.",
|
|
63
|
+
fg=typer.colors.RED,
|
|
64
|
+
bold=True,
|
|
65
|
+
)
|
|
66
|
+
raise typer.Exit(code=1)
|
|
67
|
+
|
|
68
|
+
conf, errors, warnings = load_and_validate(app / "pyproject.toml")
|
|
69
|
+
if conf is None:
|
|
70
|
+
typer.secho(
|
|
71
|
+
"Project configuration could not be loaded.\npyproject.toml is invalid:\n"
|
|
72
|
+
+ "\n".join([f"- {line}" for line in errors]),
|
|
73
|
+
fg=typer.colors.RED,
|
|
74
|
+
bold=True,
|
|
75
|
+
)
|
|
76
|
+
raise typer.Exit(code=1)
|
|
77
|
+
|
|
78
|
+
if warnings:
|
|
79
|
+
typer.secho(
|
|
80
|
+
"Project configuration is missing the following "
|
|
81
|
+
"recommended properties:\n" + "\n".join([f"- {line}" for line in warnings]),
|
|
82
|
+
fg=typer.colors.RED,
|
|
83
|
+
bold=True,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Load .gitignore rules if present
|
|
87
|
+
ignore_spec = _load_gitignore(app)
|
|
88
|
+
|
|
89
|
+
# Set the name of the zip file
|
|
90
|
+
fab_filename = (
|
|
91
|
+
f"{conf['tool']['flwr']['app']['publisher']}"
|
|
92
|
+
f".{app.name}"
|
|
93
|
+
f".{conf['project']['version'].replace('.', '-')}.fab"
|
|
94
|
+
)
|
|
95
|
+
list_file_content = ""
|
|
96
|
+
|
|
97
|
+
allowed_extensions = {".py", ".toml", ".md"}
|
|
98
|
+
|
|
99
|
+
# Remove the 'federations' field from 'tool.flwr' if it exists
|
|
100
|
+
if (
|
|
101
|
+
"tool" in conf
|
|
102
|
+
and "flwr" in conf["tool"]
|
|
103
|
+
and "federations" in conf["tool"]["flwr"]
|
|
104
|
+
):
|
|
105
|
+
del conf["tool"]["flwr"]["federations"]
|
|
106
|
+
|
|
107
|
+
toml_contents = tomli_w.dumps(conf)
|
|
108
|
+
|
|
109
|
+
with zipfile.ZipFile(fab_filename, "w", zipfile.ZIP_DEFLATED) as fab_file:
|
|
110
|
+
fab_file.writestr("pyproject.toml", toml_contents)
|
|
111
|
+
|
|
112
|
+
# Continue with adding other files
|
|
113
|
+
for root, _, files in os.walk(app, topdown=True):
|
|
114
|
+
files = [
|
|
115
|
+
f
|
|
116
|
+
for f in files
|
|
117
|
+
if not ignore_spec.match_file(Path(root) / f)
|
|
118
|
+
and f != fab_filename
|
|
119
|
+
and Path(f).suffix in allowed_extensions
|
|
120
|
+
and f != "pyproject.toml" # Exclude the original pyproject.toml
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
for file in files:
|
|
124
|
+
file_path = Path(root) / file
|
|
125
|
+
archive_path = file_path.relative_to(app)
|
|
126
|
+
fab_file.write(file_path, archive_path)
|
|
127
|
+
|
|
128
|
+
# Calculate file info
|
|
129
|
+
sha256_hash = get_sha256_hash(file_path)
|
|
130
|
+
file_size_bits = os.path.getsize(file_path) * 8 # size in bits
|
|
131
|
+
list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
|
|
132
|
+
|
|
133
|
+
# Add CONTENT and CONTENT.jwt to the zip file
|
|
134
|
+
fab_file.writestr(".info/CONTENT", list_file_content)
|
|
135
|
+
|
|
136
|
+
typer.secho(
|
|
137
|
+
f"🎊 Successfully built {fab_filename}", fg=typer.colors.GREEN, bold=True
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return fab_filename
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _load_gitignore(app: Path) -> pathspec.PathSpec:
|
|
144
|
+
"""Load and parse .gitignore file, returning a pathspec."""
|
|
145
|
+
gitignore_path = app / ".gitignore"
|
|
146
|
+
patterns = ["__pycache__/"] # Default pattern
|
|
147
|
+
if gitignore_path.exists():
|
|
148
|
+
with open(gitignore_path, encoding="UTF-8") as file:
|
|
149
|
+
patterns.extend(file.readlines())
|
|
150
|
+
return pathspec.PathSpec.from_lines("gitwildmatch", patterns)
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Copyright 2024 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Utility to validate the `pyproject.toml` file."""
|
|
16
|
+
|
|
17
|
+
import zipfile
|
|
18
|
+
from io import BytesIO
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import IO, Any, Dict, List, Optional, Tuple, Union, get_args
|
|
21
|
+
|
|
22
|
+
import tomli
|
|
23
|
+
|
|
24
|
+
from flwr.common import object_ref
|
|
25
|
+
from flwr.common.typing import UserConfigValue
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_fab_config(fab_file: Union[Path, bytes]) -> Dict[str, Any]:
|
|
29
|
+
"""Extract the config from a FAB file or path.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
fab_file : Union[Path, bytes]
|
|
34
|
+
The Flower App Bundle file to validate and extract the metadata from.
|
|
35
|
+
It can either be a path to the file or the file itself as bytes.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
Dict[str, Any]
|
|
40
|
+
The `config` of the given Flower App Bundle.
|
|
41
|
+
"""
|
|
42
|
+
fab_file_archive: Union[Path, IO[bytes]]
|
|
43
|
+
if isinstance(fab_file, bytes):
|
|
44
|
+
fab_file_archive = BytesIO(fab_file)
|
|
45
|
+
elif isinstance(fab_file, Path):
|
|
46
|
+
fab_file_archive = fab_file
|
|
47
|
+
else:
|
|
48
|
+
raise ValueError("fab_file must be either a Path or bytes")
|
|
49
|
+
|
|
50
|
+
with zipfile.ZipFile(fab_file_archive, "r") as zipf:
|
|
51
|
+
with zipf.open("pyproject.toml") as file:
|
|
52
|
+
toml_content = file.read().decode("utf-8")
|
|
53
|
+
|
|
54
|
+
conf = load_from_string(toml_content)
|
|
55
|
+
if conf is None:
|
|
56
|
+
raise ValueError("Invalid TOML content in pyproject.toml")
|
|
57
|
+
|
|
58
|
+
is_valid, errors, _ = validate(conf, check_module=False)
|
|
59
|
+
if not is_valid:
|
|
60
|
+
raise ValueError(errors)
|
|
61
|
+
|
|
62
|
+
return conf
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def get_fab_metadata(fab_file: Union[Path, bytes]) -> Tuple[str, str]:
|
|
66
|
+
"""Extract the fab_id and the fab_version from a FAB file or path.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
fab_file : Union[Path, bytes]
|
|
71
|
+
The Flower App Bundle file to validate and extract the metadata from.
|
|
72
|
+
It can either be a path to the file or the file itself as bytes.
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
Tuple[str, str]
|
|
77
|
+
The `fab_version` and `fab_id` of the given Flower App Bundle.
|
|
78
|
+
"""
|
|
79
|
+
conf = get_fab_config(fab_file)
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
conf["project"]["version"],
|
|
83
|
+
f"{conf['tool']['flwr']['app']['publisher']}/{conf['project']['name']}",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def load_and_validate(
|
|
88
|
+
path: Optional[Path] = None,
|
|
89
|
+
check_module: bool = True,
|
|
90
|
+
) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
|
|
91
|
+
"""Load and validate pyproject.toml as dict.
|
|
92
|
+
|
|
93
|
+
Returns
|
|
94
|
+
-------
|
|
95
|
+
Tuple[Optional[config], List[str], List[str]]
|
|
96
|
+
A tuple with the optional config in case it exists and is valid
|
|
97
|
+
and associated errors and warnings.
|
|
98
|
+
"""
|
|
99
|
+
if path is None:
|
|
100
|
+
path = Path.cwd() / "pyproject.toml"
|
|
101
|
+
|
|
102
|
+
config = load(path)
|
|
103
|
+
|
|
104
|
+
if config is None:
|
|
105
|
+
errors = [
|
|
106
|
+
"Project configuration could not be loaded. "
|
|
107
|
+
"`pyproject.toml` does not exist."
|
|
108
|
+
]
|
|
109
|
+
return (None, errors, [])
|
|
110
|
+
|
|
111
|
+
is_valid, errors, warnings = validate(config, check_module, path.parent)
|
|
112
|
+
|
|
113
|
+
if not is_valid:
|
|
114
|
+
return (None, errors, warnings)
|
|
115
|
+
|
|
116
|
+
return (config, errors, warnings)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def load(toml_path: Path) -> Optional[Dict[str, Any]]:
|
|
120
|
+
"""Load pyproject.toml and return as dict."""
|
|
121
|
+
if not toml_path.is_file():
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
with toml_path.open(encoding="utf-8") as toml_file:
|
|
125
|
+
return load_from_string(toml_file.read())
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _validate_run_config(config_dict: Dict[str, Any], errors: List[str]) -> None:
|
|
129
|
+
for key, value in config_dict.items():
|
|
130
|
+
if isinstance(value, dict):
|
|
131
|
+
_validate_run_config(config_dict[key], errors)
|
|
132
|
+
elif not isinstance(value, get_args(UserConfigValue)):
|
|
133
|
+
raise ValueError(
|
|
134
|
+
f"The value for key {key} needs to be of type `int`, `float`, "
|
|
135
|
+
"`bool, `str`, or a `dict` of those.",
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# pylint: disable=too-many-branches
|
|
140
|
+
def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
|
|
141
|
+
"""Validate pyproject.toml fields."""
|
|
142
|
+
errors = []
|
|
143
|
+
warnings = []
|
|
144
|
+
|
|
145
|
+
if "project" not in config:
|
|
146
|
+
errors.append("Missing [project] section")
|
|
147
|
+
else:
|
|
148
|
+
if "name" not in config["project"]:
|
|
149
|
+
errors.append('Property "name" missing in [project]')
|
|
150
|
+
if "version" not in config["project"]:
|
|
151
|
+
errors.append('Property "version" missing in [project]')
|
|
152
|
+
if "description" not in config["project"]:
|
|
153
|
+
warnings.append('Recommended property "description" missing in [project]')
|
|
154
|
+
if "license" not in config["project"]:
|
|
155
|
+
warnings.append('Recommended property "license" missing in [project]')
|
|
156
|
+
if "authors" not in config["project"]:
|
|
157
|
+
warnings.append('Recommended property "authors" missing in [project]')
|
|
158
|
+
|
|
159
|
+
if (
|
|
160
|
+
"tool" not in config
|
|
161
|
+
or "flwr" not in config["tool"]
|
|
162
|
+
or "app" not in config["tool"]["flwr"]
|
|
163
|
+
):
|
|
164
|
+
errors.append("Missing [tool.flwr.app] section")
|
|
165
|
+
else:
|
|
166
|
+
if "publisher" not in config["tool"]["flwr"]["app"]:
|
|
167
|
+
errors.append('Property "publisher" missing in [tool.flwr.app]')
|
|
168
|
+
if "config" in config["tool"]["flwr"]["app"]:
|
|
169
|
+
_validate_run_config(config["tool"]["flwr"]["app"]["config"], errors)
|
|
170
|
+
if "components" not in config["tool"]["flwr"]["app"]:
|
|
171
|
+
errors.append("Missing [tool.flwr.app.components] section")
|
|
172
|
+
else:
|
|
173
|
+
if "serverapp" not in config["tool"]["flwr"]["app"]["components"]:
|
|
174
|
+
errors.append(
|
|
175
|
+
'Property "serverapp" missing in [tool.flwr.app.components]'
|
|
176
|
+
)
|
|
177
|
+
if "clientapp" not in config["tool"]["flwr"]["app"]["components"]:
|
|
178
|
+
errors.append(
|
|
179
|
+
'Property "clientapp" missing in [tool.flwr.app.components]'
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
return len(errors) == 0, errors, warnings
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def validate(
|
|
186
|
+
config: Dict[str, Any],
|
|
187
|
+
check_module: bool = True,
|
|
188
|
+
project_dir: Optional[Union[str, Path]] = None,
|
|
189
|
+
) -> Tuple[bool, List[str], List[str]]:
|
|
190
|
+
"""Validate pyproject.toml."""
|
|
191
|
+
is_valid, errors, warnings = validate_fields(config)
|
|
192
|
+
|
|
193
|
+
if not is_valid:
|
|
194
|
+
return False, errors, warnings
|
|
195
|
+
|
|
196
|
+
# Validate serverapp
|
|
197
|
+
serverapp_ref = config["tool"]["flwr"]["app"]["components"]["serverapp"]
|
|
198
|
+
is_valid, reason = object_ref.validate(serverapp_ref, check_module, project_dir)
|
|
199
|
+
|
|
200
|
+
if not is_valid and isinstance(reason, str):
|
|
201
|
+
return False, [reason], []
|
|
202
|
+
|
|
203
|
+
# Validate clientapp
|
|
204
|
+
clientapp_ref = config["tool"]["flwr"]["app"]["components"]["clientapp"]
|
|
205
|
+
is_valid, reason = object_ref.validate(clientapp_ref, check_module, project_dir)
|
|
206
|
+
|
|
207
|
+
if not is_valid and isinstance(reason, str):
|
|
208
|
+
return False, [reason], []
|
|
209
|
+
|
|
210
|
+
return True, [], []
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def load_from_string(toml_content: str) -> Optional[Dict[str, Any]]:
|
|
214
|
+
"""Load TOML content from a string and return as dict."""
|
|
215
|
+
try:
|
|
216
|
+
data = tomli.loads(toml_content)
|
|
217
|
+
return data
|
|
218
|
+
except tomli.TOMLDecodeError:
|
|
219
|
+
return None
|
{flwr_nightly-1.8.0.dev20240315 → flwr_nightly-1.11.0.dev20240813}/src/py/flwr/cli/example.py
RENAMED
|
@@ -39,7 +39,9 @@ def example() -> None:
|
|
|
39
39
|
with urllib.request.urlopen(examples_directory_url) as res:
|
|
40
40
|
data = json.load(res)
|
|
41
41
|
example_names = [
|
|
42
|
-
item["path"]
|
|
42
|
+
item["path"]
|
|
43
|
+
for item in data["tree"]
|
|
44
|
+
if item["path"] not in [".gitignore", "doc"]
|
|
43
45
|
]
|
|
44
46
|
|
|
45
47
|
example_name = prompt_options(
|