flwr-nightly 1.9.0.dev20240531__tar.gz → 1.10.0.dev20240612__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.

Files changed (242) hide show
  1. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/PKG-INFO +1 -1
  2. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/pyproject.toml +3 -5
  3. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/app.py +2 -0
  4. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/build.py +2 -15
  5. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/config_utils.py +11 -4
  6. flwr_nightly-1.10.0.dev20240612/src/py/flwr/cli/install.py +196 -0
  7. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.hf.toml.tpl +1 -1
  8. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  9. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  10. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  11. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  12. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  13. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  14. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/utils.py +14 -0
  15. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/__init__.py +1 -0
  16. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/app.py +135 -97
  17. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/client_app.py +1 -1
  18. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  19. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/connection.py +1 -4
  20. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/__init__.py +1 -1
  21. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/rest_client/connection.py +1 -2
  22. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/supernode/app.py +29 -5
  23. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/object_ref.py +13 -9
  24. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/driver_pb2.py +45 -0
  25. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2_grpc.py +35 -0
  26. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2_grpc.pyi +14 -0
  27. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/fleet_pb2.py +55 -0
  28. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2.pyi +0 -42
  29. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2_grpc.py +7 -6
  30. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/fleet_pb2_grpc.pyi +5 -4
  31. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2.py +30 -0
  32. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2.pyi +52 -0
  33. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/task_pb2_grpc.py +4 -0
  34. flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/task_pb2_grpc.pyi +4 -0
  35. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/__init__.py +0 -4
  36. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/app.py +57 -214
  37. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/run_serverapp.py +29 -5
  38. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server_app.py +2 -2
  39. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/driver_servicer.py +7 -0
  40. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -2
  41. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -2
  42. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
  43. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +1 -1
  44. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/driver_pb2.py +0 -44
  45. flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/fleet_pb2.py +0 -60
  46. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/LICENSE +0 -0
  47. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/README.md +0 -0
  48. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/__init__.py +0 -0
  49. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/__init__.py +0 -0
  50. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/example.py +0 -0
  51. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/__init__.py +0 -0
  52. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/new.py +0 -0
  53. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  54. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  55. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  56. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  57. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  58. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  59. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.hf.py.tpl +0 -0
  60. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  61. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  62. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  63. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  64. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  65. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  66. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.hf.py.tpl +0 -0
  67. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  68. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.hf.py.tpl +0 -0
  74. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  75. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  77. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  78. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/run/__init__.py +0 -0
  79. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/cli/run/run.py +0 -0
  80. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/client.py +0 -0
  81. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  82. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  83. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_client/connection.py +0 -0
  84. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  85. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/heartbeat.py +0 -0
  86. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/__init__.py +0 -0
  87. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  88. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  89. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  90. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/comms_mods.py +0 -0
  91. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  92. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  93. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  94. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  95. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/mod/utils.py +0 -0
  96. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/node_state.py +0 -0
  97. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/node_state_tests.py +0 -0
  98. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/numpy_client.py +0 -0
  99. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/rest_client/__init__.py +0 -0
  100. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/supernode/__init__.py +0 -0
  101. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/client/typing.py +0 -0
  102. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/__init__.py +0 -0
  103. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/address.py +0 -0
  104. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/constant.py +0 -0
  105. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/context.py +0 -0
  106. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/date.py +0 -0
  107. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/differential_privacy.py +0 -0
  108. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  109. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/dp.py +0 -0
  110. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/exit_handlers.py +0 -0
  111. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/grpc.py +0 -0
  112. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/logger.py +0 -0
  113. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/message.py +0 -0
  114. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/parameter.py +0 -0
  115. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/pyproject.py +0 -0
  116. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/__init__.py +0 -0
  117. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/configsrecord.py +0 -0
  118. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/conversion_utils.py +0 -0
  119. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/metricsrecord.py +0 -0
  120. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/parametersrecord.py +0 -0
  121. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/recordset.py +0 -0
  122. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/record/typeddict.py +0 -0
  123. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/recordset_compat.py +0 -0
  124. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/retry_invoker.py +0 -0
  125. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  126. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  127. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  128. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  129. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  130. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  131. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  132. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  133. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/serde.py +0 -0
  134. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/telemetry.py +0 -0
  135. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/typing.py +0 -0
  136. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/common/version.py +0 -0
  137. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/__init__.py +0 -0
  138. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  139. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2.py +0 -0
  140. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2.pyi +0 -0
  141. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  142. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  143. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  144. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  145. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  146. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  147. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2.py +0 -0
  148. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2.pyi +0 -0
  149. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  150. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  151. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2.py +0 -0
  152. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  153. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  154. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  155. /flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/task_pb2_grpc.py → /flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  156. /flwr_nightly-1.9.0.dev20240531/src/py/flwr/proto/task_pb2_grpc.pyi → /flwr_nightly-1.10.0.dev20240612/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/task_pb2.py +0 -0
  158. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/task_pb2.pyi +0 -0
  159. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2.py +0 -0
  160. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  161. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  162. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  163. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/py.typed +0 -0
  164. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/client_manager.py +0 -0
  165. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/client_proxy.py +0 -0
  166. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/__init__.py +0 -0
  167. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/app.py +0 -0
  168. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/app_utils.py +0 -0
  169. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  170. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/compat/legacy_context.py +0 -0
  171. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/criterion.py +0 -0
  172. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/__init__.py +0 -0
  173. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/driver.py +0 -0
  174. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  175. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  176. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/history.py +0 -0
  177. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server.py +0 -0
  178. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/server_config.py +0 -0
  179. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/__init__.py +0 -0
  180. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/aggregate.py +0 -0
  181. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/bulyan.py +0 -0
  182. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  183. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  184. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  185. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  186. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  187. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  188. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedadam.py +0 -0
  189. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavg.py +0 -0
  190. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  191. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  192. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  193. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedopt.py +0 -0
  194. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedprox.py +0 -0
  195. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  196. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  197. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  198. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  199. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  200. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/krum.py +0 -0
  201. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  202. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/strategy/strategy.py +0 -0
  203. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/__init__.py +0 -0
  204. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  205. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  206. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  207. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  208. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  209. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  210. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  211. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  212. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  213. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  214. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  215. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  216. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  217. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  218. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  219. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  220. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  221. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/in_memory_state.py +0 -0
  222. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/sqlite_state.py +0 -0
  223. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/state.py +0 -0
  224. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  225. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/superlink/state/utils.py +0 -0
  226. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/typing.py +0 -0
  227. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/__init__.py +0 -0
  228. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/tensorboard.py +0 -0
  229. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/utils/validator.py +0 -0
  230. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/__init__.py +0 -0
  231. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/constant.py +0 -0
  232. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  233. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  234. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  235. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  236. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/__init__.py +0 -0
  237. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/app.py +0 -0
  238. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  239. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  240. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  241. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  242. {flwr_nightly-1.9.0.dev20240531 → flwr_nightly-1.10.0.dev20240612}/src/py/flwr/simulation/run_simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.9.0.dev20240531
3
+ Version: 1.10.0.dev20240612
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.9.0.dev20240531"
7
+ version = "1.10.0.dev20240612"
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,8 +53,6 @@ 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"
59
57
  flower-supernode = "flwr.client:run_supernode"
60
58
  flower-client-app = "flwr.client:run_client_app"
@@ -105,7 +103,7 @@ jupyterlab = "==4.0.12"
105
103
  rope = "==1.11.0"
106
104
  semver = "==3.0.2"
107
105
  sphinx = "==6.2.1"
108
- sphinx-intl = "==2.1.0"
106
+ sphinx-intl = "==2.2.0"
109
107
  myst-parser = "==1.0.0"
110
108
  sphinx-design = "==0.5.0"
111
109
  sphinx-copybutton = "==0.5.2"
@@ -113,7 +111,7 @@ sphinxcontrib-mermaid = "==0.9.2"
113
111
  sphinxcontrib-youtube = "==1.4.1"
114
112
  furo = "==2023.9.10"
115
113
  sphinx-reredirects = "==0.1.3"
116
- nbsphinx = "==0.9.3"
114
+ nbsphinx = "==0.9.4"
117
115
  nbstripout = "==0.6.1"
118
116
  ruff = "==0.1.9"
119
117
  sphinx-argparse = "==0.4.0"
@@ -18,6 +18,7 @@ import typer
18
18
 
19
19
  from .build import build
20
20
  from .example import example
21
+ from .install import install
21
22
  from .new import new
22
23
  from .run import run
23
24
 
@@ -34,6 +35,7 @@ app.command()(new)
34
35
  app.command()(example)
35
36
  app.command()(run)
36
37
  app.command()(build)
38
+ app.command()(install)
37
39
 
38
40
  if __name__ == "__main__":
39
41
  app()
@@ -14,7 +14,6 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface `build` command."""
16
16
 
17
- import hashlib
18
17
  import os
19
18
  import zipfile
20
19
  from pathlib import Path
@@ -25,7 +24,7 @@ import typer
25
24
  from typing_extensions import Annotated
26
25
 
27
26
  from .config_utils import load_and_validate
28
- from .utils import is_valid_project_name
27
+ from .utils import get_sha256_hash, is_valid_project_name
29
28
 
30
29
 
31
30
  # pylint: disable=too-many-locals
@@ -115,7 +114,7 @@ def build(
115
114
  fab_file.write(file_path, archive_path)
116
115
 
117
116
  # Calculate file info
118
- sha256_hash = _get_sha256_hash(file_path)
117
+ sha256_hash = get_sha256_hash(file_path)
119
118
  file_size_bits = os.path.getsize(file_path) * 8 # size in bits
120
119
  list_file_content += f"{archive_path},{sha256_hash},{file_size_bits}\n"
121
120
 
@@ -127,18 +126,6 @@ def build(
127
126
  )
128
127
 
129
128
 
130
- def _get_sha256_hash(file_path: Path) -> str:
131
- """Calculate the SHA-256 hash of a file."""
132
- sha256 = hashlib.sha256()
133
- with open(file_path, "rb") as f:
134
- while True:
135
- data = f.read(65536) # Read in 64kB blocks
136
- if not data:
137
- break
138
- sha256.update(data)
139
- return sha256.hexdigest()
140
-
141
-
142
129
  def _load_gitignore(directory: Path) -> pathspec.PathSpec:
143
130
  """Load and parse .gitignore file, returning a pathspec."""
144
131
  gitignore_path = directory / ".gitignore"
@@ -24,6 +24,7 @@ from flwr.common import object_ref
24
24
 
25
25
  def load_and_validate(
26
26
  path: Optional[Path] = None,
27
+ check_module: bool = True,
27
28
  ) -> Tuple[Optional[Dict[str, Any]], List[str], List[str]]:
28
29
  """Load and validate pyproject.toml as dict.
29
30
 
@@ -42,7 +43,7 @@ def load_and_validate(
42
43
  ]
43
44
  return (None, errors, [])
44
45
 
45
- is_valid, errors, warnings = validate(config)
46
+ is_valid, errors, warnings = validate(config, check_module)
46
47
 
47
48
  if not is_valid:
48
49
  return (None, errors, warnings)
@@ -102,7 +103,9 @@ def validate_fields(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]
102
103
  return len(errors) == 0, errors, warnings
103
104
 
104
105
 
105
- def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
106
+ def validate(
107
+ config: Dict[str, Any], check_module: bool = True
108
+ ) -> Tuple[bool, List[str], List[str]]:
106
109
  """Validate pyproject.toml."""
107
110
  is_valid, errors, warnings = validate_fields(config)
108
111
 
@@ -110,12 +113,16 @@ def validate(config: Dict[str, Any]) -> Tuple[bool, List[str], List[str]]:
110
113
  return False, errors, warnings
111
114
 
112
115
  # Validate serverapp
113
- is_valid, reason = object_ref.validate(config["flower"]["components"]["serverapp"])
116
+ is_valid, reason = object_ref.validate(
117
+ config["flower"]["components"]["serverapp"], check_module
118
+ )
114
119
  if not is_valid and isinstance(reason, str):
115
120
  return False, [reason], []
116
121
 
117
122
  # Validate clientapp
118
- is_valid, reason = object_ref.validate(config["flower"]["components"]["clientapp"])
123
+ is_valid, reason = object_ref.validate(
124
+ config["flower"]["components"]["clientapp"], check_module
125
+ )
119
126
 
120
127
  if not is_valid and isinstance(reason, str):
121
128
  return False, [reason], []
@@ -0,0 +1,196 @@
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 `install` command."""
16
+
17
+
18
+ import os
19
+ import shutil
20
+ import tempfile
21
+ import zipfile
22
+ from pathlib import Path
23
+ from typing import Optional
24
+
25
+ import typer
26
+ from typing_extensions import Annotated
27
+
28
+ from .config_utils import load_and_validate
29
+ from .utils import get_sha256_hash
30
+
31
+
32
+ def install(
33
+ source: Annotated[
34
+ Optional[Path],
35
+ typer.Argument(metavar="source", help="The source FAB file to install."),
36
+ ] = None,
37
+ flwr_dir: Annotated[
38
+ Optional[Path],
39
+ typer.Option(help="The desired install path."),
40
+ ] = None,
41
+ ) -> None:
42
+ """Install a Flower App Bundle.
43
+
44
+ It can be ran with a single FAB file argument:
45
+
46
+ ``flwr install ./target_project.fab``
47
+
48
+ The target install directory can be specified with ``--flwr-dir``:
49
+
50
+ ``flwr install ./target_project.fab --flwr-dir ./docs/flwr``
51
+
52
+ This will install ``target_project`` to ``./docs/flwr/``. By default,
53
+ ``flwr-dir`` is equal to:
54
+
55
+ - ``$FLWR_HOME/`` if ``$FLWR_HOME`` is defined
56
+ - ``$XDG_DATA_HOME/.flwr/`` if ``$XDG_DATA_HOME`` is defined
57
+ - ``$HOME/.flwr/`` in all other cases
58
+ """
59
+ if source is None:
60
+ source = Path(typer.prompt("Enter the source FAB file"))
61
+
62
+ source = source.resolve()
63
+ if not source.exists() or not source.is_file():
64
+ typer.secho(
65
+ f"❌ The source {source} does not exist or is not a file.",
66
+ fg=typer.colors.RED,
67
+ bold=True,
68
+ )
69
+ raise typer.Exit(code=1)
70
+
71
+ if source.suffix != ".fab":
72
+ typer.secho(
73
+ f"❌ The source {source} is not a `.fab` file.",
74
+ fg=typer.colors.RED,
75
+ bold=True,
76
+ )
77
+ raise typer.Exit(code=1)
78
+
79
+ install_from_fab(source, flwr_dir)
80
+
81
+
82
+ def install_from_fab(
83
+ fab_file: Path, flwr_dir: Optional[Path], skip_prompt: bool = False
84
+ ) -> None:
85
+ """Install from a FAB file after extracting and validating."""
86
+ with tempfile.TemporaryDirectory() as tmpdir:
87
+ with zipfile.ZipFile(fab_file, "r") as zipf:
88
+ zipf.extractall(tmpdir)
89
+ tmpdir_path = Path(tmpdir)
90
+ info_dir = tmpdir_path / ".info"
91
+ if not info_dir.exists():
92
+ typer.secho(
93
+ "❌ FAB file has incorrect format.",
94
+ fg=typer.colors.RED,
95
+ bold=True,
96
+ )
97
+ raise typer.Exit(code=1)
98
+
99
+ content_file = info_dir / "CONTENT"
100
+
101
+ if not content_file.exists() or not _verify_hashes(
102
+ content_file.read_text(), tmpdir_path
103
+ ):
104
+ typer.secho(
105
+ "❌ File hashes couldn't be verified.",
106
+ fg=typer.colors.RED,
107
+ bold=True,
108
+ )
109
+ raise typer.Exit(code=1)
110
+
111
+ shutil.rmtree(info_dir)
112
+
113
+ validate_and_install(tmpdir_path, fab_file.stem, flwr_dir, skip_prompt)
114
+
115
+
116
+ def validate_and_install(
117
+ project_dir: Path,
118
+ fab_name: str,
119
+ flwr_dir: Optional[Path],
120
+ skip_prompt: bool = False,
121
+ ) -> None:
122
+ """Validate TOML files and install the project to the desired directory."""
123
+ config, _, _ = load_and_validate(project_dir / "pyproject.toml", check_module=False)
124
+
125
+ if config is None:
126
+ typer.secho(
127
+ "❌ Invalid config inside FAB file.",
128
+ fg=typer.colors.RED,
129
+ bold=True,
130
+ )
131
+ raise typer.Exit(code=1)
132
+
133
+ publisher = config["flower"]["publisher"]
134
+ project_name = config["project"]["name"]
135
+ version = config["project"]["version"]
136
+
137
+ if fab_name != f"{publisher}.{project_name}.{version.replace('.', '-')}":
138
+ typer.secho(
139
+ "❌ FAB file has incorrect name. The file name must follow the format "
140
+ "`<publisher>.<project_name>.<version>.fab`.",
141
+ fg=typer.colors.RED,
142
+ bold=True,
143
+ )
144
+ raise typer.Exit(code=1)
145
+
146
+ install_dir: Path = (
147
+ (
148
+ Path(
149
+ os.getenv(
150
+ "FLWR_HOME",
151
+ f"{os.getenv('XDG_DATA_HOME', os.getenv('HOME'))}/.flwr",
152
+ )
153
+ )
154
+ if not flwr_dir
155
+ else flwr_dir
156
+ )
157
+ / "apps"
158
+ / publisher
159
+ / project_name
160
+ / version
161
+ )
162
+ if install_dir.exists() and not skip_prompt:
163
+ if not typer.confirm(
164
+ typer.style(
165
+ f"\n💬 {project_name} version {version} is already installed, "
166
+ "do you want to reinstall it?",
167
+ fg=typer.colors.MAGENTA,
168
+ bold=True,
169
+ )
170
+ ):
171
+ return
172
+
173
+ install_dir.mkdir(parents=True, exist_ok=True)
174
+
175
+ # Move contents from source directory
176
+ for item in project_dir.iterdir():
177
+ if item.is_dir():
178
+ shutil.copytree(item, install_dir / item.name, dirs_exist_ok=True)
179
+ else:
180
+ shutil.copy2(item, install_dir / item.name)
181
+
182
+ typer.secho(
183
+ f"🎊 Successfully installed {project_name} to {install_dir}.",
184
+ fg=typer.colors.GREEN,
185
+ bold=True,
186
+ )
187
+
188
+
189
+ def _verify_hashes(list_content: str, tmpdir: Path) -> bool:
190
+ """Verify file hashes based on the LIST content."""
191
+ for line in list_content.strip().split("\n"):
192
+ rel_path, hash_expected, _ = line.split(",")
193
+ file_path = tmpdir / rel_path
194
+ if not file_path.exists() or get_sha256_hash(file_path) != hash_expected:
195
+ return False
196
+ return True
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets>=0.0.2,<1.0.0",
16
16
  "torch==2.2.1",
17
17
  "transformers>=4.30.0,<5.0"
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = {text = "Apache License (2.0)"}
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "jax==0.4.26",
16
16
  "jaxlib==0.4.26",
17
17
  "scikit-learn==1.4.2",
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "mlx==0.10.0",
17
17
  "numpy==1.24.4",
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "numpy>=1.21.0",
16
16
  ]
17
17
 
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "torch==2.2.1",
17
17
  "torchvision==0.17.1",
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "scikit-learn>=1.1.1",
17
17
  ]
@@ -11,7 +11,7 @@ authors = [
11
11
  ]
12
12
  license = { text = "Apache License (2.0)" }
13
13
  dependencies = [
14
- "flwr[simulation]>=1.8.0,<2.0",
14
+ "flwr[simulation]>=1.9.0,<2.0",
15
15
  "flwr-datasets[vision]>=0.0.2,<1.0.0",
16
16
  "tensorflow>=2.11.1",
17
17
  ]
@@ -14,7 +14,9 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface utils."""
16
16
 
17
+ import hashlib
17
18
  import re
19
+ from pathlib import Path
18
20
  from typing import Callable, List, Optional, cast
19
21
 
20
22
  import typer
@@ -122,3 +124,15 @@ def sanitize_project_name(name: str) -> str:
122
124
  sanitized_name = sanitized_name[1:]
123
125
 
124
126
  return sanitized_name
127
+
128
+
129
+ def get_sha256_hash(file_path: Path) -> str:
130
+ """Calculate the SHA-256 hash of a file."""
131
+ sha256 = hashlib.sha256()
132
+ with open(file_path, "rb") as f:
133
+ while True:
134
+ data = f.read(65536) # Read in 64kB blocks
135
+ if not data:
136
+ break
137
+ sha256.update(data)
138
+ return sha256.hexdigest()
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "Client",
29
29
  "ClientApp",
30
30
  "ClientFn",
31
+ "mod",
31
32
  "NumPyClient",
32
33
  "run_client_app",
33
34
  "run_supernode",