-
Notifications
You must be signed in to change notification settings - Fork 0
/
features.py
89 lines (74 loc) · 3.67 KB
/
features.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import pandas as pd
import requests
import sys
import argparse
import time
def get_feature(token, feature_id):
# Get a single feature and return a dataframe of it
req_url = 'https://api.productboard.com/features/' + feature_id
headers = {
"X-Version": "1",
"Authorization": "Bearer " f"{token}"
}
feature_df = pd.DataFrame() # set an initial empty dataframe
response = requests.request("GET", req_url, headers=headers)
if response.status_code == 200:
timestamp = time.strftime("%Y%m%d-%H%M%S") # create a timestamp
print(timestamp + f": Feature list success {response}")
response = response.json()
feature_dict = response['data']
feature_df = pd.DataFrame(feature_dict, index=[0])
else:
print(response)
feature_df = feature_df.rename(columns={"id":"feature_id", "name":"feature_name", "type":"feature_type","status":"feature_status", "parent":"feature_parent"})
return feature_df
def get_all_features(token):
# Get all the features and return a dataframe of them
req_url = 'https://api.productboard.com/features'
headers = {
"X-Version": "1",
"Authorization": "Bearer " f"{token}"
}
all_features_df = pd.DataFrame() # set an initial empty dataframe to append each feature pull to
# Initial retrieval of features
response = requests.request("GET", req_url, headers=headers)
if response.status_code == 200:
timestamp = time.strftime("%Y%m%d-%H%M%S") # create a timestamp
print(timestamp + f": Features list success {response}")
response = response.json()
features_dict = response['data']
next_url = response['links']['next']
features_df = pd.DataFrame.from_dict(features_dict)
all_features_df = pd.concat([all_features_df, features_df], ignore_index=True)
# Use the next_url to paginate through features until next_url is empty (meaning we've fetch all features)
while next_url is not None:
req_url = next_url
response = requests.request("GET", req_url, headers=headers)
if response.status_code == 200:
timestamp = time.strftime("%Y%m%d-%H%M%S") # create a timestamp
print(timestamp + f": Features list success {response}")
response = response.json()
features_dict = response['data']
next_url = response['links']['next']
features_df = pd.DataFrame.from_dict(features_dict)
all_features_df = pd.concat([all_features_df, features_df], ignore_index=True)
else:
print(response)
else:
print(response)
all_features_df = all_features_df.rename(columns={"id": "feature_id", "name":"feature_name", "type":"feature_type","status":"feature_status", "parent":"feature_parent"})
return all_features_df
def main():
parser = argparse.ArgumentParser(prog="features.py", description="Query ProductBoard for a list of all features")
requiredNamed = parser.add_argument_group('required arguments')
requiredNamed.add_argument("-t", "--token", required=True,help="JWT bearer token used for authentication")
args = parser.parse_args()
# Set a dataframe name and fetch the features, passing the authorization token
all_features_df = get_all_features(args.token)
# Cool. Export the dataframe to a CSV. Everyone wants a CSV
print("Done fetching features")
timestamp = time.strftime("%Y%m%d-%H%M%S") # create a timestamp for our filename
all_features_df.to_csv('features-' + timestamp + '.csv')
print('Saved to \'features-' + timestamp + '.csv\'')
if __name__ == "__main__":
sys.exit(main())