|
1 | 1 | import json |
| 2 | +import os |
2 | 3 | import sys |
3 | 4 | import time |
| 5 | +from urllib.parse import urlparse |
4 | 6 |
|
5 | 7 | import requests |
6 | 8 |
|
7 | | -from roboflow.config import API_URL, APP_URL, DEMO_KEYS |
| 9 | +from roboflow.config import API_URL, APP_URL, DEMO_KEYS, load_roboflow_api_key |
8 | 10 | from roboflow.core.project import Project |
9 | 11 | from roboflow.core.workspace import Workspace |
| 12 | +from roboflow.util.general import write_line |
10 | 13 |
|
11 | | -__version__ = "0.2.34" |
| 14 | +__version__ = "1.0.0" |
12 | 15 |
|
13 | 16 |
|
14 | 17 | def check_key(api_key, model, notebook, num_retries=0): |
@@ -67,14 +70,118 @@ def auth(api_key): |
67 | 70 | return Roboflow(api_key, w) |
68 | 71 |
|
69 | 72 |
|
| 73 | +def login(workspace=None, force=False): |
| 74 | + conf_location = os.getenv( |
| 75 | + "ROBOFLOW_CONFIG_DIR", |
| 76 | + default=os.getenv("HOME") + "/.config/roboflow/config.json", |
| 77 | + ) |
| 78 | + |
| 79 | + if os.path.isfile(conf_location) and not force: |
| 80 | + write_line( |
| 81 | + "You are already logged into Roboflow. To make a different login, run roboflow.login(force=True)." |
| 82 | + ) |
| 83 | + return None |
| 84 | + # we could eventually return the workspace object here |
| 85 | + # return Roboflow().workspace() |
| 86 | + elif os.path.isfile(conf_location) and force: |
| 87 | + os.remove(conf_location) |
| 88 | + |
| 89 | + if workspace is None: |
| 90 | + write_line( |
| 91 | + "visit " + APP_URL + "/auth-cli" " to get your authentication token." |
| 92 | + ) |
| 93 | + else: |
| 94 | + write_line( |
| 95 | + "visit " |
| 96 | + + APP_URL |
| 97 | + + "/auth-cli/?workspace=" |
| 98 | + + workspace |
| 99 | + + " to get your authentication token." |
| 100 | + ) |
| 101 | + |
| 102 | + token = input("Paste the authentication here token here: ") |
| 103 | + |
| 104 | + r_login = requests.get(APP_URL + "/query/cliAuthToken/" + token) |
| 105 | + |
| 106 | + if r_login.status_code == 200: |
| 107 | + r_login = r_login.json() |
| 108 | + |
| 109 | + # make config directory if it doesn't exist |
| 110 | + if not os.path.exists(os.path.dirname(conf_location)): |
| 111 | + os.mkdir(os.path.dirname(conf_location)) |
| 112 | + |
| 113 | + r_login = {"workspaces": r_login} |
| 114 | + # set first workspace as default workspace |
| 115 | + |
| 116 | + default_workspace_id = list(r_login["workspaces"].keys())[0] |
| 117 | + workspace = r_login["workspaces"][default_workspace_id] |
| 118 | + r_login["RF_WORKSPACE"] = workspace["url"] |
| 119 | + |
| 120 | + # write config file |
| 121 | + with open(conf_location, "w") as f: |
| 122 | + json.dump(r_login, f, indent=2) |
| 123 | + |
| 124 | + else: |
| 125 | + r_login.raise_for_status() |
| 126 | + |
| 127 | + return None |
| 128 | + # we could eventually return the workspace object here |
| 129 | + # return Roboflow().workspace() |
| 130 | + |
| 131 | + |
| 132 | +active_workspace = None |
| 133 | + |
| 134 | + |
| 135 | +def initialize_roboflow(): |
| 136 | + global active_workspace |
| 137 | + |
| 138 | + conf_location = os.getenv( |
| 139 | + "ROBOFLOW_CONFIG_DIR", |
| 140 | + default=os.getenv("HOME") + "/.config/roboflow/config.json", |
| 141 | + ) |
| 142 | + |
| 143 | + if not os.path.isfile(conf_location): |
| 144 | + raise RuntimeError( |
| 145 | + "To use this method, you must first login - run roboflow.login()" |
| 146 | + ) |
| 147 | + else: |
| 148 | + if active_workspace == None: |
| 149 | + active_workspace = Roboflow().workspace() |
| 150 | + |
| 151 | + return active_workspace |
| 152 | + |
| 153 | + |
| 154 | +def load_model(model_url): |
| 155 | + operate_workspace = initialize_roboflow() |
| 156 | + |
| 157 | + if "universe.roboflow.com" in model_url or "app.roboflow.com" in model_url: |
| 158 | + parsed_url = urlparse(model_url) |
| 159 | + path_parts = parsed_url.path.split("/") |
| 160 | + project = path_parts[2] |
| 161 | + version = int(path_parts[-1]) |
| 162 | + else: |
| 163 | + raise ( |
| 164 | + "Model URL must be from either app.roboflow.com or universe.roboflow.com" |
| 165 | + ) |
| 166 | + |
| 167 | + project = operate_workspace.project(project) |
| 168 | + version = project.version(version) |
| 169 | + model = version.model |
| 170 | + return model |
| 171 | + |
| 172 | + |
| 173 | +# continue distributing this object for back compatibility |
70 | 174 | class Roboflow: |
71 | 175 | def __init__( |
72 | 176 | self, |
73 | | - api_key="YOUR ROBOFLOW API KEY HERE", |
| 177 | + api_key=None, |
74 | 178 | model_format="undefined", |
75 | 179 | notebook="undefined", |
76 | 180 | ): |
77 | 181 | self.api_key = api_key |
| 182 | + if self.api_key == None: |
| 183 | + self.api_key = load_roboflow_api_key() |
| 184 | + |
78 | 185 | self.model_format = model_format |
79 | 186 | self.notebook = notebook |
80 | 187 | self.onboarding = False |
|
0 commit comments