huggingface-hub 1.0.0rc0__py3-none-any.whl → 1.0.0rc1__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 huggingface-hub might be problematic. Click here for more details.

@@ -21,227 +21,171 @@ Usage:
21
21
  hf repo create my-cool-model --private
22
22
  """
23
23
 
24
- import argparse
25
- from argparse import _SubParsersAction
26
- from typing import Optional
24
+ from typing import Annotated, Optional
25
+
26
+ import typer
27
27
 
28
- from huggingface_hub.commands import BaseHuggingfaceCLICommand
29
- from huggingface_hub.commands._cli_utils import ANSI
30
- from huggingface_hub.constants import REPO_TYPES, SPACES_SDK_TYPES
31
28
  from huggingface_hub.errors import HfHubHTTPError, RepositoryNotFoundError, RevisionNotFoundError
32
- from huggingface_hub.hf_api import HfApi
33
29
  from huggingface_hub.utils import logging
34
30
 
31
+ from ._cli_utils import (
32
+ ANSI,
33
+ PrivateOpt,
34
+ RepoIdArg,
35
+ RepoType,
36
+ RepoTypeOpt,
37
+ RevisionOpt,
38
+ TokenOpt,
39
+ get_hf_api,
40
+ typer_factory,
41
+ )
35
42
 
36
- logger = logging.get_logger(__name__)
37
43
 
44
+ logger = logging.get_logger(__name__)
38
45
 
39
- class RepoCommands(BaseHuggingfaceCLICommand):
40
- @staticmethod
41
- def register_subcommand(parser: _SubParsersAction):
42
- repo_parser = parser.add_parser("repo", help="Manage repos on the Hub.")
43
- repo_subparsers = repo_parser.add_subparsers(help="huggingface.co repos related commands")
44
-
45
- # Show help if no subcommand is provided
46
- repo_parser.set_defaults(func=lambda args: repo_parser.print_help())
47
-
48
- # CREATE
49
- repo_create_parser = repo_subparsers.add_parser("create", help="Create a new repo on huggingface.co")
50
- repo_create_parser.add_argument(
51
- "repo_id",
52
- type=str,
53
- help="The ID of the repo to create to (e.g. `username/repo-name`). The username is optional and will be set to your username if not provided.",
54
- )
55
- repo_create_parser.add_argument(
56
- "--repo-type",
57
- type=str,
58
- help='Optional: set to "dataset" or "space" if creating a dataset or space, default is model.',
59
- )
60
- repo_create_parser.add_argument(
61
- "--space_sdk",
62
- type=str,
63
- help='Optional: Hugging Face Spaces SDK type. Required when --type is set to "space".',
64
- choices=SPACES_SDK_TYPES,
65
- )
66
- repo_create_parser.add_argument(
67
- "--private",
68
- action="store_true",
69
- help="Whether to create a private repository. Defaults to public unless the organization's default is private.",
70
- )
71
- repo_create_parser.add_argument(
72
- "--token",
73
- type=str,
74
- help="Hugging Face token. Will default to the locally saved token if not provided.",
75
- )
76
- repo_create_parser.add_argument(
77
- "--exist-ok",
78
- action="store_true",
46
+ repo_cli = typer_factory(help="Manage repos on the Hub.")
47
+ tag_app = typer_factory(help="Manage tags for a repo on the Hub.")
48
+ repo_cli.add_typer(tag_app, name="tag")
49
+
50
+
51
+ @repo_cli.command("create", help="Create a new repo on the Hub.")
52
+ def repo_create(
53
+ repo_id: RepoIdArg,
54
+ repo_type: RepoTypeOpt = RepoType.model,
55
+ space_sdk: Annotated[
56
+ Optional[str],
57
+ typer.Option(
58
+ help="Hugging Face Spaces SDK type. Required when --type is set to 'space'.",
59
+ ),
60
+ ] = None,
61
+ private: PrivateOpt = False,
62
+ token: TokenOpt = None,
63
+ exist_ok: Annotated[
64
+ bool,
65
+ typer.Option(
79
66
  help="Do not raise an error if repo already exists.",
80
- )
81
- repo_create_parser.add_argument(
82
- "--resource-group-id",
83
- type=str,
67
+ ),
68
+ ] = False,
69
+ resource_group_id: Annotated[
70
+ Optional[str],
71
+ typer.Option(
84
72
  help="Resource group in which to create the repo. Resource groups is only available for Enterprise Hub organizations.",
85
- )
86
- repo_create_parser.set_defaults(func=lambda args: RepoCreateCommand(args))
87
-
88
- # TAG SUBCOMMANDS
89
- repo_tag_parser = repo_subparsers.add_parser("tag", help="Manage tags for a repo on the Hub.")
90
- tag_subparsers = repo_tag_parser.add_subparsers(help="Tag actions", dest="tag_action", required=True)
91
-
92
- # tag create
93
- tag_create_parser = tag_subparsers.add_parser("create", help="Create a tag for a repo.")
94
- tag_create_parser.add_argument(
95
- "repo_id", type=str, help="The ID of the repo to tag (e.g. `username/repo-name`)."
96
- )
97
- tag_create_parser.add_argument("tag", type=str, help="The name of the tag to create.")
98
- tag_create_parser.add_argument("-m", "--message", type=str, help="The description of the tag to create.")
99
- tag_create_parser.add_argument("--revision", type=str, help="The git revision to tag.")
100
- tag_create_parser.add_argument(
101
- "--token", type=str, help="A User Access Token generated from https://huggingface.co/settings/tokens."
102
- )
103
- tag_create_parser.add_argument(
104
- "--repo-type",
105
- choices=["model", "dataset", "space"],
106
- default="model",
107
- help="Set the type of repository (model, dataset, or space).",
108
- )
109
- tag_create_parser.set_defaults(func=lambda args: RepoTagCreateCommand(args))
110
-
111
- # tag list
112
- tag_list_parser = tag_subparsers.add_parser("list", help="List tags for a repo.")
113
- tag_list_parser.add_argument(
114
- "repo_id", type=str, help="The ID of the repo to list tags for (e.g. `username/repo-name`)."
115
- )
116
- tag_list_parser.add_argument(
117
- "--token", type=str, help="A User Access Token generated from https://huggingface.co/settings/tokens."
118
- )
119
- tag_list_parser.add_argument(
120
- "--repo-type",
121
- choices=["model", "dataset", "space"],
122
- default="model",
123
- help="Set the type of repository (model, dataset, or space).",
124
- )
125
- tag_list_parser.set_defaults(func=lambda args: RepoTagListCommand(args))
126
-
127
- # tag delete
128
- tag_delete_parser = tag_subparsers.add_parser("delete", help="Delete a tag from a repo.")
129
- tag_delete_parser.add_argument(
130
- "repo_id", type=str, help="The ID of the repo to delete the tag from (e.g. `username/repo-name`)."
131
- )
132
- tag_delete_parser.add_argument("tag", type=str, help="The name of the tag to delete.")
133
- tag_delete_parser.add_argument("-y", "--yes", action="store_true", help="Answer Yes to prompts automatically.")
134
- tag_delete_parser.add_argument(
135
- "--token", type=str, help="A User Access Token generated from https://huggingface.co/settings/tokens."
136
- )
137
- tag_delete_parser.add_argument(
138
- "--repo-type",
139
- choices=["model", "dataset", "space"],
140
- default="model",
141
- help="Set the type of repository (model, dataset, or space).",
142
- )
143
- tag_delete_parser.set_defaults(func=lambda args: RepoTagDeleteCommand(args))
144
-
145
-
146
- class RepoCreateCommand:
147
- def __init__(self, args: argparse.Namespace):
148
- self.repo_id: str = args.repo_id
149
- self.repo_type: Optional[str] = args.repo_type
150
- self.space_sdk: Optional[str] = args.space_sdk
151
- self.private: bool = args.private
152
- self.token: Optional[str] = args.token
153
- self.exist_ok: bool = args.exist_ok
154
- self.resource_group_id: Optional[str] = args.resource_group_id
155
- self._api = HfApi()
156
-
157
- def run(self):
158
- repo_url = self._api.create_repo(
159
- repo_id=self.repo_id,
160
- repo_type=self.repo_type,
161
- private=self.private,
162
- token=self.token,
163
- exist_ok=self.exist_ok,
164
- resource_group_id=self.resource_group_id,
165
- space_sdk=self.space_sdk,
166
- )
167
- print(f"Successfully created {ANSI.bold(repo_url.repo_id)} on the Hub.")
168
- print(f"Your repo is now available at {ANSI.bold(repo_url)}")
169
-
170
-
171
- class RepoTagCommand:
172
- def __init__(self, args):
173
- self.args = args
174
- self.api = HfApi(token=getattr(args, "token", None))
175
- self.repo_id = args.repo_id
176
- self.repo_type = getattr(args, "repo_type", "model")
177
- if self.repo_type not in REPO_TYPES:
178
- print("Invalid repo --repo-type")
179
- exit(1)
180
-
181
-
182
- class RepoTagCreateCommand(RepoTagCommand):
183
- def run(self):
184
- print(
185
- f"You are about to create tag {ANSI.bold(str(self.args.tag))} on {self.repo_type} {ANSI.bold(self.repo_id)}"
186
- )
187
- try:
188
- self.api.create_tag(
189
- repo_id=self.repo_id,
190
- tag=self.args.tag,
191
- tag_message=getattr(self.args, "message", None),
192
- revision=getattr(self.args, "revision", None),
193
- repo_type=self.repo_type,
194
- )
195
- except RepositoryNotFoundError:
196
- print(f"{self.repo_type.capitalize()} {ANSI.bold(self.repo_id)} not found.")
197
- exit(1)
198
- except RevisionNotFoundError:
199
- print(f"Revision {ANSI.bold(str(getattr(self.args, 'revision', None)))} not found.")
200
- exit(1)
201
- except HfHubHTTPError as e:
202
- if e.response.status_code == 409:
203
- print(f"Tag {ANSI.bold(str(self.args.tag))} already exists on {ANSI.bold(self.repo_id)}")
204
- exit(1)
205
- raise e
206
- print(f"Tag {ANSI.bold(str(self.args.tag))} created on {ANSI.bold(self.repo_id)}")
207
-
208
-
209
- class RepoTagListCommand(RepoTagCommand):
210
- def run(self):
211
- try:
212
- refs = self.api.list_repo_refs(
213
- repo_id=self.repo_id,
214
- repo_type=self.repo_type,
215
- )
216
- except RepositoryNotFoundError:
217
- print(f"{self.repo_type.capitalize()} {ANSI.bold(self.repo_id)} not found.")
218
- exit(1)
219
- except HfHubHTTPError as e:
220
- print(e)
221
- print(ANSI.red(e.response.text))
222
- exit(1)
223
- if len(refs.tags) == 0:
224
- print("No tags found")
225
- exit(0)
226
- print(f"Tags for {self.repo_type} {ANSI.bold(self.repo_id)}:")
227
- for tag in refs.tags:
228
- print(tag.name)
229
-
230
-
231
- class RepoTagDeleteCommand(RepoTagCommand):
232
- def run(self):
233
- print(f"You are about to delete tag {ANSI.bold(self.args.tag)} on {self.repo_type} {ANSI.bold(self.repo_id)}")
234
- if not getattr(self.args, "yes", False):
235
- choice = input("Proceed? [Y/n] ").lower()
236
- if choice not in ("", "y", "yes"):
237
- print("Abort")
238
- exit()
239
- try:
240
- self.api.delete_tag(repo_id=self.repo_id, tag=self.args.tag, repo_type=self.repo_type)
241
- except RepositoryNotFoundError:
242
- print(f"{self.repo_type.capitalize()} {ANSI.bold(self.repo_id)} not found.")
243
- exit(1)
244
- except RevisionNotFoundError:
245
- print(f"Tag {ANSI.bold(self.args.tag)} not found on {ANSI.bold(self.repo_id)}")
246
- exit(1)
247
- print(f"Tag {ANSI.bold(self.args.tag)} deleted on {ANSI.bold(self.repo_id)}")
73
+ ),
74
+ ] = None,
75
+ ) -> None:
76
+ api = get_hf_api(token=token)
77
+ repo_url = api.create_repo(
78
+ repo_id=repo_id,
79
+ repo_type=repo_type.value,
80
+ private=private,
81
+ token=token,
82
+ exist_ok=exist_ok,
83
+ resource_group_id=resource_group_id,
84
+ space_sdk=space_sdk,
85
+ )
86
+ print(f"Successfully created {ANSI.bold(repo_url.repo_id)} on the Hub.")
87
+ print(f"Your repo is now available at {ANSI.bold(repo_url)}")
88
+
89
+
90
+ @tag_app.command("create", help="Create a tag for a repo.")
91
+ def tag_create(
92
+ repo_id: RepoIdArg,
93
+ tag: Annotated[
94
+ str,
95
+ typer.Argument(
96
+ help="The name of the tag to create.",
97
+ ),
98
+ ],
99
+ message: Annotated[
100
+ Optional[str],
101
+ typer.Option(
102
+ "-m",
103
+ "--message",
104
+ help="The description of the tag to create.",
105
+ ),
106
+ ] = None,
107
+ revision: RevisionOpt = None,
108
+ token: TokenOpt = None,
109
+ repo_type: RepoTypeOpt = RepoType.model,
110
+ ) -> None:
111
+ repo_type_str = repo_type.value
112
+ api = get_hf_api(token=token)
113
+ print(f"You are about to create tag {ANSI.bold(tag)} on {repo_type_str} {ANSI.bold(repo_id)}")
114
+ try:
115
+ api.create_tag(repo_id=repo_id, tag=tag, tag_message=message, revision=revision, repo_type=repo_type_str)
116
+ except RepositoryNotFoundError:
117
+ print(f"{repo_type_str.capitalize()} {ANSI.bold(repo_id)} not found.")
118
+ raise typer.Exit(code=1)
119
+ except RevisionNotFoundError:
120
+ print(f"Revision {ANSI.bold(str(revision))} not found.")
121
+ raise typer.Exit(code=1)
122
+ except HfHubHTTPError as e:
123
+ if e.response.status_code == 409:
124
+ print(f"Tag {ANSI.bold(tag)} already exists on {ANSI.bold(repo_id)}")
125
+ raise typer.Exit(code=1)
126
+ raise e
127
+ print(f"Tag {ANSI.bold(tag)} created on {ANSI.bold(repo_id)}")
128
+
129
+
130
+ @tag_app.command("list", help="List tags for a repo.")
131
+ def tag_list(
132
+ repo_id: RepoIdArg,
133
+ token: TokenOpt = None,
134
+ repo_type: RepoTypeOpt = RepoType.model,
135
+ ) -> None:
136
+ repo_type_str = repo_type.value
137
+ api = get_hf_api(token=token)
138
+ try:
139
+ refs = api.list_repo_refs(repo_id=repo_id, repo_type=repo_type_str)
140
+ except RepositoryNotFoundError:
141
+ print(f"{repo_type_str.capitalize()} {ANSI.bold(repo_id)} not found.")
142
+ raise typer.Exit(code=1)
143
+ except HfHubHTTPError as e:
144
+ print(e)
145
+ print(ANSI.red(e.response.text))
146
+ raise typer.Exit(code=1)
147
+ if len(refs.tags) == 0:
148
+ print("No tags found")
149
+ raise typer.Exit(code=0)
150
+ print(f"Tags for {repo_type_str} {ANSI.bold(repo_id)}:")
151
+ for t in refs.tags:
152
+ print(t.name)
153
+
154
+
155
+ @tag_app.command("delete", help="Delete a tag for a repo.")
156
+ def tag_delete(
157
+ repo_id: RepoIdArg,
158
+ tag: Annotated[
159
+ str,
160
+ typer.Argument(
161
+ help="The name of the tag to delete.",
162
+ ),
163
+ ],
164
+ yes: Annotated[
165
+ bool,
166
+ typer.Option(
167
+ "-y",
168
+ "--yes",
169
+ help="Answer Yes to prompt automatically",
170
+ ),
171
+ ] = False,
172
+ token: TokenOpt = None,
173
+ repo_type: RepoTypeOpt = RepoType.model,
174
+ ) -> None:
175
+ repo_type_str = repo_type.value
176
+ print(f"You are about to delete tag {ANSI.bold(tag)} on {repo_type_str} {ANSI.bold(repo_id)}")
177
+ if not yes:
178
+ choice = input("Proceed? [Y/n] ").lower()
179
+ if choice not in ("", "y", "yes"):
180
+ print("Abort")
181
+ raise typer.Exit()
182
+ api = get_hf_api(token=token)
183
+ try:
184
+ api.delete_tag(repo_id=repo_id, tag=tag, repo_type=repo_type_str)
185
+ except RepositoryNotFoundError:
186
+ print(f"{repo_type_str.capitalize()} {ANSI.bold(repo_id)} not found.")
187
+ raise typer.Exit(code=1)
188
+ except RevisionNotFoundError:
189
+ print(f"Tag {ANSI.bold(tag)} not found on {ANSI.bold(repo_id)}")
190
+ raise typer.Exit(code=1)
191
+ print(f"Tag {ANSI.bold(tag)} deleted on {ANSI.bold(repo_id)}")
@@ -34,95 +34,61 @@ Usage:
34
34
  hf repo-files delete <repo_id> file.txt --revision=refs/pr/1 --repo-type=dataset
35
35
  """
36
36
 
37
- from argparse import _SubParsersAction
38
- from typing import Optional
37
+ from typing import Annotated, Optional
38
+
39
+ import typer
39
40
 
40
41
  from huggingface_hub import logging
41
- from huggingface_hub.commands import BaseHuggingfaceCLICommand
42
- from huggingface_hub.hf_api import HfApi
42
+
43
+ from ._cli_utils import RepoIdArg, RepoType, RepoTypeOpt, RevisionOpt, TokenOpt, get_hf_api, typer_factory
43
44
 
44
45
 
45
46
  logger = logging.get_logger(__name__)
46
47
 
47
48
 
48
- class DeleteFilesSubCommand:
49
- def __init__(self, args) -> None:
50
- self.args = args
51
- self.repo_id: str = args.repo_id
52
- self.repo_type: Optional[str] = args.repo_type
53
- self.revision: Optional[str] = args.revision
54
- self.api: HfApi = HfApi(token=args.token, library_name="hf")
55
- self.patterns: list[str] = args.patterns
56
- self.commit_message: Optional[str] = args.commit_message
57
- self.commit_description: Optional[str] = args.commit_description
58
- self.create_pr: bool = args.create_pr
59
- self.token: Optional[str] = args.token
60
-
61
- def run(self) -> None:
62
- logging.set_verbosity_info()
63
- url = self.api.delete_files(
64
- delete_patterns=self.patterns,
65
- repo_id=self.repo_id,
66
- repo_type=self.repo_type,
67
- revision=self.revision,
68
- commit_message=self.commit_message,
69
- commit_description=self.commit_description,
70
- create_pr=self.create_pr,
71
- )
72
- print(f"Files correctly deleted from repo. Commit: {url}.")
73
- logging.set_verbosity_warning()
74
-
75
-
76
- class RepoFilesCommand(BaseHuggingfaceCLICommand):
77
- @staticmethod
78
- def register_subcommand(parser: _SubParsersAction):
79
- repo_files_parser = parser.add_parser("repo-files", help="Manage files in a repo on the Hub.")
80
- repo_files_subparsers = repo_files_parser.add_subparsers(
81
- help="Action to execute against the files.",
82
- required=True,
83
- )
84
- delete_subparser = repo_files_subparsers.add_parser(
85
- "delete",
86
- help="Delete files from a repo on the Hub",
87
- )
88
- delete_subparser.set_defaults(func=lambda args: DeleteFilesSubCommand(args))
89
- delete_subparser.add_argument(
90
- "repo_id", type=str, help="The ID of the repo to manage (e.g. `username/repo-name`)."
91
- )
92
- delete_subparser.add_argument(
93
- "patterns",
94
- nargs="+",
95
- type=str,
49
+ repo_files_cli = typer_factory(help="Manage files in a repo on the Hub.")
50
+
51
+
52
+ @repo_files_cli.command("delete")
53
+ def repo_files_delete(
54
+ repo_id: RepoIdArg,
55
+ patterns: Annotated[
56
+ list[str],
57
+ typer.Argument(
96
58
  help="Glob patterns to match files to delete.",
97
- )
98
- delete_subparser.add_argument(
99
- "--repo-type",
100
- choices=["model", "dataset", "space"],
101
- default="model",
102
- help="Type of the repo to upload to (e.g. `dataset`).",
103
- )
104
- delete_subparser.add_argument(
105
- "--revision",
106
- type=str,
107
- help=(
108
- "An optional Git revision to push to. It can be a branch name "
109
- "or a PR reference. If revision does not"
110
- " exist and `--create-pr` is not set, a branch will be automatically created."
111
- ),
112
- )
113
- delete_subparser.add_argument(
114
- "--commit-message", type=str, help="The summary / title / first line of the generated commit."
115
- )
116
- delete_subparser.add_argument(
117
- "--commit-description", type=str, help="The description of the generated commit."
118
- )
119
- delete_subparser.add_argument(
120
- "--create-pr", action="store_true", help="Whether to create a new Pull Request for these changes."
121
- )
122
- delete_subparser.add_argument(
123
- "--token",
124
- type=str,
125
- help="A User Access Token generated from https://huggingface.co/settings/tokens",
126
- )
127
-
128
- repo_files_parser.set_defaults(func=RepoFilesCommand)
59
+ ),
60
+ ],
61
+ repo_type: RepoTypeOpt = RepoType.model,
62
+ revision: RevisionOpt = None,
63
+ commit_message: Annotated[
64
+ Optional[str],
65
+ typer.Option(
66
+ help="The summary / title / first line of the generated commit.",
67
+ ),
68
+ ] = None,
69
+ commit_description: Annotated[
70
+ Optional[str],
71
+ typer.Option(
72
+ help="The description of the generated commit.",
73
+ ),
74
+ ] = None,
75
+ create_pr: Annotated[
76
+ bool,
77
+ typer.Option(
78
+ help="Whether to create a new Pull Request for these changes.",
79
+ ),
80
+ ] = False,
81
+ token: TokenOpt = None,
82
+ ) -> None:
83
+ api = get_hf_api(token=token)
84
+ url = api.delete_files(
85
+ delete_patterns=patterns,
86
+ repo_id=repo_id,
87
+ repo_type=repo_type.value,
88
+ revision=revision,
89
+ commit_message=commit_message,
90
+ commit_description=commit_description,
91
+ create_pr=create_pr,
92
+ )
93
+ print(f"Files correctly deleted from repo. Commit: {url}.")
94
+ logging.set_verbosity_warning()
@@ -18,35 +18,16 @@ Usage:
18
18
  hf version
19
19
  """
20
20
 
21
- from argparse import _SubParsersAction
22
-
23
21
  from huggingface_hub import __version__
24
22
 
25
23
  from ..utils import dump_environment_info
26
- from . import BaseHuggingfaceCLICommand
27
-
28
-
29
- class EnvironmentCommand(BaseHuggingfaceCLICommand):
30
- def __init__(self, args):
31
- self.args = args
32
-
33
- @staticmethod
34
- def register_subcommand(parser: _SubParsersAction):
35
- env_parser = parser.add_parser("env", help="Print information about the environment.")
36
- env_parser.set_defaults(func=EnvironmentCommand)
37
-
38
- def run(self) -> None:
39
- dump_environment_info()
40
24
 
41
25
 
42
- class VersionCommand(BaseHuggingfaceCLICommand):
43
- def __init__(self, args):
44
- self.args = args
26
+ def env() -> None:
27
+ """Print information about the environment."""
28
+ dump_environment_info()
45
29
 
46
- @staticmethod
47
- def register_subcommand(parser: _SubParsersAction):
48
- version_parser = parser.add_parser("version", help="Print information about the hf version.")
49
- version_parser.set_defaults(func=VersionCommand)
50
30
 
51
- def run(self) -> None:
52
- print(f"huggingface_hub version: {__version__}")
31
+ def version() -> None:
32
+ """Print CLI version."""
33
+ print(f"huggingface_hub version: {__version__}")