flwr-nightly 1.14.0.dev20241209__tar.gz → 1.14.0.dev20241211__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 (327) hide show
  1. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/PKG-INFO +8 -7
  2. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/README.md +5 -5
  3. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/pyproject.toml +5 -3
  4. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/app.py +2 -0
  5. flwr_nightly-1.14.0.dev20241211/src/py/flwr/cli/cli_user_auth_interceptor.py +86 -0
  6. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/config_utils.py +18 -2
  7. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/log.py +10 -31
  8. flwr_nightly-1.14.0.dev20241211/src/py/flwr/cli/login/__init__.py +21 -0
  9. flwr_nightly-1.14.0.dev20241211/src/py/flwr/cli/login/login.py +82 -0
  10. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/ls.py +10 -40
  11. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/run/run.py +14 -25
  12. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/stop.py +9 -39
  13. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/utils.py +108 -1
  14. flwr_nightly-1.14.0.dev20241211/src/py/flwr/common/auth_plugin/__init__.py +24 -0
  15. flwr_nightly-1.14.0.dev20241211/src/py/flwr/common/auth_plugin/auth_plugin.py +111 -0
  16. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/config.py +2 -1
  17. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/constant.py +6 -1
  18. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +2 -2
  19. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/telemetry.py +2 -1
  20. flwr_nightly-1.14.0.dev20241211/src/py/flwr/proto/serverappio_pb2.py +52 -0
  21. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/serverappio_pb2.pyi +8 -2
  22. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/serverappio_pb2_grpc.py +34 -0
  23. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +13 -0
  24. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/app.py +52 -1
  25. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/driver/grpc_driver.py +6 -2
  26. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +18 -0
  27. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/exec_grpc.py +18 -1
  28. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/exec_servicer.py +22 -3
  29. flwr_nightly-1.14.0.dev20241211/src/py/flwr/superexec/exec_user_auth_interceptor.py +101 -0
  30. flwr_nightly-1.14.0.dev20241209/src/py/flwr/proto/serverappio_pb2.py +0 -52
  31. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/LICENSE +0 -0
  32. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/__init__.py +0 -0
  33. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/__init__.py +0 -0
  34. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/build.py +0 -0
  35. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/example.py +0 -0
  36. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/install.py +0 -0
  37. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/__init__.py +0 -0
  38. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/new.py +0 -0
  39. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  40. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  41. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  42. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  43. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  44. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  45. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  46. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  47. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  48. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  49. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  51. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  52. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  53. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  54. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  55. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  56. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  57. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  59. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  60. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  61. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  62. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  63. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  64. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  67. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  68. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  75. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  76. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  77. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  78. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  79. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  80. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  81. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  82. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  83. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  84. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  85. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  86. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  87. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  88. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  89. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  90. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  91. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/cli/run/__init__.py +0 -0
  92. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/__init__.py +0 -0
  93. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/app.py +0 -0
  94. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/client.py +0 -0
  95. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/client_app.py +0 -0
  96. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/clientapp/__init__.py +0 -0
  97. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/clientapp/app.py +0 -0
  98. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  99. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/clientapp/utils.py +0 -0
  100. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  101. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  102. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  103. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  104. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_client/connection.py +0 -0
  105. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  106. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  107. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  108. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  109. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/heartbeat.py +0 -0
  110. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/message_handler/__init__.py +0 -0
  111. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  112. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  113. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/__init__.py +0 -0
  114. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  115. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/comms_mods.py +0 -0
  116. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  117. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  118. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  119. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  120. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/mod/utils.py +0 -0
  121. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/nodestate/__init__.py +0 -0
  122. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  123. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  124. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  125. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/numpy_client.py +0 -0
  126. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/rest_client/__init__.py +0 -0
  127. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/rest_client/connection.py +0 -0
  128. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/run_info_store.py +0 -0
  129. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/supernode/__init__.py +0 -0
  130. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/supernode/app.py +0 -0
  131. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/client/typing.py +0 -0
  132. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/__init__.py +0 -0
  133. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/address.py +0 -0
  134. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/args.py +0 -0
  135. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/context.py +0 -0
  136. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/date.py +0 -0
  137. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/differential_privacy.py +0 -0
  138. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  139. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/dp.py +0 -0
  140. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/exit_handlers.py +0 -0
  141. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/grpc.py +0 -0
  142. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/logger.py +0 -0
  143. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/message.py +0 -0
  144. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/object_ref.py +0 -0
  145. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/parameter.py +0 -0
  146. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/pyproject.py +0 -0
  147. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/__init__.py +0 -0
  148. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/configsrecord.py +0 -0
  149. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/conversion_utils.py +0 -0
  150. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/metricsrecord.py +0 -0
  151. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/parametersrecord.py +0 -0
  152. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/recordset.py +0 -0
  153. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/record/typeddict.py +0 -0
  154. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/recordset_compat.py +0 -0
  155. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/retry_invoker.py +0 -0
  156. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  157. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  158. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  159. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  160. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  161. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  162. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  163. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/serde.py +0 -0
  164. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/__init__.py +0 -0
  167. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  168. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  169. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/error_pb2.py +0 -0
  172. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/error_pb2.pyi +0 -0
  173. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/exec_pb2.py +0 -0
  176. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  177. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fab_pb2.py +0 -0
  180. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  181. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fleet_pb2.py +0 -0
  184. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  185. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  188. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  189. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/log_pb2.py +0 -0
  192. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/log_pb2.pyi +0 -0
  193. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/message_pb2.py +0 -0
  196. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/message_pb2.pyi +0 -0
  197. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/node_pb2.py +0 -0
  200. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/node_pb2.pyi +0 -0
  201. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/recordset_pb2.py +0 -0
  204. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  205. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/run_pb2.py +0 -0
  208. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/run_pb2.pyi +0 -0
  209. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  212. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  213. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/task_pb2.py +0 -0
  216. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/task_pb2.pyi +0 -0
  217. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/transport_pb2.py +0 -0
  220. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  221. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/py.typed +0 -0
  224. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/__init__.py +0 -0
  225. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/client_manager.py +0 -0
  226. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/client_proxy.py +0 -0
  227. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/compat/__init__.py +0 -0
  228. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/compat/app.py +0 -0
  229. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/compat/app_utils.py +0 -0
  230. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  231. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/compat/legacy_context.py +0 -0
  232. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/criterion.py +0 -0
  233. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/driver/__init__.py +0 -0
  234. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/driver/driver.py +0 -0
  235. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  236. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/history.py +0 -0
  237. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/run_serverapp.py +0 -0
  238. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/server.py +0 -0
  239. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/server_app.py +0 -0
  240. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/server_config.py +0 -0
  241. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/serverapp/__init__.py +0 -0
  242. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/serverapp/app.py +0 -0
  243. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/serverapp_components.py +0 -0
  244. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/__init__.py +0 -0
  245. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/aggregate.py +0 -0
  246. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/bulyan.py +0 -0
  247. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  248. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  249. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  250. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  251. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  252. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  253. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedadam.py +0 -0
  254. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedavg.py +0 -0
  255. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  256. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  257. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  258. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedopt.py +0 -0
  259. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedprox.py +0 -0
  260. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  261. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  262. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  263. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  264. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  265. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/krum.py +0 -0
  266. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  267. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/strategy/strategy.py +0 -0
  268. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/__init__.py +0 -0
  269. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  270. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  271. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  283. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  284. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  285. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  286. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  290. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  297. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  298. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  300. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  301. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  302. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  303. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  304. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/typing.py +0 -0
  305. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/utils/__init__.py +0 -0
  306. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/utils/tensorboard.py +0 -0
  307. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/utils/validator.py +0 -0
  308. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/__init__.py +0 -0
  309. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/constant.py +0 -0
  310. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  311. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  312. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  313. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  314. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/app.py +0 -0
  316. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/legacy_app.py +0 -0
  317. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  318. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  319. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  320. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  321. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/run_simulation.py +0 -0
  322. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  323. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/__init__.py +0 -0
  324. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/app.py +0 -0
  325. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/deployment.py +0 -0
  326. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/executor.py +0 -0
  327. {flwr_nightly-1.14.0.dev20241209 → flwr_nightly-1.14.0.dev20241211}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.14.0.dev20241209
3
+ Version: 1.14.0.dev20241211
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -39,8 +39,9 @@ Requires-Dist: numpy (>=1.26.0,<3.0.0)
39
39
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
40
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
+ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
42
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
43
- Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
44
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
44
45
  Requires-Dist: rich (>=13.5.0,<14.0.0)
45
46
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
@@ -101,23 +102,23 @@ Flower's goal is to make federated learning accessible to everyone. This series
101
102
 
102
103
  0. **What is Federated Learning?**
103
104
 
104
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb))
105
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb))
105
106
 
106
107
  1. **An Introduction to Federated Learning**
107
108
 
108
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
109
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
109
110
 
110
111
  2. **Using Strategies in Federated Learning**
111
112
 
112
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
113
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
113
114
 
114
115
  3. **Building Strategies for Federated Learning**
115
116
 
116
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
117
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
117
118
 
118
119
  4. **Custom Clients for Federated Learning**
119
120
 
120
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb))
121
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
121
122
 
122
123
  Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
123
124
 
@@ -48,23 +48,23 @@ Flower's goal is to make federated learning accessible to everyone. This series
48
48
 
49
49
  0. **What is Federated Learning?**
50
50
 
51
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb))
51
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb))
52
52
 
53
53
  1. **An Introduction to Federated Learning**
54
54
 
55
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
55
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
56
56
 
57
57
  2. **Using Strategies in Federated Learning**
58
58
 
59
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
59
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
60
60
 
61
61
  3. **Building Strategies for Federated Learning**
62
62
 
63
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
63
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
64
64
 
65
65
  4. **Custom Clients for Federated Learning**
66
66
 
67
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb))
67
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
68
68
 
69
69
  Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
70
70
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.14.0.dev20241209"
7
+ version = "1.14.0.dev20241211"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -78,16 +78,17 @@ tomli = "^2.0.1"
78
78
  tomli-w = "^1.0.0"
79
79
  pathspec = "^0.12.1"
80
80
  rich = "^13.5.0"
81
+ pyyaml = "^6.0.2"
82
+ requests = "^2.31.0"
81
83
  # Optional dependencies (Simulation Engine)
82
84
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
83
85
  # Optional dependencies (REST transport layer)
84
- requests = { version = "^2.31.0", optional = true }
85
86
  starlette = { version = "^0.31.0", optional = true }
86
87
  uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
87
88
 
88
89
  [tool.poetry.extras]
89
90
  simulation = ["ray"]
90
- rest = ["requests", "starlette", "uvicorn"]
91
+ rest = ["starlette", "uvicorn"]
91
92
 
92
93
  [tool.poetry.group.dev.dependencies]
93
94
  types-dataclasses = "==0.6.6"
@@ -131,6 +132,7 @@ mdformat-gfm = "==0.3.6"
131
132
  mdformat-frontmatter = "==2.0.1"
132
133
  mdformat-beautysh = "==0.1.1"
133
134
  twine = "==5.1.1"
135
+ types-PyYAML = "^6.0.2"
134
136
  pyroma = "==4.2"
135
137
  check-wheel-contents = "==0.4.0"
136
138
  GitPython = "==3.1.32"
@@ -20,6 +20,7 @@ from typer.main import get_command
20
20
  from .build import build
21
21
  from .install import install
22
22
  from .log import log
23
+ from .login import login
23
24
  from .ls import ls
24
25
  from .new import new
25
26
  from .run import run
@@ -41,6 +42,7 @@ app.command()(install)
41
42
  app.command()(log)
42
43
  app.command()(ls)
43
44
  app.command()(stop)
45
+ app.command()(login)
44
46
 
45
47
  typer_click_object = get_command(app)
46
48
 
@@ -0,0 +1,86 @@
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 run interceptor."""
16
+
17
+
18
+ from typing import Any, Callable, Union
19
+
20
+ import grpc
21
+
22
+ from flwr.common.auth_plugin import CliAuthPlugin
23
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
24
+ StartRunRequest,
25
+ StreamLogsRequest,
26
+ )
27
+
28
+ Request = Union[
29
+ StartRunRequest,
30
+ StreamLogsRequest,
31
+ ]
32
+
33
+
34
+ class CliUserAuthInterceptor(
35
+ grpc.UnaryUnaryClientInterceptor, grpc.UnaryStreamClientInterceptor # type: ignore
36
+ ):
37
+ """CLI interceptor for user authentication."""
38
+
39
+ def __init__(self, auth_plugin: CliAuthPlugin):
40
+ self.auth_plugin = auth_plugin
41
+
42
+ def _authenticated_call(
43
+ self,
44
+ continuation: Callable[[Any, Any], Any],
45
+ client_call_details: grpc.ClientCallDetails,
46
+ request: Request,
47
+ ) -> grpc.Call:
48
+ """Send and receive tokens via metadata."""
49
+ new_metadata = self.auth_plugin.write_tokens_to_metadata(
50
+ client_call_details.metadata or []
51
+ )
52
+
53
+ details = client_call_details._replace(metadata=new_metadata)
54
+
55
+ response = continuation(details, request)
56
+ if response.initial_metadata():
57
+ retrieved_metadata = dict(response.initial_metadata())
58
+ self.auth_plugin.store_tokens(retrieved_metadata)
59
+
60
+ return response
61
+
62
+ def intercept_unary_unary(
63
+ self,
64
+ continuation: Callable[[Any, Any], Any],
65
+ client_call_details: grpc.ClientCallDetails,
66
+ request: Request,
67
+ ) -> grpc.Call:
68
+ """Intercept a unary-unary call for user authentication.
69
+
70
+ This method intercepts a unary-unary RPC call initiated from the CLI and adds
71
+ the required authentication tokens to the RPC metadata.
72
+ """
73
+ return self._authenticated_call(continuation, client_call_details, request)
74
+
75
+ def intercept_unary_stream(
76
+ self,
77
+ continuation: Callable[[Any, Any], Any],
78
+ client_call_details: grpc.ClientCallDetails,
79
+ request: Request,
80
+ ) -> grpc.Call:
81
+ """Intercept a unary-stream call for user authentication.
82
+
83
+ This method intercepts a unary-stream RPC call initiated from the CLI and adds
84
+ the required authentication tokens to the RPC metadata.
85
+ """
86
+ return self._authenticated_call(continuation, client_call_details, request)
@@ -230,10 +230,14 @@ def load_from_string(toml_content: str) -> Optional[dict[str, Any]]:
230
230
  return None
231
231
 
232
232
 
233
- def validate_project_config(
233
+ def process_loaded_project_config(
234
234
  config: Union[dict[str, Any], None], errors: list[str], warnings: list[str]
235
235
  ) -> dict[str, Any]:
236
- """Validate and return the Flower project configuration."""
236
+ """Process and return the loaded project configuration.
237
+
238
+ This function handles errors and warnings from the `load_and_validate` function,
239
+ exits on critical issues, and returns the validated configuration.
240
+ """
237
241
  if config is None:
238
242
  typer.secho(
239
243
  "Project configuration could not be loaded.\n"
@@ -324,3 +328,15 @@ def validate_certificate_in_federation_config(
324
328
  raise typer.Exit(code=1)
325
329
 
326
330
  return insecure, root_certificates_bytes
331
+
332
+
333
+ def exit_if_no_address(federation_config: dict[str, Any], cmd: str) -> None:
334
+ """Exit if the provided federation_config has no "address" key."""
335
+ if "address" not in federation_config:
336
+ typer.secho(
337
+ f"❌ `flwr {cmd}` currently works with a SuperLink. Ensure that the correct"
338
+ "SuperLink (Exec API) address is provided in `pyproject.toml`.",
339
+ fg=typer.colors.RED,
340
+ bold=True,
341
+ )
342
+ raise typer.Exit(code=1)
@@ -23,17 +23,18 @@ import grpc
23
23
  import typer
24
24
 
25
25
  from flwr.cli.config_utils import (
26
+ exit_if_no_address,
26
27
  load_and_validate,
27
- validate_certificate_in_federation_config,
28
+ process_loaded_project_config,
28
29
  validate_federation_in_project_config,
29
- validate_project_config,
30
30
  )
31
31
  from flwr.common.constant import CONN_RECONNECT_INTERVAL, CONN_REFRESH_PERIOD
32
- from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
33
32
  from flwr.common.logger import log as logger
34
33
  from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
35
34
  from flwr.proto.exec_pb2_grpc import ExecStub
36
35
 
36
+ from .utils import init_channel, try_obtain_cli_auth_plugin
37
+
37
38
 
38
39
  def start_stream(
39
40
  run_id: int, channel: grpc.Channel, refresh_period: int = CONN_REFRESH_PERIOD
@@ -126,11 +127,6 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
126
127
  logger(DEBUG, "Channel closed")
127
128
 
128
129
 
129
- def on_channel_state_change(channel_connectivity: str) -> None:
130
- """Log channel connectivity."""
131
- logger(DEBUG, channel_connectivity)
132
-
133
-
134
130
  def log(
135
131
  run_id: Annotated[
136
132
  int,
@@ -157,41 +153,24 @@ def log(
157
153
 
158
154
  pyproject_path = app / "pyproject.toml" if app else None
159
155
  config, errors, warnings = load_and_validate(path=pyproject_path)
160
- config = validate_project_config(config, errors, warnings)
156
+ config = process_loaded_project_config(config, errors, warnings)
161
157
  federation, federation_config = validate_federation_in_project_config(
162
158
  federation, config
163
159
  )
160
+ exit_if_no_address(federation_config, "log")
164
161
 
165
- if "address" not in federation_config:
166
- typer.secho(
167
- "❌ `flwr log` currently works with Exec API. Ensure that the correct"
168
- "Exec API address is provided in the `pyproject.toml`.",
169
- fg=typer.colors.RED,
170
- bold=True,
171
- )
172
- raise typer.Exit(code=1)
173
-
174
- _log_with_exec_api(app, federation_config, run_id, stream)
162
+ _log_with_exec_api(app, federation, federation_config, run_id, stream)
175
163
 
176
164
 
177
165
  def _log_with_exec_api(
178
166
  app: Path,
167
+ federation: str,
179
168
  federation_config: dict[str, Any],
180
169
  run_id: int,
181
170
  stream: bool,
182
171
  ) -> None:
183
-
184
- insecure, root_certificates_bytes = validate_certificate_in_federation_config(
185
- app, federation_config
186
- )
187
- channel = create_channel(
188
- server_address=federation_config["address"],
189
- insecure=insecure,
190
- root_certificates=root_certificates_bytes,
191
- max_message_length=GRPC_MAX_MESSAGE_LENGTH,
192
- interceptors=None,
193
- )
194
- channel.subscribe(on_channel_state_change)
172
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
173
+ channel = init_channel(app, federation_config, auth_plugin)
195
174
 
196
175
  if stream:
197
176
  start_stream(run_id, channel, CONN_REFRESH_PERIOD)
@@ -0,0 +1,21 @@
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 `login` command."""
16
+
17
+ from .login import login as login
18
+
19
+ __all__ = [
20
+ "login",
21
+ ]
@@ -0,0 +1,82 @@
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 `login` command."""
16
+
17
+ from pathlib import Path
18
+ from typing import Annotated, Optional
19
+
20
+ import typer
21
+
22
+ from flwr.cli.config_utils import (
23
+ exit_if_no_address,
24
+ load_and_validate,
25
+ process_loaded_project_config,
26
+ validate_federation_in_project_config,
27
+ )
28
+ from flwr.common.constant import AUTH_TYPE
29
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
30
+ GetLoginDetailsRequest,
31
+ GetLoginDetailsResponse,
32
+ )
33
+ from flwr.proto.exec_pb2_grpc import ExecStub
34
+
35
+ from ..utils import init_channel, try_obtain_cli_auth_plugin
36
+
37
+
38
+ def login( # pylint: disable=R0914
39
+ app: Annotated[
40
+ Path,
41
+ typer.Argument(help="Path of the Flower App to run."),
42
+ ] = Path("."),
43
+ federation: Annotated[
44
+ Optional[str],
45
+ typer.Argument(help="Name of the federation to login into."),
46
+ ] = None,
47
+ ) -> None:
48
+ """Login to Flower SuperLink."""
49
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
50
+
51
+ pyproject_path = app / "pyproject.toml" if app else None
52
+ config, errors, warnings = load_and_validate(path=pyproject_path)
53
+
54
+ config = process_loaded_project_config(config, errors, warnings)
55
+ federation, federation_config = validate_federation_in_project_config(
56
+ federation, config
57
+ )
58
+ exit_if_no_address(federation_config, "login")
59
+ channel = init_channel(app, federation_config, None)
60
+ stub = ExecStub(channel)
61
+
62
+ login_request = GetLoginDetailsRequest()
63
+ login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
64
+
65
+ # Get the auth plugin
66
+ auth_type = login_response.login_details.get(AUTH_TYPE)
67
+ auth_plugin = try_obtain_cli_auth_plugin(
68
+ app, federation, federation_config, auth_type
69
+ )
70
+ if auth_plugin is None:
71
+ typer.secho(
72
+ f'❌ Authentication type "{auth_type}" not found',
73
+ fg=typer.colors.RED,
74
+ bold=True,
75
+ )
76
+ raise typer.Exit(code=1)
77
+
78
+ # Login
79
+ auth_config = auth_plugin.login(dict(login_response.login_details), stub)
80
+
81
+ # Store the tokens
82
+ auth_plugin.store_tokens(auth_config)
@@ -18,11 +18,9 @@
18
18
  import io
19
19
  import json
20
20
  from datetime import datetime, timedelta
21
- from logging import DEBUG
22
21
  from pathlib import Path
23
- from typing import Annotated, Any, Optional, Union
22
+ from typing import Annotated, Optional, Union
24
23
 
25
- import grpc
26
24
  import typer
27
25
  from rich.console import Console
28
26
  from rich.table import Table
@@ -30,15 +28,14 @@ from rich.text import Text
30
28
  from typer import Exit
31
29
 
32
30
  from flwr.cli.config_utils import (
31
+ exit_if_no_address,
33
32
  load_and_validate,
34
- validate_certificate_in_federation_config,
33
+ process_loaded_project_config,
35
34
  validate_federation_in_project_config,
36
- validate_project_config,
37
35
  )
38
36
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
39
37
  from flwr.common.date import format_timedelta, isoformat8601_utc
40
- from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
41
- from flwr.common.logger import log, redirect_output, remove_emojis, restore_output
38
+ from flwr.common.logger import redirect_output, remove_emojis, restore_output
42
39
  from flwr.common.serde import run_from_proto
43
40
  from flwr.common.typing import Run
44
41
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
@@ -47,6 +44,8 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
47
44
  )
48
45
  from flwr.proto.exec_pb2_grpc import ExecStub
49
46
 
47
+ from .utils import init_channel, try_obtain_cli_auth_plugin
48
+
50
49
  _RunListType = tuple[int, str, str, str, str, str, str, str, str]
51
50
 
52
51
 
@@ -94,27 +93,19 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
94
93
 
95
94
  pyproject_path = app / FAB_CONFIG_FILE if app else None
96
95
  config, errors, warnings = load_and_validate(path=pyproject_path)
97
- config = validate_project_config(config, errors, warnings)
96
+ config = process_loaded_project_config(config, errors, warnings)
98
97
  federation, federation_config = validate_federation_in_project_config(
99
98
  federation, config
100
99
  )
101
-
102
- if "address" not in federation_config:
103
- typer.secho(
104
- "❌ `flwr ls` currently works with Exec API. Ensure that the correct"
105
- "Exec API address is provided in the `pyproject.toml`.",
106
- fg=typer.colors.RED,
107
- bold=True,
108
- )
109
- raise typer.Exit(code=1)
100
+ exit_if_no_address(federation_config, "ls")
110
101
 
111
102
  try:
112
103
  if runs and run_id is not None:
113
104
  raise ValueError(
114
105
  "The options '--runs' and '--run-id' are mutually exclusive."
115
106
  )
116
-
117
- channel = _init_channel(app, federation_config)
107
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
108
+ channel = init_channel(app, federation_config, auth_plugin)
118
109
  stub = ExecStub(channel)
119
110
 
120
111
  # Display information about a specific run ID
@@ -154,27 +145,6 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
154
145
  captured_output.close()
155
146
 
156
147
 
157
- def on_channel_state_change(channel_connectivity: str) -> None:
158
- """Log channel connectivity."""
159
- log(DEBUG, channel_connectivity)
160
-
161
-
162
- def _init_channel(app: Path, federation_config: dict[str, Any]) -> grpc.Channel:
163
- """Initialize gRPC channel to the Exec API."""
164
- insecure, root_certificates_bytes = validate_certificate_in_federation_config(
165
- app, federation_config
166
- )
167
- channel = create_channel(
168
- server_address=federation_config["address"],
169
- insecure=insecure,
170
- root_certificates=root_certificates_bytes,
171
- max_message_length=GRPC_MAX_MESSAGE_LENGTH,
172
- interceptors=None,
173
- )
174
- channel.subscribe(on_channel_state_change)
175
- return channel
176
-
177
-
178
148
  def _format_runs(run_dict: dict[int, Run], now_isoformat: str) -> list[_RunListType]:
179
149
  """Format runs to a list."""
180
150
 
@@ -17,7 +17,6 @@
17
17
  import io
18
18
  import json
19
19
  import subprocess
20
- from logging import DEBUG
21
20
  from pathlib import Path
22
21
  from typing import Annotated, Any, Optional, Union
23
22
 
@@ -28,9 +27,8 @@ from flwr.cli.build import build
28
27
  from flwr.cli.config_utils import (
29
28
  get_fab_metadata,
30
29
  load_and_validate,
31
- validate_certificate_in_federation_config,
30
+ process_loaded_project_config,
32
31
  validate_federation_in_project_config,
33
- validate_project_config,
34
32
  )
35
33
  from flwr.common.config import (
36
34
  flatten_dict,
@@ -38,8 +36,7 @@ from flwr.common.config import (
38
36
  user_config_to_configsrecord,
39
37
  )
40
38
  from flwr.common.constant import CliOutputFormat
41
- from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
42
- from flwr.common.logger import log, redirect_output, remove_emojis, restore_output
39
+ from flwr.common.logger import redirect_output, remove_emojis, restore_output
43
40
  from flwr.common.serde import (
44
41
  configs_record_to_proto,
45
42
  fab_to_proto,
@@ -50,15 +47,11 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
50
47
  from flwr.proto.exec_pb2_grpc import ExecStub
51
48
 
52
49
  from ..log import start_stream
50
+ from ..utils import init_channel, try_obtain_cli_auth_plugin
53
51
 
54
52
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
55
53
 
56
54
 
57
- def on_channel_state_change(channel_connectivity: str) -> None:
58
- """Log channel connectivity."""
59
- log(DEBUG, channel_connectivity)
60
-
61
-
62
55
  # pylint: disable-next=too-many-locals
63
56
  def run(
64
57
  app: Annotated[
@@ -108,14 +101,19 @@ def run(
108
101
 
109
102
  pyproject_path = app / "pyproject.toml" if app else None
110
103
  config, errors, warnings = load_and_validate(path=pyproject_path)
111
- config = validate_project_config(config, errors, warnings)
104
+ config = process_loaded_project_config(config, errors, warnings)
112
105
  federation, federation_config = validate_federation_in_project_config(
113
106
  federation, config
114
107
  )
115
108
 
116
109
  if "address" in federation_config:
117
110
  _run_with_exec_api(
118
- app, federation_config, config_overrides, stream, output_format
111
+ app,
112
+ federation,
113
+ federation_config,
114
+ config_overrides,
115
+ stream,
116
+ output_format,
119
117
  )
120
118
  else:
121
119
  _run_without_exec_api(app, federation_config, config_overrides, federation)
@@ -136,26 +134,17 @@ def run(
136
134
  captured_output.close()
137
135
 
138
136
 
139
- # pylint: disable-next=too-many-locals
137
+ # pylint: disable-next=R0913, R0914, R0917
140
138
  def _run_with_exec_api(
141
139
  app: Path,
140
+ federation: str,
142
141
  federation_config: dict[str, Any],
143
142
  config_overrides: Optional[list[str]],
144
143
  stream: bool,
145
144
  output_format: str,
146
145
  ) -> None:
147
-
148
- insecure, root_certificates_bytes = validate_certificate_in_federation_config(
149
- app, federation_config
150
- )
151
- channel = create_channel(
152
- server_address=federation_config["address"],
153
- insecure=insecure,
154
- root_certificates=root_certificates_bytes,
155
- max_message_length=GRPC_MAX_MESSAGE_LENGTH,
156
- interceptors=None,
157
- )
158
- channel.subscribe(on_channel_state_change)
146
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
147
+ channel = init_channel(app, federation_config, auth_plugin)
159
148
  stub = ExecStub(channel)
160
149
 
161
150
  fab_path, fab_hash = build(app)