Skip to content

Commit 28feb92

Browse files
kahmed00GitHub Enterprise
authored andcommitted
feat(new-sdk-version): adding version 4.0.0 sdk (#11)
Supported API versions: * v2 Summary: * Adding support for new features Breaking changes: * No changes Functionality Additions: * Publisher API calculation and document lookup * New componentdetail parameter for PA and Vault calculation Bug Fixes: * No changes
1 parent 4ad03f3 commit 28feb92

File tree

69 files changed

+10519
-355
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+10519
-355
lines changed

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
4.0.0 (06/17/2020)
2+
3+
Supported API versions:
4+
* v2
5+
6+
Summary:
7+
* Adding support for new features
8+
9+
Breaking changes:
10+
* No changes
11+
12+
Functionality Additions:
13+
* Publisher API calculation and document lookup
14+
* New componentdetail parameter for PA and Vault calculation
15+
16+
Bug Fixes:
17+
* No changes
18+
19+
-----------------------
20+
121
3.0.0 (12/02/2019)
222

323
Supported API versions:

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ API client library to leverage FactSet's PA Engine, SPAR Engine and Vault API in
1111
* Python 3.4+
1212

1313
#### Current versions
14-
* API_VERSION - 2
15-
* PACKAGE_VERSION - 3.0.0
14+
* API_VERSION - v2
15+
* PACKAGE_VERSION - 4.0.0
1616

1717
## To install the API client library
1818
* Run the below command.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"packageName": "fds.analyticsapi.engines",
33
"projectName": "fds.analyticsapi.engines",
4-
"packageVersion": "3.0.0",
4+
"packageVersion": "4.0.0",
55
"packageUrl": "https://github.com/factset/analyticsapi-engines-python-sdk"
66
}

Utilities/codegen/openapi-schema.json

Lines changed: 8714 additions & 1 deletion
Large diffs are not rendered by default.

Utilities/examples/examples.pyproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
</PropertyGroup>
2323
<ItemGroup>
2424
<Compile Include="multiple_engines_example.py" />
25+
<Compile Include="pub_engine_example.py" />
2526
<Compile Include="pa_engine_example.py">
2627
<SubType>Code</SubType>
2728
</Compile>
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import json
2+
import sys
3+
import time
4+
5+
from fds.analyticsapi.engines.api.calculations_api import CalculationsApi
6+
from fds.analyticsapi.engines.api.utility_api import UtilityApi
7+
from fds.analyticsapi.engines.api_client import ApiClient
8+
from fds.analyticsapi.engines.configuration import Configuration
9+
from fds.analyticsapi.engines.models.calculation import Calculation
10+
from fds.analyticsapi.engines.models.pub_calculation_parameters import PubCalculationParameters
11+
from fds.analyticsapi.engines.models.pub_identifier import PubIdentifier
12+
from fds.analyticsapi.engines.models.pub_date_parameters import PubDateParameters
13+
from fds.protobuf.stach.Package_pb2 import Package
14+
15+
from google.protobuf import json_format
16+
from google.protobuf.json_format import MessageToJson
17+
from google.protobuf.json_format import MessageToDict
18+
19+
from urllib3 import Retry
20+
from pathlib import Path
21+
22+
host = "https://api.factset.com"
23+
username = "<username-serial>"
24+
password = "<apiKey>"
25+
26+
pub_document_name = "Super_client:/publisher/Equity Snapshot.PUB_BRIDGE_PDF"
27+
pub_account_name = "BENCH:SP50"
28+
startdate = "-1M"
29+
enddate = "0M"
30+
31+
config = Configuration()
32+
config.host = host
33+
config.username = username
34+
config.password = password
35+
# add proxy and/or disable ssl verification according to your development environment
36+
# config.proxy = "<proxyUrl>"
37+
config.verify_ssl = False
38+
39+
# Setting configuration to retry api calls on http status codes of 429 and 503.
40+
config.retries = Retry(total=3, status=3, status_forcelist=frozenset([429, 503]), backoff_factor=2, raise_on_status=False)
41+
42+
api_client = ApiClient(config)
43+
44+
pub_account_identifier = PubIdentifier(pub_account_name);
45+
pub_dates = PubDateParameters(startdate, enddate);
46+
47+
pub_calculation_parameters = {"1": PubCalculationParameters(pub_document_name, pub_account_identifier, pub_dates)}
48+
49+
calculation = Calculation(pub=pub_calculation_parameters)
50+
print(calculation)
51+
52+
calculations_api = CalculationsApi(api_client)
53+
run_calculation_response = calculations_api.run_calculation_with_http_info(calculation=calculation)
54+
55+
if run_calculation_response[1] != 202:
56+
print("Calculation Failed!!!")
57+
print("Status Code: " + run_calculation_response[1])
58+
print("Request Key: " + run_calculation_response[2].get("x-datadirect-request-key"))
59+
print(run_calculation_response[0])
60+
sys.exit()
61+
62+
calculation_id = run_calculation_response[2].get("location").split("/")[-1]
63+
print("Calculation Id: " + calculation_id)
64+
65+
status_response = calculations_api.get_calculation_status_by_id_with_http_info(calculation_id)
66+
while status_response[1] == 200 and (status_response[0].status in ("Queued", "Executing")):
67+
max_age = '5'
68+
age_value = status_response[2].get("cache-control")
69+
if age_value is not None:
70+
max_age = age_value.replace("max-age=", "")
71+
print('Sleeping: ' + max_age)
72+
time.sleep(int(max_age))
73+
status_response = calculations_api.get_calculation_status_by_id_with_http_info(calculation_id)
74+
75+
if status_response[1] != 200:
76+
print("Calculation Failed!!!")
77+
print("Status Code: " + status_response[1])
78+
print("Request Key: " + status_response[2].get("x-datadirect-request-key"))
79+
print(status_response[0])
80+
sys.exit()
81+
82+
for calculation_unit in status_response[0].pub.values():
83+
print(calculation_unit)
84+
if calculation_unit.status == "Failed":
85+
print("Calculation Failed!!!")
86+
elif calculation_unit.status == "Success":
87+
utility_api = UtilityApi(api_client)
88+
result_response = utility_api.get_by_url_with_http_info(calculation_unit.result, _preload_content=False)
89+
90+
if result_response[1] != 200:
91+
print("Calculation Failed!!!")
92+
print("Status Code: " + result_response[1])
93+
print("Request Key: " + result_response[2].get("x-datadirect-request-key"))
94+
print(result_response[0])
95+
sys.exit()
96+
97+
print("Calculation Succeeded")
98+
filename = Path('Output.pdf')
99+
filename.write_bytes(result_response[0].data)

Utilities/tests/common_parameters.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,25 @@
88
# Set 'ANALYTICS_API_URL' environment variable with api url as value
99
base_url = 'https://api.factset.com' if not os.getenv("ANALYTICS_API_URL") else os.getenv("ANALYTICS_API_URL")
1010

11-
pa_deafult_document = "PA_DOCUMENTS:DEFAULT"
11+
pa_default_document = "PA_DOCUMENTS:DEFAULT"
1212
pa_benchmark_sp500 = "BENCH:SP50"
1313
pa_benchmark_r1000 = "BENCH:R.1000"
14-
spar_deafult_document = "pmw_root:/spar_documents/Factset Default Document"
14+
spar_default_document = "pmw_root:/spar_documents/Factset Default Document"
1515
spar_benchmark_r1000 = "R.1000"
1616
spar_benchmark_r2000 = "R.2000"
1717
spar_benchmark_russell_p_r1000 = "RUSSELL_P:R.2000"
1818
spar_benchmark_russell_prefix = "RUSSELL"
1919
spar_benchmark_russell_return_type = "GTR"
20-
vault_deafult_document = "PA3_DOCUMENTS:DEFAULT"
21-
vault_deafult_account = "Client:/analytics/data/US_MID_CAP_CORE.ACTM"
20+
vault_default_document = "PA3_DOCUMENTS:DEFAULT"
21+
vault_default_account = "Client:/analytics/data/US_MID_CAP_CORE.ACTM"
2222
vault_start_date = "FIRST_REPOSITORY"
2323
vault_end_date = "LAST_REPOSITORY"
24-
deafult_start_date = "20180101"
25-
deafult_end_date = "20181231"
26-
deafult_dates_frequency = "Monthly"
27-
deafult_dates_account = "Client:/analytics/data/US_MID_CAP_CORE.ACTM"
24+
pub_document_name = "Super_client:/publisher/Equity Snapshot.PUB_BRIDGE_PDF"
25+
pub_account_name = "BENCH:SP50"
26+
pub_start_date = "-1M"
27+
pub_end_date = "0M"
28+
default_start_date = "20180101"
29+
default_end_date = "20181231"
30+
default_dates_frequency = "Monthly"
31+
default_dates_account = "Client:/analytics/data/US_MID_CAP_CORE.ACTM"
2832
default_lookup_directory = "client:"

Utilities/tests/test_calculations_api.py

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from google.protobuf import json_format
66
from fds.protobuf.stach.Package_pb2 import Package
7+
from urllib3.response import HTTPResponse
78

89
from fds.analyticsapi.engines.api.components_api import ComponentsApi
910
from fds.analyticsapi.engines.api.configurations_api import ConfigurationsApi
@@ -19,6 +20,9 @@
1920
from fds.analyticsapi.engines.models.vault_calculation_parameters import VaultCalculationParameters
2021
from fds.analyticsapi.engines.models.vault_identifier import VaultIdentifier
2122
from fds.analyticsapi.engines.models.vault_date_parameters import VaultDateParameters
23+
from fds.analyticsapi.engines.models.pub_calculation_parameters import PubCalculationParameters
24+
from fds.analyticsapi.engines.models.pub_identifier import PubIdentifier
25+
from fds.analyticsapi.engines.models.pub_date_parameters import PubDateParameters
2226
from fds.analyticsapi.engines.models.calculation_status import CalculationStatus
2327
from fds.analyticsapi.engines.models.calculation_unit_status import CalculationUnitStatus
2428
from fds.analyticsapi.engines.models.calculation_status_summary import CalculationStatusSummary
@@ -36,20 +40,20 @@ def setUp(self):
3640

3741
def run_calculation(self):
3842
components_api = ComponentsApi(self.api_client)
39-
components = components_api.get_pa_components(common_parameters.pa_deafult_document)
43+
components = components_api.get_pa_components(common_parameters.pa_default_document)
4044
component_id = list(components.keys())[0]
4145

4246
pa_account_identifier = PAIdentifier(common_parameters.pa_benchmark_sp500)
4347
pa_accounts = [pa_account_identifier]
4448
pa_benchmark_identifier = PAIdentifier(common_parameters.pa_benchmark_r1000)
4549
pa_benchmarks = [pa_benchmark_identifier]
46-
pa_dates = PADateParameters(common_parameters.deafult_start_date,
47-
common_parameters.deafult_end_date,
48-
common_parameters.deafult_dates_frequency)
50+
pa_dates = PADateParameters(common_parameters.default_start_date,
51+
common_parameters.default_end_date,
52+
common_parameters.default_dates_frequency)
4953

5054
pa_calculation_parameters = {"1": PACalculationParameters(component_id, pa_accounts, pa_benchmarks, pa_dates)}
5155

52-
components = components_api.get_spar_components(common_parameters.spar_deafult_document)
56+
components = components_api.get_spar_components(common_parameters.spar_default_document)
5357
component_id = list(components.keys())[0]
5458

5559
spar_account_identifier = SPARIdentifier(common_parameters.spar_benchmark_r1000,
@@ -59,25 +63,30 @@ def run_calculation(self):
5963
spar_benchmark_identifier = SPARIdentifier(common_parameters.spar_benchmark_r2000,
6064
common_parameters.spar_benchmark_russell_return_type,
6165
common_parameters.spar_benchmark_russell_prefix)
62-
spar_dates = SPARDateParameters(common_parameters.deafult_start_date,
63-
common_parameters.deafult_end_date,
64-
common_parameters.deafult_dates_frequency)
66+
spar_dates = SPARDateParameters(common_parameters.default_start_date,
67+
common_parameters.default_end_date,
68+
common_parameters.default_dates_frequency)
6569

6670
spar_calculation_parameters = {"2": SPARCalculationParameters(component_id, spar_accounts, spar_benchmark_identifier, spar_dates)}
6771

68-
components = components_api.get_vault_components(common_parameters.vault_deafult_document)
72+
components = components_api.get_vault_components(common_parameters.vault_default_document)
6973
component_id = list(components.keys())[0]
7074

71-
vault_account_identifier = VaultIdentifier(common_parameters.vault_deafult_account)
72-
vault_dates = VaultDateParameters(common_parameters.vault_start_date, common_parameters.vault_end_date, common_parameters.deafult_dates_frequency)
75+
vault_account_identifier = VaultIdentifier(common_parameters.vault_default_account)
76+
vault_dates = VaultDateParameters(common_parameters.vault_start_date, common_parameters.vault_end_date, common_parameters.default_dates_frequency)
7377

7478
configurations_api = ConfigurationsApi(self.api_client)
75-
configurations = configurations_api.get_vault_configurations(common_parameters.vault_deafult_account)
79+
configurations = configurations_api.get_vault_configurations(common_parameters.vault_default_account)
7680
configuration_id = list(configurations.keys())[0]
7781

7882
vault_calculation_parameters = {"3": VaultCalculationParameters(component_id, vault_account_identifier, vault_dates, configuration_id)}
7983

80-
calculation = Calculation(pa_calculation_parameters, spar_calculation_parameters, vault_calculation_parameters)
84+
pub_account_identifier = PubIdentifier(common_parameters.pub_account_name);
85+
pub_dates = PubDateParameters(common_parameters.pub_start_date, common_parameters.pub_end_date);
86+
87+
pub_calculation_parameters = {"4": PubCalculationParameters(common_parameters.pub_document_name, pub_account_identifier, pub_dates)}
88+
89+
calculation = Calculation(pa_calculation_parameters, spar_calculation_parameters, vault_calculation_parameters, pub_calculation_parameters)
8190
return self.calculations_api.run_calculation_with_http_info(calculation=calculation)
8291

8392
def test_create_calculation(self):
@@ -105,21 +114,30 @@ def test_calculation_success(self):
105114

106115
self.assertEqual(self.status_response[1], 200, "Calculation should be completed")
107116
self.assertEqual(self.status_response[0].status, "Completed", "Calculation status should be completed")
117+
self.assertEqual(type(self.status_response[0]), CalculationStatus, "Response should be of CalculationStatus type")
118+
119+
engines = ["pa", "spar", "vault", "pub"]
108120

109-
calculations = list(self.status_response[0].pa.values()) + list(self.status_response[0].spar.values()) + list(self.status_response[0].vault.values())
121+
for engine in engines:
122+
calculations = getattr(self.status_response[0], engine).values()
123+
for calc in calculations:
124+
self.assertEqual(type(calc), CalculationUnitStatus, "Response should be of CalculationUnitStatus type")
125+
self.assertEqual(calc.status, "Success", "Calculation should be successful")
126+
self.assertNotEqual(calc.result, None, "Response result should not be null")
110127

111-
for calc in calculations:
112-
self.assertEqual(type(calc), CalculationUnitStatus, "Response should be of CalculationUnitStatus type")
113-
self.assertEqual(calc.status, "Success", "Calculation should be successful")
114-
self.assertNotEqual(calc.result, None, "Response result should not be null")
128+
utility_api = UtilityApi(self.api_client)
115129

116-
utility_api = UtilityApi(self.api_client)
117-
result_response = utility_api.get_by_url_with_http_info(calc.result)
130+
if engine is not "pub":
131+
result_response = utility_api.get_by_url_with_http_info(calc.result)
132+
result = json_format.Parse(json.dumps(result_response[0]), Package())
118133

119-
result = json_format.Parse(json.dumps(result_response[0]), Package())
134+
self.assertEqual(result_response[1], 200, "Response should be 200 - Success")
135+
self.assertEqual(type(result), Package, "Response should be of Package type.")
136+
else:
137+
result_response = utility_api.get_by_url_with_http_info(calc.result, _preload_content=False)
120138

121-
self.assertEqual(result_response[1], 200, "Response should be 200 - Success")
122-
self.assertEqual(type(result), Package, "Response should be of Package type.")
139+
self.assertEqual(result_response[1], 200, "Response should be 200 - Success")
140+
self.assertEqual(type(result_response[0]), HTTPResponse, "Response should be of HTTPResponse type.")
123141

124142
def test_delete_calculation(self):
125143
calculation_id = self.create_response[2].get("location").split("/")[-1]

Utilities/tests/test_components_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def setUp(self):
1818
######################################################################################
1919

2020
def test_get_all_pa_components(self):
21-
response = self.components_api.get_pa_components_with_http_info(document=common_parameters.pa_deafult_document)
21+
response = self.components_api.get_pa_components_with_http_info(document=common_parameters.pa_default_document)
2222
component_id = list(response[0].keys())[0]
2323
self.assertEqual(response[1], 200, "Response should be 200 - Success")
2424
self.assertEqual(type(response[0]), dict, "Response should be of dictionary type")
2525
self.assertEqual(type(response[0][component_id]), ComponentSummary, "Response should be of ComponentSummary type")
2626

2727
def test_get_pa_component_by_id(self):
28-
components = self.components_api.get_pa_components(document=common_parameters.pa_deafult_document)
28+
components = self.components_api.get_pa_components(document=common_parameters.pa_default_document)
2929
component_id = list(components.keys())[0]
3030
response = self.components_api.get_pa_component_by_id_with_http_info(component_id)
3131
self.assertEqual(response[1], 200, "Response should be 200 - Success")
@@ -37,14 +37,14 @@ def test_get_pa_component_by_id(self):
3737
######################################################################################
3838

3939
def test_get_all_vault_components(self):
40-
response = self.components_api.get_vault_components_with_http_info(document=common_parameters.vault_deafult_document)
40+
response = self.components_api.get_vault_components_with_http_info(document=common_parameters.vault_default_document)
4141
component_id = list(response[0].keys())[0]
4242
self.assertEqual(response[1], 200, "Response should be 200 - Success")
4343
self.assertEqual(type(response[0]), dict, "Response should be of dictionary type")
4444
self.assertEqual(type(response[0][component_id]), ComponentSummary, "Response should be of ComponentSummary type")
4545

4646
def test_get_vault_component_by_id(self):
47-
components = self.components_api.get_vault_components(document=common_parameters.vault_deafult_document)
47+
components = self.components_api.get_vault_components(document=common_parameters.vault_default_document)
4848
component_id = list(components.keys())[0]
4949
response = self.components_api.get_vault_component_by_id_with_http_info(component_id)
5050
self.assertEqual(response[1], 200, "Response should be 200 - Success")
@@ -56,7 +56,7 @@ def test_get_vault_component_by_id(self):
5656
######################################################################################
5757

5858
def test_get_all_spar_components(self):
59-
response = self.components_api.get_spar_components_with_http_info(document=common_parameters.spar_deafult_document)
59+
response = self.components_api.get_spar_components_with_http_info(document=common_parameters.spar_default_document)
6060
component_id = list(response[0].keys())[0]
6161
self.assertEqual(response[1], 200, "Response should be 200 - Success")
6262
self.assertEqual(type(response[0]), dict, "Response should be of dictionary type")

Utilities/tests/test_configurations_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ def setUp(self):
1313
self.configurations_api = ConfigurationsApi(CommonFunctions.build_api_client())
1414

1515
def test_get_all_vault_configurations(self):
16-
response = self.configurations_api.get_vault_configurations_with_http_info(account=common_parameters.vault_deafult_account)
16+
response = self.configurations_api.get_vault_configurations_with_http_info(account=common_parameters.vault_default_account)
1717
configuration_id = list(response[0].keys())[0]
1818
self.assertEqual(response[1], 200, "Response code should be 200 - Success")
1919
self.assertEqual(type(response[0]), dict, "Response should be of Dictionary type")
2020
self.assertEqual(type(response[0][configuration_id]), VaultConfigurationSummary, "Response should be of VaultConfigurationSummary type")
2121

2222
def test_get_vault_configuration_by_id(self):
23-
configurations = self.configurations_api.get_vault_configurations(account=common_parameters.vault_deafult_account)
23+
configurations = self.configurations_api.get_vault_configurations(account=common_parameters.vault_default_account)
2424
configuration_id = list(configurations.keys())[0]
2525
response = self.configurations_api.get_vault_configuration_by_id_with_http_info(configuration_id)
2626
self.assertEqual(response[1], 200, "Response code should be 200 - Success")

0 commit comments

Comments
 (0)