davidberenstein1957 HF staff commited on
Commit
cad7678
1 Parent(s): f1a4f26

feat: add basic version of repo cleaner

Browse files
.env/lib/python3.10/site-packages/_distutils_hack/override.py ADDED
@@ -0,0 +1 @@
 
 
1
+ __import__('_distutils_hack').do_override()
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .env
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
- title: Hub Concent Cleaner
3
- emoji: 📚
4
  colorFrom: purple
5
  colorTo: green
6
  sdk: gradio
@@ -8,6 +8,12 @@ sdk_version: 4.44.0
8
  app_file: app.py
9
  pinned: false
10
  license: apache-2.0
 
 
 
 
 
 
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Hub Repo Cleaner
3
+ emoji: 🧹 🧼 🗑️
4
  colorFrom: purple
5
  colorTo: green
6
  sdk: gradio
 
8
  app_file: app.py
9
  pinned: false
10
  license: apache-2.0
11
+ hf_oauth: true
12
+ hf_oauth_scopes:
13
+ - read-repos
14
+ - write-repos
15
+ - manage-repos
16
+
17
  ---
18
 
19
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from gradio.oauth import OAuthToken
3
+ from huggingface_hub import HfApi, whoami
4
+ from huggingface_hub.hf_api import DatasetInfo, ModelInfo, SpaceInfo
5
+
6
+
7
+ def get_token(oauth_token: OAuthToken):
8
+ return oauth_token.token
9
+
10
+
11
+ def list_orgs(oauth_token: OAuthToken = None):
12
+ if oauth_token is None:
13
+ return []
14
+ data = whoami(oauth_token.token)
15
+ if data["auth"]["type"] == "oauth":
16
+ organisations = [data["name"]] + [org["name"] for org in data["orgs"]]
17
+ else:
18
+ organisations = [
19
+ entry["entity"]["name"]
20
+ for entry in data["auth"]["accessToken"]["fineGrained"]["scoped"]
21
+ if "repo.write" in entry["permissions"]
22
+ ]
23
+ organisations = [org for org in organisations if org != data["name"]]
24
+ organisations = [data["name"]] + organisations
25
+ return organisations
26
+
27
+
28
+ def get_org_dropdown(oauth_token: OAuthToken = None):
29
+ orgs = list_orgs(oauth_token)
30
+ return gr.Dropdown(
31
+ label="Organization",
32
+ choices=orgs,
33
+ value=orgs[0] if orgs else None,
34
+ allow_custom_value=True,
35
+ )
36
+
37
+
38
+ def get_resource_type_dropdown(
39
+ org_name: str, resource_type: str, oauth_token: OAuthToken = None
40
+ ):
41
+ if oauth_token is None:
42
+ return []
43
+
44
+ hf_client = HfApi(token=oauth_token.token)
45
+
46
+ if resource_type == "model":
47
+ resources = hf_client.list_models(author=org_name)
48
+ elif resource_type == "dataset":
49
+ resources = hf_client.list_datasets(author=org_name)
50
+ elif resource_type == "space":
51
+ resources = hf_client.list_spaces(author=org_name)
52
+ else:
53
+ resources = []
54
+
55
+ resources = [resource.id for resource in resources]
56
+
57
+ return gr.Dropdown(
58
+ label="Resource",
59
+ choices=resources,
60
+ value=resources[0] if resources else None,
61
+ )
62
+
63
+
64
+ def get_resource(resource_id: str, resource_type: str, oauth_token: OAuthToken = None):
65
+ if oauth_token is None:
66
+ return []
67
+
68
+ hf_client = HfApi(token=oauth_token.token)
69
+
70
+ resource: ModelInfo | DatasetInfo | SpaceInfo = hf_client.repo_info(
71
+ resource_id, repo_type=resource_type
72
+ )
73
+ return str(resource)
74
+
75
+
76
+ def delete_resource(
77
+ resource_id: str, resource_type: str, oauth_token: OAuthToken = None
78
+ ):
79
+ if oauth_token is None:
80
+ return []
81
+
82
+ hf_client = HfApi(token=oauth_token.token)
83
+
84
+ hf_client.delete_repo(resource_id, repo_type=resource_type, missing_ok=True)
85
+
86
+ return gr.Markdown(f"Deleted {resource_id}", visible=True)
87
+
88
+
89
+ with gr.Blocks() as demo:
90
+ gr.Markdown("# 🧹 🧼 🗑️ Hub Repo Cleaner 🗑️ 🧼 🧹")
91
+ gr.LoginButton()
92
+ org_name = gr.Dropdown(label="Organization", choices=list_orgs())
93
+ resource_type = gr.Dropdown(
94
+ label="Resource Type",
95
+ choices=["dataset", "model", "space"],
96
+ value="dataset",
97
+ )
98
+ resources = gr.Dropdown(label="Resources")
99
+ resource_info = gr.Code("Resource Info", language="json")
100
+
101
+ org_name.change(
102
+ get_resource_type_dropdown,
103
+ inputs=[org_name, resource_type],
104
+ outputs=[resources],
105
+ )
106
+ resource_type.change(
107
+ get_resource_type_dropdown,
108
+ inputs=[org_name, resource_type],
109
+ outputs=[resources],
110
+ )
111
+ resources.change(
112
+ get_resource,
113
+ inputs=[resources, resource_type],
114
+ outputs=[resource_info],
115
+ )
116
+
117
+ markdown = gr.Markdown("message", label="Message", visible=False)
118
+ button = gr.Button("Delete")
119
+ button.click(
120
+ delete_resource, inputs=[resources, resource_type], outputs=[markdown]
121
+ ).then(
122
+ fn=get_resource_type_dropdown,
123
+ inputs=[org_name, resource_type],
124
+ outputs=[resources],
125
+ )
126
+ demo.load(get_org_dropdown, outputs=[org_name])
127
+
128
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ gradio[oauth]