flwr-nightly 1.13.0.dev20241111__py3-none-any.whl → 1.13.0.dev20241112__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

flwr/cli/build.py CHANGED
@@ -19,14 +19,18 @@ import os
19
19
  import shutil
20
20
  import tempfile
21
21
  import zipfile
22
+ from logging import DEBUG, ERROR
22
23
  from pathlib import Path
23
24
  from typing import Annotated, Any, Optional, Union
24
25
 
25
26
  import pathspec
26
27
  import tomli_w
27
28
  import typer
29
+ from hatchling.builders.wheel import WheelBuilder
30
+ from hatchling.metadata.core import ProjectMetadata
28
31
 
29
32
  from flwr.common.constant import FAB_ALLOWED_EXTENSIONS, FAB_DATE, FAB_HASH_TRUNCATION
33
+ from flwr.common.logger import log
30
34
 
31
35
  from .config_utils import load_and_validate
32
36
  from .utils import is_valid_project_name
@@ -51,6 +55,27 @@ def get_fab_filename(conf: dict[str, Any], fab_hash: str) -> str:
51
55
  return f"{publisher}.{name}.{version}.{fab_hash_truncated}.fab"
52
56
 
53
57
 
58
+ def _build_app_wheel(app: Path) -> Path:
59
+ """Build app as a wheel and return its path."""
60
+ # Path to your project directory
61
+ app_dir = str(app.resolve())
62
+ try:
63
+
64
+ # Initialize the WheelBuilder
65
+ builder = WheelBuilder(
66
+ app_dir, metadata=ProjectMetadata(root=app_dir, plugin_manager=None)
67
+ )
68
+
69
+ # Build
70
+ whl_path = Path(next(builder.build(directory=app_dir)))
71
+ log(DEBUG, "Wheel succesfully built: %s", str(whl_path))
72
+ except Exception as ex:
73
+ log(ERROR, "Exception encountered when building wheel.", exc_info=ex)
74
+ raise typer.Exit(code=1) from ex
75
+
76
+ return whl_path
77
+
78
+
54
79
  # pylint: disable=too-many-locals, too-many-statements
55
80
  def build(
56
81
  app: Annotated[
@@ -106,6 +131,12 @@ def build(
106
131
  bold=True,
107
132
  )
108
133
 
134
+ # Build wheel
135
+ whl_path = _build_app_wheel(app)
136
+
137
+ # Add path to .whl to `[tool.flwr.app]`
138
+ conf["tool"]["flwr"]["app"]["whl"] = str(whl_path.name)
139
+
109
140
  # Load .gitignore rules if present
110
141
  ignore_spec = _load_gitignore(app)
111
142
 
@@ -137,6 +168,9 @@ def build(
137
168
  and f.name != "pyproject.toml" # Exclude the original pyproject.toml
138
169
  ]
139
170
 
171
+ # Include FAB .whl
172
+ all_files.append(whl_path)
173
+
140
174
  for file_path in all_files:
141
175
  # Read the file content manually
142
176
  with open(file_path, "rb") as f:
@@ -153,6 +187,9 @@ def build(
153
187
  # Add CONTENT and CONTENT.jwt to the zip file
154
188
  write_to_zip(fab_file, ".info/CONTENT", list_file_content)
155
189
 
190
+ # Erase FAB .whl in app directory
191
+ whl_path.unlink()
192
+
156
193
  # Get hash of FAB file
157
194
  content = Path(temp_filename).read_bytes()
158
195
  fab_hash = hashlib.sha256(content).hexdigest()
flwr/cli/install.py CHANGED
@@ -188,23 +188,25 @@ def validate_and_install(
188
188
  else:
189
189
  shutil.copy2(item, install_dir / item.name)
190
190
 
191
+ whl_file = config["tool"]["flwr"]["app"]["whl"]
192
+ install_whl = install_dir / whl_file
191
193
  try:
192
194
  subprocess.run(
193
- ["pip", "install", "-e", install_dir, "--no-deps"],
195
+ ["pip", "install", "--no-deps", install_whl],
194
196
  capture_output=True,
195
197
  text=True,
196
198
  check=True,
197
199
  )
198
200
  except subprocess.CalledProcessError as e:
199
201
  typer.secho(
200
- f"❌ Failed to `pip install` package(s) from {install_dir}:\n{e.stderr}",
202
+ f"❌ Failed to install {project_name}:\n{e.stderr}",
201
203
  fg=typer.colors.RED,
202
204
  bold=True,
203
205
  )
204
206
  raise typer.Exit(code=1) from e
205
207
 
206
208
  typer.secho(
207
- f"🎊 Successfully installed {project_name} to {install_dir}.",
209
+ f"🎊 Successfully installed {project_name}.",
208
210
  fg=typer.colors.GREEN,
209
211
  bold=True,
210
212
  )
@@ -28,6 +28,7 @@ from cryptography.hazmat.primitives.serialization import (
28
28
  )
29
29
 
30
30
  from flwr.common import EventType, event
31
+ from flwr.common.args import try_obtain_root_certificates
31
32
  from flwr.common.config import parse_config_args
32
33
  from flwr.common.constant import (
33
34
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
@@ -61,7 +62,7 @@ def run_supernode() -> None:
61
62
  "Ignoring `--flwr-dir`.",
62
63
  )
63
64
 
64
- root_certificates = _get_certificates(args)
65
+ root_certificates = try_obtain_root_certificates(args, args.superlink)
65
66
  load_fn = get_load_client_app_fn(
66
67
  default_app_ref="",
67
68
  app_path=args.app,
@@ -126,41 +127,6 @@ def _warn_deprecated_server_arg(args: argparse.Namespace) -> None:
126
127
  args.superlink = args.server
127
128
 
128
129
 
129
- def _get_certificates(args: argparse.Namespace) -> Optional[bytes]:
130
- """Load certificates if specified in args."""
131
- # Obtain certificates
132
- if args.insecure:
133
- if args.root_certificates is not None:
134
- sys.exit(
135
- "Conflicting options: The '--insecure' flag disables HTTPS, "
136
- "but '--root-certificates' was also specified. Please remove "
137
- "the '--root-certificates' option when running in insecure mode, "
138
- "or omit '--insecure' to use HTTPS."
139
- )
140
- log(
141
- WARN,
142
- "Option `--insecure` was set. "
143
- "Starting insecure HTTP client connected to %s.",
144
- args.superlink,
145
- )
146
- root_certificates = None
147
- else:
148
- # Load the certificates if provided, or load the system certificates
149
- cert_path = args.root_certificates
150
- if cert_path is None:
151
- root_certificates = None
152
- else:
153
- root_certificates = Path(cert_path).read_bytes()
154
- log(
155
- DEBUG,
156
- "Starting secure HTTPS client connected to %s "
157
- "with the following certificates: %s.",
158
- args.superlink,
159
- cert_path,
160
- )
161
- return root_certificates
162
-
163
-
164
130
  def _parse_args_run_supernode() -> argparse.ArgumentParser:
165
131
  """Parse flower-supernode command line arguments."""
166
132
  parser = argparse.ArgumentParser(
flwr/common/args.py CHANGED
@@ -21,6 +21,11 @@ from os.path import isfile
21
21
  from pathlib import Path
22
22
  from typing import Optional
23
23
 
24
+ from flwr.common.constant import (
25
+ TRANSPORT_TYPE_GRPC_ADAPTER,
26
+ TRANSPORT_TYPE_GRPC_RERE,
27
+ TRANSPORT_TYPE_REST,
28
+ )
24
29
  from flwr.common.logger import log
25
30
 
26
31
 
@@ -53,12 +58,14 @@ def add_args_flwr_app_common(parser: argparse.ArgumentParser) -> None:
53
58
  )
54
59
 
55
60
 
56
- def try_obtain_certificates(
61
+ def try_obtain_root_certificates(
57
62
  args: argparse.Namespace,
63
+ grpc_server_address: str,
58
64
  ) -> Optional[bytes]:
59
65
  """Validate and return the root certificates."""
66
+ root_cert_path = args.root_certificates
60
67
  if args.insecure:
61
- if args.root_certificates is not None:
68
+ if root_cert_path is not None:
62
69
  sys.exit(
63
70
  "Conflicting options: The '--insecure' flag disables HTTPS, "
64
71
  "but '--root-certificates' was also specified. Please remove "
@@ -67,17 +74,75 @@ def try_obtain_certificates(
67
74
  )
68
75
  log(
69
76
  WARN,
70
- "Option `--insecure` was set. Starting insecure HTTP channel.",
77
+ "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
78
+ grpc_server_address,
71
79
  )
72
80
  root_certificates = None
73
81
  else:
74
82
  # Load the certificates if provided, or load the system certificates
75
- if not isfile(args.root_certificates):
83
+ if not isfile(root_cert_path):
76
84
  sys.exit("Path argument `--root-certificates` does not point to a file.")
77
- root_certificates = Path(args.root_certificates).read_bytes()
85
+ root_certificates = Path(root_cert_path).read_bytes()
78
86
  log(
79
87
  DEBUG,
80
- "Starting secure HTTPS channel with the following certificates: %s.",
81
- args.root_certificates,
88
+ "Starting secure HTTPS channel to %s "
89
+ "with the following certificates: %s.",
90
+ grpc_server_address,
91
+ root_cert_path,
82
92
  )
83
93
  return root_certificates
94
+
95
+
96
+ def try_obtain_server_certificates(
97
+ args: argparse.Namespace,
98
+ transport_type: str,
99
+ ) -> Optional[tuple[bytes, bytes, bytes]]:
100
+ """Validate and return the CA cert, server cert, and server private key."""
101
+ if args.insecure:
102
+ log(WARN, "Option `--insecure` was set. Starting insecure HTTP server.")
103
+ return None
104
+ # Check if certificates are provided
105
+ if transport_type in [TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_GRPC_ADAPTER]:
106
+ if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
107
+ if not isfile(args.ssl_ca_certfile):
108
+ sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
109
+ if not isfile(args.ssl_certfile):
110
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
111
+ if not isfile(args.ssl_keyfile):
112
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
113
+ certificates = (
114
+ Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
115
+ Path(args.ssl_certfile).read_bytes(), # server certificate
116
+ Path(args.ssl_keyfile).read_bytes(), # server private key
117
+ )
118
+ return certificates
119
+ if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
120
+ sys.exit(
121
+ "You need to provide valid file paths to `--ssl-certfile`, "
122
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` to create a secure "
123
+ "connection in Fleet API server (gRPC-rere)."
124
+ )
125
+ if transport_type == TRANSPORT_TYPE_REST:
126
+ if args.ssl_certfile and args.ssl_keyfile:
127
+ if not isfile(args.ssl_certfile):
128
+ sys.exit("Path argument `--ssl-certfile` does not point to a file.")
129
+ if not isfile(args.ssl_keyfile):
130
+ sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
131
+ certificates = (
132
+ b"",
133
+ Path(args.ssl_certfile).read_bytes(), # server certificate
134
+ Path(args.ssl_keyfile).read_bytes(), # server private key
135
+ )
136
+ return certificates
137
+ if args.ssl_certfile or args.ssl_keyfile:
138
+ sys.exit(
139
+ "You need to provide valid file paths to `--ssl-certfile` "
140
+ "and `--ssl-keyfile` to create a secure connection "
141
+ "in Fleet API server (REST, experimental)."
142
+ )
143
+ sys.exit(
144
+ "Certificates are required unless running in insecure mode. "
145
+ "Please provide certificate paths to `--ssl-certfile`, "
146
+ "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
147
+ "in insecure mode using '--insecure' if you understand the risks."
148
+ )
flwr/server/app.py CHANGED
@@ -22,7 +22,6 @@ import sys
22
22
  import threading
23
23
  from collections.abc import Sequence
24
24
  from logging import DEBUG, INFO, WARN
25
- from os.path import isfile
26
25
  from pathlib import Path
27
26
  from time import sleep
28
27
  from typing import Optional
@@ -37,6 +36,7 @@ from cryptography.hazmat.primitives.serialization import (
37
36
 
38
37
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
39
38
  from flwr.common.address import parse_address
39
+ from flwr.common.args import try_obtain_server_certificates
40
40
  from flwr.common.config import get_flwr_dir, parse_config_args
41
41
  from flwr.common.constant import (
42
42
  EXEC_API_DEFAULT_ADDRESS,
@@ -227,7 +227,7 @@ def run_superlink() -> None:
227
227
  simulationio_address, _, _ = _format_address(args.simulationio_api_address)
228
228
 
229
229
  # Obtain certificates
230
- certificates = _try_obtain_certificates(args)
230
+ certificates = try_obtain_server_certificates(args, args.fleet_api_type)
231
231
 
232
232
  # Initialize StateFactory
233
233
  state_factory = LinkStateFactory(args.database)
@@ -540,60 +540,6 @@ def _try_setup_node_authentication(
540
540
  )
541
541
 
542
542
 
543
- def _try_obtain_certificates(
544
- args: argparse.Namespace,
545
- ) -> Optional[tuple[bytes, bytes, bytes]]:
546
- # Obtain certificates
547
- if args.insecure:
548
- log(WARN, "Option `--insecure` was set. Starting insecure HTTP server.")
549
- return None
550
- # Check if certificates are provided
551
- if args.fleet_api_type in [TRANSPORT_TYPE_GRPC_RERE, TRANSPORT_TYPE_GRPC_ADAPTER]:
552
- if args.ssl_certfile and args.ssl_keyfile and args.ssl_ca_certfile:
553
- if not isfile(args.ssl_ca_certfile):
554
- sys.exit("Path argument `--ssl-ca-certfile` does not point to a file.")
555
- if not isfile(args.ssl_certfile):
556
- sys.exit("Path argument `--ssl-certfile` does not point to a file.")
557
- if not isfile(args.ssl_keyfile):
558
- sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
559
- certificates = (
560
- Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
561
- Path(args.ssl_certfile).read_bytes(), # server certificate
562
- Path(args.ssl_keyfile).read_bytes(), # server private key
563
- )
564
- return certificates
565
- if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
566
- sys.exit(
567
- "You need to provide valid file paths to `--ssl-certfile`, "
568
- "`--ssl-keyfile`, and `—-ssl-ca-certfile` to create a secure "
569
- "connection in Fleet API server (gRPC-rere)."
570
- )
571
- if args.fleet_api_type == TRANSPORT_TYPE_REST:
572
- if args.ssl_certfile and args.ssl_keyfile:
573
- if not isfile(args.ssl_certfile):
574
- sys.exit("Path argument `--ssl-certfile` does not point to a file.")
575
- if not isfile(args.ssl_keyfile):
576
- sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
577
- certificates = (
578
- b"",
579
- Path(args.ssl_certfile).read_bytes(), # server certificate
580
- Path(args.ssl_keyfile).read_bytes(), # server private key
581
- )
582
- return certificates
583
- if args.ssl_certfile or args.ssl_keyfile:
584
- sys.exit(
585
- "You need to provide valid file paths to `--ssl-certfile` "
586
- "and `--ssl-keyfile` to create a secure connection "
587
- "in Fleet API server (REST, experimental)."
588
- )
589
- sys.exit(
590
- "Certificates are required unless running in insecure mode. "
591
- "Please provide certificate paths to `--ssl-certfile`, "
592
- "`--ssl-keyfile`, and `—-ssl-ca-certfile` or run the server "
593
- "in insecure mode using '--insecure' if you understand the risks."
594
- )
595
-
596
-
597
543
  def _run_fleet_api_grpc_rere(
598
544
  address: str,
599
545
  state_factory: LinkStateFactory,
@@ -23,7 +23,7 @@ from typing import Optional
23
23
 
24
24
  from flwr.cli.config_utils import get_fab_metadata
25
25
  from flwr.cli.install import install_from_fab
26
- from flwr.common.args import add_args_flwr_app_common, try_obtain_certificates
26
+ from flwr.common.args import add_args_flwr_app_common, try_obtain_root_certificates
27
27
  from flwr.common.config import (
28
28
  get_flwr_dir,
29
29
  get_fused_config_from_dir,
@@ -80,7 +80,7 @@ def flwr_serverapp() -> None:
80
80
  args = parser.parse_args()
81
81
 
82
82
  log(INFO, "Starting Flower ServerApp")
83
- certificates = try_obtain_certificates(args)
83
+ certificates = try_obtain_root_certificates(args, args.superlink)
84
84
 
85
85
  log(
86
86
  DEBUG,
@@ -1255,10 +1255,10 @@ def dict_to_task_res(task_dict: dict[str, Any]) -> TaskRes:
1255
1255
  def determine_run_status(row: dict[str, Any]) -> str:
1256
1256
  """Determine the status of the run based on timestamp fields."""
1257
1257
  if row["pending_at"]:
1258
+ if row["finished_at"]:
1259
+ return Status.FINISHED
1258
1260
  if row["starting_at"]:
1259
1261
  if row["running_at"]:
1260
- if row["finished_at"]:
1261
- return Status.FINISHED
1262
1262
  return Status.RUNNING
1263
1263
  return Status.STARTING
1264
1264
  return Status.PENDING
@@ -34,6 +34,9 @@ VALID_RUN_STATUS_TRANSITIONS = {
34
34
  (Status.PENDING, Status.STARTING),
35
35
  (Status.STARTING, Status.RUNNING),
36
36
  (Status.RUNNING, Status.FINISHED),
37
+ # Any non-FINISHED status can transition to FINISHED
38
+ (Status.PENDING, Status.FINISHED),
39
+ (Status.STARTING, Status.FINISHED),
37
40
  }
38
41
  VALID_RUN_SUB_STATUSES = {
39
42
  SubStatus.COMPLETED,
@@ -170,6 +173,14 @@ def is_valid_transition(current_status: RunStatus, new_status: RunStatus) -> boo
170
173
  bool
171
174
  True if the transition is valid, False otherwise.
172
175
  """
176
+ # Transition to FINISHED from a non-RUNNING status is only allowed
177
+ # if the sub-status is not COMPLETED
178
+ if (
179
+ current_status.status in [Status.PENDING, Status.STARTING]
180
+ and new_status.status == Status.FINISHED
181
+ ):
182
+ return new_status.sub_status != SubStatus.COMPLETED
183
+
173
184
  return (
174
185
  current_status.status,
175
186
  new_status.status,
flwr/simulation/app.py CHANGED
@@ -16,10 +16,7 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
- from logging import DEBUG, ERROR, INFO, WARN
21
- from os.path import isfile
22
- from pathlib import Path
19
+ from logging import DEBUG, ERROR, INFO
23
20
  from queue import Queue
24
21
  from time import sleep
25
22
  from typing import Optional
@@ -27,6 +24,7 @@ from typing import Optional
27
24
  from flwr.cli.config_utils import get_fab_metadata
28
25
  from flwr.cli.install import install_from_fab
29
26
  from flwr.common import EventType
27
+ from flwr.common.args import try_obtain_root_certificates
30
28
  from flwr.common.config import (
31
29
  get_flwr_dir,
32
30
  get_fused_config_from_dir,
@@ -113,7 +111,7 @@ def flwr_simulation() -> None:
113
111
  args = parser.parse_args()
114
112
 
115
113
  log(INFO, "Starting Flower Simulation")
116
- certificates = _try_obtain_certificates(args)
114
+ certificates = try_obtain_root_certificates(args, args.superlink)
117
115
 
118
116
  log(
119
117
  DEBUG,
@@ -132,39 +130,6 @@ def flwr_simulation() -> None:
132
130
  restore_output()
133
131
 
134
132
 
135
- def _try_obtain_certificates(
136
- args: argparse.Namespace,
137
- ) -> Optional[bytes]:
138
-
139
- if args.insecure:
140
- if args.root_certificates is not None:
141
- sys.exit(
142
- "Conflicting options: The '--insecure' flag disables HTTPS, "
143
- "but '--root-certificates' was also specified. Please remove "
144
- "the '--root-certificates' option when running in insecure mode, "
145
- "or omit '--insecure' to use HTTPS."
146
- )
147
- log(
148
- WARN,
149
- "Option `--insecure` was set. Starting insecure HTTP channel to %s.",
150
- args.superlink,
151
- )
152
- root_certificates = None
153
- else:
154
- # Load the certificates if provided, or load the system certificates
155
- if not isfile(args.root_certificates):
156
- sys.exit("Path argument `--root-certificates` does not point to a file.")
157
- root_certificates = Path(args.root_certificates).read_bytes()
158
- log(
159
- DEBUG,
160
- "Starting secure HTTPS channel to %s "
161
- "with the following certificates: %s.",
162
- args.superlink,
163
- args.root_certificates,
164
- )
165
- return root_certificates
166
-
167
-
168
133
  def run_simulation_process( # pylint: disable=R0914, disable=W0212, disable=R0915
169
134
  superlink: str,
170
135
  log_queue: Queue[Optional[str]],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.13.0.dev20241111
3
+ Version: 1.13.0.dev20241112
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -34,6 +34,7 @@ Provides-Extra: rest
34
34
  Provides-Extra: simulation
35
35
  Requires-Dist: cryptography (>=42.0.4,<43.0.0)
36
36
  Requires-Dist: grpcio (>=1.60.0,<2.0.0,!=1.64.2,<=1.64.3)
37
+ Requires-Dist: hatchling (>=1.25.0,<2.0.0)
37
38
  Requires-Dist: iterators (>=0.0.2,<0.0.3)
38
39
  Requires-Dist: numpy (>=1.26.0,<3.0.0)
39
40
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
@@ -1,10 +1,10 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
3
  flwr/cli/app.py,sha256=_HDs7HS12Dp7NXIyVrkPs1SKJq3x-XvVZd6y1lvyud4,1255
4
- flwr/cli/build.py,sha256=k2M0aIY2q5WB_yXQ22Woxt1zb6m-Z1wNwmhWMxEm5Dw,6344
4
+ flwr/cli/build.py,sha256=a_43l2HL2K1z2x_IJGUw_4KrEZrJiiw_yVq_bdUyFes,7457
5
5
  flwr/cli/config_utils.py,sha256=n-xNkQG_0POz5UUHyE00lthNaOjuS6IYU9Thzb_BThs,11431
6
6
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
- flwr/cli/install.py,sha256=7Dx8zrn49mTktxGOToBhGx8hzsHOViDasMJ43ooKPXc,8646
7
+ flwr/cli/install.py,sha256=kDLZDZpIVIK9GaNdxCEHHAEAfqo5IfdG2P2SRZHjSDI,8695
8
8
  flwr/cli/log.py,sha256=WlAuxZdTUYZ5bRKkm0jLWrOxHTS0TlSA5BeDtO9xF3k,6659
9
9
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
10
10
  flwr/cli/new/new.py,sha256=uSiG7aXQzPDnikv2YcjQ86OOLqint0hNWCI0fSQD0jI,9634
@@ -101,11 +101,11 @@ flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3
101
101
  flwr/client/rest_client/connection.py,sha256=k-RqgUFqidACAGlMFPIUM8aawXI5h2LvKUri2OAK7Bg,12817
102
102
  flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
103
103
  flwr/client/supernode/__init__.py,sha256=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
104
- flwr/client/supernode/app.py,sha256=JN24tRBHLbFJ0KeCTA8eS24KUJHCl9J2xGwWjyPQ7Vg,12239
104
+ flwr/client/supernode/app.py,sha256=Frtf7UuARUN_mYHISJnThec3IxVBa5-5BoZcyjkoodg,11066
105
105
  flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
106
106
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
107
107
  flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
108
- flwr/common/args.py,sha256=SxcXl8UyYqhvz4Mv6cse3gDziznOc1BwDAvmhQY5Dx4,3105
108
+ flwr/common/args.py,sha256=y9qtPIwyijegNi0GbQT5ddRtMUITM-DlgilC1Co-nvw,6133
109
109
  flwr/common/config.py,sha256=qC1QvGAGr4faBtg3Y5dWhfyK5FggyWUMjPqg-Rx_FW4,8083
110
110
  flwr/common/constant.py,sha256=D7MNLl1u-P7tJAMdT67xIujSeCibc2QzqtFoqCagoco,4731
111
111
  flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
@@ -212,7 +212,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
212
212
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
213
213
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
214
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
215
- flwr/server/app.py,sha256=Ie-p9hNtuYUog0lfYZNLtkHDdsntnxAxQ7X3clG1how,30446
215
+ flwr/server/app.py,sha256=WywamOGVl1vPPKU8oO0CxX_rurZ5D_hh-s9FrFGfLlI,27818
216
216
  flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
217
217
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
218
218
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -231,7 +231,7 @@ flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
231
231
  flwr/server/server_app.py,sha256=RsgS6PRS5Z74cMUAHzsm8r3LWddwn00MjRs6rlacHt8,6297
232
232
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
233
233
  flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
234
- flwr/server/serverapp/app.py,sha256=2Lmd4XAfp0QPnSHv6R8Q8OMCZ0OavWK-19fHV6VCT1U,7041
234
+ flwr/server/serverapp/app.py,sha256=nry-yzJIQZBacbln2cUO-mJ0qGvGvsWsdDXapjm8zI0,7067
235
235
  flwr/server/serverapp_components.py,sha256=-IV_CitOfrJclJj2jNdbN1Q65PyFmtKtrTIg1hc6WQw,2118
236
236
  flwr/server/strategy/__init__.py,sha256=tQer2SwjDnvgFFuJMZM-S01Z615N5XK6MaCvpm4BMU0,2836
237
237
  flwr/server/strategy/aggregate.py,sha256=PDvekufza13s9AsVmz9WASunaBs3yCtl8JVliFx9j6Q,13978
@@ -289,8 +289,8 @@ flwr/server/superlink/linkstate/__init__.py,sha256=v-2JyJlCB3qyhMNwMjmcNVOq4rkoo
289
289
  flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=BvjS1Bf99MqSU4URrK5GEuCVWzeIky0XRxg6p7T0rnI,21341
290
290
  flwr/server/superlink/linkstate/linkstate.py,sha256=dE82L6FTOiUqdQY1SejQwzrA0N5AwsoWw7Fm4TXfdTs,11861
291
291
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=ISSMjDlwuN7swxjOeYlTNpI_kuZ8PGkMcJnf1dbhUSE,2069
292
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=IjnTMY_CC8bBVN_v8du5d4eKO1ycjD_z-QqweVUwxy8,44828
293
- flwr/server/superlink/linkstate/utils.py,sha256=emryyCNnsSodqhxuxJ3vBLglwHZ_eIA_rawdL7dDVCA,6204
292
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=JX0I4nu4x4dT8GSJzOF--OtMmPCujjOdQWDX7tbRKy8,44812
293
+ flwr/server/superlink/linkstate/utils.py,sha256=qaEVztjntArFz6hDJ1S_MfINS_dzrlzligIniFkAd6c,6645
294
294
  flwr/server/superlink/simulation/__init__.py,sha256=mg-oapC9dkzEfjXPQFior5lpWj4g9kwbLovptyYM_g0,718
295
295
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=5wflYW_TS0mjmPG6OYuHMJwXD2_cYmUNhFkdOU0jMWQ,2237
296
296
  flwr/server/superlink/simulation/simulationio_servicer.py,sha256=LsW6Cl8qH_vq04F6CeOp3vBtjTGQn4tATKHfirDmJZQ,5942
@@ -305,7 +305,7 @@ flwr/server/workflow/secure_aggregation/__init__.py,sha256=3XlgDOjD_hcukTGl6Bc1B
305
305
  flwr/server/workflow/secure_aggregation/secagg_workflow.py,sha256=l2IdMdJjs1bgHs5vQgLSOVzar7v2oxUn46oCrnVE1rM,5839
306
306
  flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=rfn2etO1nb7u-1oRl-H9q3enJZz3shMINZaBB7rPsC4,29671
307
307
  flwr/simulation/__init__.py,sha256=5UcDVJNjFoSwWqHbGM1hKfTTUUNdwAtuoNvNrfvdkUY,1556
308
- flwr/simulation/app.py,sha256=ZgvMToxXhcFwujfnJVzITlWxIKXdVITBSLWgPkDs8VU,10717
308
+ flwr/simulation/app.py,sha256=dVhYf6035OwQ73siV1kLymJkbiCsV9Tl0L6j9i0EDtI,9531
309
309
  flwr/simulation/legacy_app.py,sha256=9-D9wr7VmfXBjlAnzWxDe8d9z-TKT5_uVl1YoEmNZwE,15149
310
310
  flwr/simulation/ray_transport/__init__.py,sha256=wzcEEwUUlulnXsg6raCA1nGpP3LlAQDtJ8zNkCXcVbA,734
311
311
  flwr/simulation/ray_transport/ray_actor.py,sha256=9-XBguAm5IFqm2ddPFsQtnuuFN6lzqdb00SnCxGUGBo,18996
@@ -320,8 +320,8 @@ flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2
320
320
  flwr/superexec/exec_servicer.py,sha256=zNcdPkqLXgJIANKvE9uGIzgxocIs31WAj1YDnwqI6jo,3958
321
321
  flwr/superexec/executor.py,sha256=zH3_53il6Jh0ZscIVEB9f4GNnXMeBbCGyCoBCxLgiG0,3114
322
322
  flwr/superexec/simulation.py,sha256=NDFMDRidvp3Gz2MlgcWzkTrFHNAFfS94fTAdX_g7WzY,5370
323
- flwr_nightly-1.13.0.dev20241111.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
324
- flwr_nightly-1.13.0.dev20241111.dist-info/METADATA,sha256=86gCv8IxhC_Tjoumkub-b98bBkqSjuTZRl0lf2_YShs,15658
325
- flwr_nightly-1.13.0.dev20241111.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
326
- flwr_nightly-1.13.0.dev20241111.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
327
- flwr_nightly-1.13.0.dev20241111.dist-info/RECORD,,
323
+ flwr_nightly-1.13.0.dev20241112.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
324
+ flwr_nightly-1.13.0.dev20241112.dist-info/METADATA,sha256=yeDED4-E_qBqp8i2KaDoCQHr-gv2M3LAmo5oOT-MCR4,15701
325
+ flwr_nightly-1.13.0.dev20241112.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
326
+ flwr_nightly-1.13.0.dev20241112.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
327
+ flwr_nightly-1.13.0.dev20241112.dist-info/RECORD,,