From e67fcd6e7a475bd36ff38830d0cfc9ad5aab9621 Mon Sep 17 00:00:00 2001 From: Lubomir Host Date: Tue, 14 Jul 2026 10:25:09 +0200 Subject: [PATCH 1/4] Allow parameter export=True for zone export With the parameter export=True the output of zone export looks differently: - key `short_answers` becomes 'answers' - key 'id' is removed - key 'zone_name' is removed --- examples/zone-export.py | 32 ++++++++++++++++++++++++++++++++ ns1/rest/zones.py | 3 ++- ns1/zones.py | 8 ++++---- 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 examples/zone-export.py diff --git a/examples/zone-export.py b/examples/zone-export.py new file mode 100644 index 0000000..e670528 --- /dev/null +++ b/examples/zone-export.py @@ -0,0 +1,32 @@ +# +# Copyright (c) 2026 NSONE, Inc. +# +# License under The MIT License (MIT). See LICENSE in project root. +# + +import os +import sys +import json + +from ns1 import NS1, Config + +zone_name = sys.argv[1] +env_api_key = os.environ.get("NS1_API_KEY", None) + +if env_api_key: + api_key = env_api_key + ns1_config = Config() + ns1_config.createFromAPIKey(api_key) + api = NS1(config=ns1_config) +else: + # NS1 will use config in ~/.nsone by default + api = NS1() + +# turn on "follow pagination". This will handle paginated responses for +# zone list and the records for a zone retrieve. It's off by default to +# avoid a breaking change +config = api.config +config["follow_pagination"] = True + +zone = api.zones().retrieve(zone_name, params={"export": True}) +print(json.dumps(zone, indent=2, sort_keys=True)) diff --git a/ns1/rest/zones.py b/ns1/rest/zones.py index 07f01fe..bce96cf 100644 --- a/ns1/rest/zones.py +++ b/ns1/rest/zones.py @@ -106,13 +106,14 @@ def list(self, callback=None, errback=None): pagination_handler=zone_list_pagination, ) - def retrieve(self, zone, callback=None, errback=None): + def retrieve(self, zone, callback=None, errback=None, params=None): return self._make_request( "GET", "%s/%s" % (self.ROOT, zone), callback=callback, errback=errback, pagination_handler=zone_retrieve_pagination, + params=params, ) def search( diff --git a/ns1/zones.py b/ns1/zones.py index 3e5a8d8..fe766fb 100644 --- a/ns1/zones.py +++ b/ns1/zones.py @@ -39,13 +39,13 @@ def __repr__(self): def __getitem__(self, item): return self.data.get(item, None) - def reload(self, callback=None, errback=None): + def reload(self, callback=None, errback=None, params=None): """ Reload zone data from the API. """ - return self.load(reload=True, callback=callback, errback=errback) + return self.load(reload=True, callback=callback, errback=errback, params=params) - def load(self, callback=None, errback=None, reload=False): + def load(self, callback=None, errback=None, reload=False, params=None): """ Load zone data from the API. """ @@ -60,7 +60,7 @@ def success(result, *args): return self return self._rest.retrieve( - self.zone, callback=success, errback=errback + self.zone, callback=success, errback=errback, params=params ) def delete(self, callback=None, errback=None): From 329d130a987f243b45133609b4d330d8338bb3f4 Mon Sep 17 00:00:00 2001 From: Lubomir Host Date: Tue, 14 Jul 2026 21:49:39 +0200 Subject: [PATCH 2/4] Reformat code with black --- ns1/zones.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ns1/zones.py b/ns1/zones.py index fe766fb..81b7166 100644 --- a/ns1/zones.py +++ b/ns1/zones.py @@ -43,7 +43,9 @@ def reload(self, callback=None, errback=None, params=None): """ Reload zone data from the API. """ - return self.load(reload=True, callback=callback, errback=errback, params=params) + return self.load( + reload=True, callback=callback, errback=errback, params=params + ) def load(self, callback=None, errback=None, reload=False, params=None): """ From be23b004b272640ad6c0493dd3d2a6e63f85331f Mon Sep 17 00:00:00 2001 From: Lubomir Host Date: Tue, 14 Jul 2026 21:58:06 +0200 Subject: [PATCH 3/4] Pass params to _make_request() only if it's not None --- ns1/rest/zones.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ns1/rest/zones.py b/ns1/rest/zones.py index bce96cf..bea7fc9 100644 --- a/ns1/rest/zones.py +++ b/ns1/rest/zones.py @@ -107,13 +107,16 @@ def list(self, callback=None, errback=None): ) def retrieve(self, zone, callback=None, errback=None, params=None): + kwargs = {} + if params is not None: + kwargs["params"] = params return self._make_request( "GET", "%s/%s" % (self.ROOT, zone), callback=callback, errback=errback, pagination_handler=zone_retrieve_pagination, - params=params, + **kwargs, ) def search( From 3556200a2f281583558f66e84c06ff3c5e5c9913 Mon Sep 17 00:00:00 2001 From: Lubomir Host Date: Tue, 14 Jul 2026 22:13:18 +0200 Subject: [PATCH 4/4] Rename example to avoid filename collision with #145 --- examples/{zone-export.py => zone-export-json.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{zone-export.py => zone-export-json.py} (100%) diff --git a/examples/zone-export.py b/examples/zone-export-json.py similarity index 100% rename from examples/zone-export.py rename to examples/zone-export-json.py