Skip to content

Commit 8eff098

Browse files
Merge pull request #80 from skyflowapi/release/23.6.1
Release/23.6.1
2 parents 442a7d7 + dbac352 commit 8eff098

File tree

12 files changed

+189
-18
lines changed

12 files changed

+189
-18
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
- "setup.py"
88
- "*.yml"
99
- "*.md"
10+
- "version.py"
1011

1112
jobs:
1213
build-and-deploy:
@@ -39,6 +40,7 @@ jobs:
3940
git config user.name ${{ github.actor }}
4041
git config user.email ${{ github.actor }}@users.noreply.github.com
4142
git add setup.py
43+
git add version.py
4244
git commit -m "[AUTOMATED] Public Release - ${{ steps.previoustag.outputs.tag }}"
4345
git push origin
4446

ci-scripts/bump_version.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ then
66
echo "Bumping package version to $1"
77

88
sed -E "s/current_version = .+/current_version = \'$SEMVER\'/g" setup.py > tempfile && cat tempfile > setup.py && rm -f tempfile
9+
sed -E "s/SDK_VERSION = .+/SDK_VERSION = \'$SEMVER\'/g" version.py > tempfile && cat tempfile > version.py && rm -f tempfile
10+
911
echo --------------------------
1012
echo "Done, Package now at $1"
1113

1214
else
1315
echo "Bumping package version to $1-dev.$2"
1416

1517
sed -E "s/current_version = .+/current_version = \'$SEMVER-dev.$2\'/g" setup.py > tempfile && cat tempfile > setup.py && rm -f tempfile
18+
sed -E "s/SDK_VERSION = .+/SDK_VERSION = \'$SEMVER-dev.$2\'/g" version.py > tempfile && cat tempfile > version.py && rm -f tempfile
1619

1720
echo --------------------------
1821
echo "Done, Package now at $1-dev.$2"

skyflow/_utils.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import urllib.parse
55
import logging
66
from enum import Enum
7+
import platform
8+
import sys
9+
from version import SDK_VERSION
710

811
skyflowLog = logging.getLogger('skyflow')
912
skyflowLog.setLevel(logging.ERROR)
@@ -127,3 +130,31 @@ def render_key(parents):
127130
outStr += s % str(x)
128131
depth += 1
129132
return outStr
133+
134+
def getMetrics():
135+
''' fetch metrics
136+
'''
137+
sdk_name_version = "skyflow-python@" + SDK_VERSION
138+
139+
try:
140+
sdk_client_device_model = platform.node()
141+
except Exception:
142+
sdk_client_device_model = ""
143+
144+
try:
145+
sdk_client_os_details = sys.platform
146+
except Exception:
147+
sdk_client_os_details = ""
148+
149+
try:
150+
sdk_runtime_details = sys.version
151+
except Exception:
152+
sdk_runtime_details = ""
153+
154+
details_dic = {
155+
'sdk_name_version': sdk_name_version,
156+
'sdk_client_device_model': sdk_client_device_model,
157+
'sdk_client_os_details': sdk_client_os_details,
158+
'sdk_runtime_details': "Python " + sdk_runtime_details,
159+
}
160+
return details_dic

skyflow/service_account/_token.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import requests
88
from warnings import warn
99
from collections import namedtuple
10-
from skyflow._utils import log_info, InterfaceName, InfoMessages
10+
from skyflow._utils import log_info, InterfaceName, InfoMessages, getMetrics
1111

1212

1313
from skyflow.errors._skyflow_errors import *
@@ -126,7 +126,8 @@ def getSignedJWT(clientID, keyID, tokenURI, privateKey):
126126

127127
def sendRequestWithToken(url, token):
128128
headers = {
129-
"content-type": "application/json"
129+
"content-type": "application/json",
130+
"sky-metadata": json.dumps(getMetrics())
130131
}
131132
payload = {
132133
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",

skyflow/vault/_client.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'''
22
Copyright (c) 2022 Skyflow, Inc.
33
'''
4+
import json
45
import types
56
import requests
67
from ._insert import getInsertRequestBody, processResponse, convertResponse
@@ -13,7 +14,7 @@
1314
from ._get import sendGetRequests
1415
import asyncio
1516
from skyflow.errors._skyflow_errors import SkyflowError, SkyflowErrorCodes, SkyflowErrorMessages
16-
from skyflow._utils import log_info, InfoMessages, InterfaceName
17+
from skyflow._utils import log_info, InfoMessages, InterfaceName, getMetrics
1718
from ._token import tokenProviderWrapper
1819

1920

@@ -52,7 +53,8 @@ def insert(self, records: dict, options: InsertOptions = InsertOptions()):
5253
self.storedToken = tokenProviderWrapper(
5354
self.storedToken, self.tokenProvider, interface)
5455
headers = {
55-
"Authorization": "Bearer " + self.storedToken
56+
"Authorization": "Bearer " + self.storedToken,
57+
"sky-metadata": json.dumps(getMetrics())
5658
}
5759

5860
response = requests.post(requestURL, data=jsonBody, headers=headers)
@@ -131,6 +133,8 @@ def invoke_connection(self, config: ConnectionConfig):
131133
if not 'X-Skyflow-Authorization'.lower() in request.headers:
132134
request.headers['x-skyflow-authorization'] = self.storedToken
133135

136+
request.headers['sky-metadata'] = json.dumps(getMetrics())
137+
134138
response = session.send(request)
135139
session.close()
136140
return processResponse(response, interface=interface)

skyflow/vault/_detokenize.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import asyncio
66
from aiohttp import ClientSession, request
77
import json
8-
from skyflow._utils import InterfaceName
8+
from ._config import RedactionType
9+
from skyflow._utils import InterfaceName, getMetrics
910

1011
interface = InterfaceName.DETOKENIZE.value
1112

@@ -15,14 +16,27 @@ def getDetokenizeRequestBody(data):
1516
token = data["token"]
1617
except KeyError:
1718
raise SkyflowError(SkyflowErrorCodes.INVALID_INPUT,
18-
SkyflowErrorMessages.TOKEN_KEY_ERROR, interface=interface)
19+
SkyflowErrorMessages.TOKEN_KEY_ERROR, interface=interface)
1920
if not isinstance(token, str):
2021
tokenType = str(type(token))
2122
raise SkyflowError(SkyflowErrorCodes.INVALID_INPUT, SkyflowErrorMessages.INVALID_TOKEN_TYPE.value % (
2223
tokenType), interface=interface)
24+
25+
if "redaction" in data:
26+
if not isinstance(data["redaction"], RedactionType):
27+
redactionType = str(type(data["redaction"]))
28+
raise SkyflowError(SkyflowErrorCodes.INVALID_INPUT, SkyflowErrorMessages.INVALID_REDACTION_TYPE.value % (
29+
redactionType), interface=interface)
30+
else:
31+
redactionType = data["redaction"]
32+
else:
33+
redactionType = RedactionType.PLAIN_TEXT
34+
2335
requestBody = {"detokenizationParameters": []}
2436
requestBody["detokenizationParameters"].append({
25-
"token": token})
37+
"token": token,
38+
"redaction": redactionType.value
39+
})
2640
return requestBody
2741

2842

@@ -39,7 +53,6 @@ async def sendDetokenizeRequests(data, url, token):
3953
recordsType = str(type(records))
4054
raise SkyflowError(SkyflowErrorCodes.INVALID_INPUT, SkyflowErrorMessages.INVALID_RECORDS_TYPE.value % (
4155
recordsType), interface=interface)
42-
4356
validatedRecords = []
4457
for record in records:
4558
requestBody = getDetokenizeRequestBody(record)
@@ -48,7 +61,9 @@ async def sendDetokenizeRequests(data, url, token):
4861
async with ClientSession() as session:
4962
for record in validatedRecords:
5063
headers = {
51-
"Authorization": "Bearer " + token
64+
"Authorization": "Bearer " + token,
65+
"sky-metadata": json.dumps(getMetrics())
66+
5267
}
5368
task = asyncio.ensure_future(post(url, record, headers, session))
5469
tasks.append(task)

skyflow/vault/_get.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
'''
22
Copyright (c) 2022 Skyflow, Inc.
33
'''
4+
import json
45
from skyflow.errors._skyflow_errors import SkyflowError, SkyflowErrorCodes, SkyflowErrorMessages
56
import asyncio
67
from aiohttp import ClientSession
78
from ._config import RedactionType
8-
from skyflow._utils import InterfaceName
9+
from skyflow._utils import InterfaceName, getMetrics
910
from ._get_by_id import get
1011

1112
interface = InterfaceName.GET.value
@@ -83,7 +84,8 @@ async def sendGetRequests(data, url, token):
8384
async with ClientSession() as session:
8485
for record in validatedRecords:
8586
headers = {
86-
"Authorization": "Bearer " + token
87+
"Authorization": "Bearer " + token,
88+
"sky-metadata": json.dumps(getMetrics())
8789
}
8890
params = {"redaction": redaction}
8991
if ids is not None:

skyflow/vault/_get_by_id.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from aiohttp import ClientSession
77
import json
88
from ._config import RedactionType
9-
from skyflow._utils import InterfaceName
9+
from skyflow._utils import InterfaceName, getMetrics
1010

1111
interface = InterfaceName.GET_BY_ID.value
1212

@@ -66,7 +66,8 @@ async def sendGetByIdRequests(data, url, token):
6666
async with ClientSession() as session:
6767
for record in validatedRecords:
6868
headers = {
69-
"Authorization": "Bearer " + token
69+
"Authorization": "Bearer " + token,
70+
"sky-metadata": json.dumps(getMetrics())
7071
}
7172
params = {"skyflow_ids": record[0], "redaction": record[2]}
7273
task = asyncio.ensure_future(

skyflow/vault/_update.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import asyncio
77
from skyflow.errors._skyflow_errors import SkyflowError, SkyflowErrorCodes, SkyflowErrorMessages
88
from ._insert import getTableAndFields
9-
from skyflow._utils import InterfaceName
9+
from skyflow._utils import InterfaceName, getMetrics
1010
from aiohttp import ClientSession
1111
from ._config import UpdateOptions
1212

@@ -40,7 +40,8 @@ async def sendUpdateRequests(data,options: UpdateOptions,url,token):
4040
}
4141
reqBody = json.dumps(reqBody)
4242
headers = {
43-
"Authorization": "Bearer " + token
43+
"Authorization": "Bearer " + token,
44+
"sky-metadata": json.dumps(getMetrics())
4445
}
4546
task = asyncio.ensure_future(put(recordUrl, reqBody, headers, session))
4647
tasks.append(task)

tests/vault/test_detokenize.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from skyflow.errors._skyflow_errors import SkyflowError, SkyflowErrorCodes, SkyflowErrorMessages
88
from skyflow.vault._client import Client, Configuration
99
from skyflow.service_account import generate_bearer_token
10+
from skyflow.vault._config import RedactionType
1011
from dotenv import dotenv_values
1112
import warnings
1213

@@ -55,7 +56,8 @@ def testGetDetokenizeRequestBodyWithValidBody(self):
5556
body = getDetokenizeRequestBody(self.tokenField)
5657
expectedOutput = {
5758
"detokenizationParameters": [{
58-
"token": self.testToken
59+
"token": self.testToken,
60+
"redaction": "PLAIN_TEXT"
5961
}]
6062
}
6163

@@ -101,6 +103,15 @@ def testDetokenizeTokenInvalidType(self):
101103
self.assertEqual(
102104
e.message, SkyflowErrorMessages.INVALID_TOKEN_TYPE.value % (list))
103105

106+
def testDetokenizeRedactionInvalidType(self):
107+
invalidData = {"records": [{"token": "valid", "redaction": 'demo'}]}
108+
try:
109+
self.client.detokenize(invalidData)
110+
except SkyflowError as error:
111+
self.assertTrue(error)
112+
self.assertEqual(error.code, SkyflowErrorCodes.INVALID_INPUT.value)
113+
self.assertEqual(error.message, SkyflowErrorMessages.INVALID_REDACTION_TYPE.value % str(type("demo")))
114+
104115
def testResponseBodySuccess(self):
105116
response = {"records": [{"token": "abc", "value": "secret"}]}
106117
self.add_mock_response(response, 200)
@@ -135,3 +146,39 @@ def testResponseNotJson(self):
135146
self.assertEqual(error.code, 200)
136147
self.assertEqual(error.message, expectedError.value %
137148
response.decode('utf-8'))
149+
150+
def testRequestBodyNoRedactionKey(self):
151+
expectedOutput = {
152+
"detokenizationParameters": [{
153+
"token": self.testToken,
154+
"redaction": "PLAIN_TEXT"
155+
}]
156+
}
157+
requestBody = getDetokenizeRequestBody(self.tokenField)
158+
self.assertEqual(requestBody, expectedOutput)
159+
160+
def testRequestBodyWithValidRedaction(self):
161+
expectedOutput = {
162+
"detokenizationParameters": [{
163+
"token": self.testToken,
164+
"redaction": "REDACTED"
165+
}]
166+
}
167+
data = {
168+
"token": self.testToken,
169+
"redaction": RedactionType.REDACTED
170+
}
171+
requestBody = getDetokenizeRequestBody(data)
172+
self.assertEqual(expectedOutput, requestBody)
173+
174+
def testRequestBodyWithInValidRedaction(self):
175+
data = {
176+
"token": self.testToken,
177+
"redaction": "123"
178+
}
179+
try:
180+
getDetokenizeRequestBody(data)
181+
except SkyflowError as error:
182+
self.assertTrue(error)
183+
self.assertEqual(error.code, SkyflowErrorCodes.INVALID_INPUT.value)
184+
self.assertEqual(error.message, SkyflowErrorMessages.INVALID_REDACTION_TYPE.value % str(type(data["redaction"])))

0 commit comments

Comments
 (0)