Skip to content

Commit 0dd6f89

Browse files
tbiyssclaude
andcommitted
Add Boost.space platform support via platform abstraction
Resolve the API base URL dynamically from a (platform, zone) pair instead of hardcoding {zone}.make.com. Adds a "platform" config key (flag / MAKE_PLATFORM env / config.yaml), defaulting to "make" for full backward compatibility. Boost.space Integrator uses the same API v2 at integrator.boost.space. Removes the strict zone validation that rejected non-standard zones. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 533ea8d commit 0dd6f89

5 files changed

Lines changed: 47 additions & 9 deletions

File tree

‎core/config.py‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
CONFIG_DIR = Path.home() / ".make-cli"
88
CONFIG_FILE = CONFIG_DIR / "config.yaml"
99

10+
# Maps a platform name to its host template. The {zone} placeholder is
11+
# replaced at runtime; platforms whose host does not vary by zone omit it.
12+
PLATFORM_HOSTS = {
13+
"make": "{zone}.make.com",
14+
"boost.space": "integrator.boost.space",
15+
}
16+
1017

1118
def load_config() -> dict:
1219
if CONFIG_FILE.exists():
@@ -39,3 +46,24 @@ def get_zone(override: Optional[str] = None) -> str:
3946
return env
4047
cfg = load_config()
4148
return cfg.get("zone", "eu1")
49+
50+
51+
def get_platform(override: Optional[str] = None) -> str:
52+
if override:
53+
return override
54+
env = os.environ.get("MAKE_PLATFORM")
55+
if env:
56+
return env
57+
cfg = load_config()
58+
return cfg.get("platform", "make")
59+
60+
61+
def get_base_url(platform: str, zone: str) -> str:
62+
"""Resolve the full API base URL from a (platform, zone) pair.
63+
64+
Known platforms use their host template from PLATFORM_HOSTS. Unknown
65+
platform values are treated as a literal custom hostname.
66+
"""
67+
template = PLATFORM_HOSTS.get(platform, platform)
68+
host = template.format(zone=zone) if "{zone}" in template else template
69+
return f"https://{host}/api/v2"

‎make_cli/cli.py‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import importlib
33
import click
44
from make_cli.context import CliContext
5-
from core.config import get_token, get_zone
5+
from core.config import get_token, get_zone, get_platform
66
from core.output import set_json_mode
77

88
__version__ = "0.1.0"
@@ -12,25 +12,32 @@
1212
@click.version_option(version=__version__, prog_name="make-cli")
1313
@click.option("--json", "json_mode", is_flag=True, default=False, help="Output as JSON")
1414
@click.option("--zone", default=None, help="Make.com zone (eu1, eu2, us1, us2)")
15+
@click.option(
16+
"--platform",
17+
default=None,
18+
help="API platform: make (default) or boost.space",
19+
)
1520
@click.option(
1621
"--token",
1722
default=None,
1823
envvar="MAKE_API_TOKEN",
1924
help="Make.com API token (overrides config/env)",
2025
)
2126
@click.pass_context
22-
def main(ctx: click.Context, json_mode: bool, zone: str, token: str):
27+
def main(ctx: click.Context, json_mode: bool, zone: str, platform: str, token: str):
2328
"""Make.com CLI — manage scenarios, teams, folders and sync your org."""
2429
ctx.ensure_object(dict)
2530
set_json_mode(json_mode)
2631

2732
resolved_token = get_token(token)
2833
resolved_zone = get_zone(zone)
34+
resolved_platform = get_platform(platform)
2935

3036
ctx.obj = CliContext(
3137
json_mode=json_mode,
3238
_token=resolved_token,
3339
_zone=resolved_zone,
40+
_platform=resolved_platform,
3441
)
3542

3643
if ctx.invoked_subcommand is None:

‎make_cli/commands/config_cmd.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ def config_set(key: str, value: str):
3434
3535
\b
3636
Keys:
37-
api_token Your Make.com API token
37+
api_token Your Make.com / Boost.space API token
3838
zone API zone: eu1, eu2, us1, us2 (default: eu1)
39+
platform API platform: make or boost.space (default: make)
3940
default_org_id Default organization ID
4041
"""
4142
cfg = load_config()

‎make_cli/context.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class CliContext:
88
json_mode: bool = False
99
_token: Optional[str] = field(default=None, repr=False)
1010
_zone: str = field(default="eu1", repr=False)
11+
_platform: str = field(default="make", repr=False)
1112
_client: object = field(default=None, repr=False)
1213
_org_zone_cache: dict = field(default_factory=dict, repr=False)
1314

@@ -19,7 +20,7 @@ def client(self):
1920
raise RuntimeError(
2021
"No API token configured. Run: make-cli config set api_token <token>"
2122
)
22-
self._client = MakeClient(token=self._token, zone=self._zone)
23+
self._client = MakeClient(token=self._token, zone=self._zone, platform=self._platform)
2324
return self._client
2425

2526
def use_org_zone(self, org_id: int):

‎utils/make_backend.py‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import requests
33
from typing import Any
44

5+
from core.config import get_base_url
6+
57
ZONES = ["eu1", "eu2", "us1", "us2"]
68

79

@@ -13,12 +15,11 @@ def __init__(self, status_code: int, message: str, detail: dict = None):
1315

1416

1517
class MakeClient:
16-
def __init__(self, token: str, zone: str = "eu1"):
17-
if zone not in ZONES:
18-
raise ValueError(f"Invalid zone '{zone}'. Must be one of: {ZONES}")
18+
def __init__(self, token: str, zone: str = "eu1", platform: str = "make"):
1919
self.token = token
2020
self.zone = zone
21-
self.base_url = f"https://{zone}.make.com/api/v2"
21+
self.platform = platform
22+
self.base_url = get_base_url(platform, zone)
2223
self.session = requests.Session()
2324
self.session.headers.update(
2425
{
@@ -66,7 +67,7 @@ def switch_zone(self, zone: str):
6667
# Short zone prefix
6768
if zone in ZONES:
6869
self.zone = zone
69-
self.base_url = f"https://{zone}.make.com/api/v2"
70+
self.base_url = get_base_url(self.platform, zone)
7071

7172
def get(self, path: str, params: dict = None) -> Any:
7273
return self._request("GET", path, params=params)

0 commit comments

Comments
 (0)