Skip to content

Commit 9b3da3d

Browse files
authored
Merge pull request #33 from DevoInc/release-next
Refactoring common.dates, fixing API non-ascii chars and minor fixes
2 parents b74f5ec + f4037a9 commit 9b3da3d

File tree

14 files changed

+308
-262
lines changed

14 files changed

+308
-262
lines changed

.travis.yml

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
language: python
22
python:
33
- '2.7'
4-
- '3.6'
4+
- '3.5'
55
install:
66
- pip install .
77
- pip install pyyaml
88
script:
99
- python run_tests.py
1010
deploy:
11-
provider: pypi
12-
user: worvast
13-
password:
14-
secure: J3YPGEaDHD1H9pVQscrh4J2U18ptq8pM5UsjIKGe6WGlgiTMhR+WYRcdQSFIGSyKZMkdnLavSuvImcUzBSL6L3WqarRZ6HBgGXtxxHRVNmk96ZZlBN5qq0AUJzHN61x5JbG+OWzJMZE1HDo6zcD36KvaIAfKu3AyaEYeVes54PY5cLC/JH/HooOP0FS643kbttkiTYKmEajJiCgu/SiXH5dtfuz5GO0CXrEp0ww+FtcTmC9T9txyjS+IBIvbNPHJC9M5jg6bgu214fCIr5iGNZ8LQulRskBOsqhCRbyyWjuF0wgl3Dkefa0z3YJpl2KYHYW0bT0UY2J8WXnE66NT6js2sv/mNdcRAZjjzugcr9mr11FrLazIjNJwDwlSTtuNoys4E449wQZfQ4vUsUANwnsXQJAdujANS8O2Yuk65uIlgnNpYBxXI71OPYZ6dzhDOsAcwlUrS9jZi2+UWGtOXoZX3i3qLWwBHEASXNSN2WLZOVj3lTEyBB7WCbBqDANHCRLrkyHMrUkOP9ptE7lvATCVfHIO2axsaxNJRKHI6W53p+6uMRAt9u0LIKBB4hyZMo51j7xkq6uO4cQt2CINVU24gYajcalswtJ/Cr0onj26xx2g/xq19sU1L7rpp8OZGFnLPHptxV3ezTlhdk86ZfwOQI1TC4KPAQlRZARDeSk=
15-
on:
16-
tags: true
17-
distributions: "sdist bdist_wheel"
18-
skip_existing: true
11+
- provider: pypi
12+
user: worvast
13+
password:
14+
secure: YdcpCoGTzy1bmjMQH/Lxw5ZdLAlUUHvE7fq2n84BNjz1XiCokpoCKkR1OEC3SGiMNtpy3lJ5YvdHtEzfqmO1mUrwlHT9TyTx/fiKnA5nTWNVxIYtHzhuSL1Z1lopQIHU6QS5FXCXM0ZWs/47X0N7pLKz9V8Pu0g+aeC91swHCEGGDICrEbXFTbMFvJxcHyEIXk2NQ1q0T6cupNOsomQlZfO75SVZMUv/VXp0RpIRfn3qp5Q3XsR6aWP43Jb9IH/4PLLpTfsJpU+1kIsqr55FKy1WTWA89W/E1oXnaf5UK3GbpNuE9qguZn+RwvnRWDg1txvQxJD3tfeKQ5EZqNhB9HbcaYr6USWeA4drE/mVZZePZEMBXT2NSEFEO2dCEMiBBY9feMeTYryJLFgwiHxkc/yM4RnzKLF3MGGcow5IKVpgJYcoNrMS+Mb5/HH8a5E0A+wwHpztCKtOGTV4dGzWsomIPS1kK3FlMTEE1z8bF5ISX9O9dh4P08Uh4YciNShY7GTNvPO13Z7S38YGbDQeijj/Q2SA66zq8vebh37xtJ6BSA54BBFjrkkOBxfi024fsCs30FXvASj8Q2Tkr120VxA5D3OKo29pgWy1357YyCQrWmiLlY3KM/z5XkM0s6hDprirBlquw9+euaoKTBgvJqFb0/pJnqB8E8FBLboKg+A=
15+
on:
16+
tags: true
17+
python: 3.5
18+
distributions: sdist bdist_wheel
19+
skip_existing: true
20+
skip_cleanup: true
21+
- provider: releases
22+
api_key:
23+
secure: pP/ky4BlJNU+tTEW0YSRzj92+CzM8upmnS6bIj4cLlV4crJXlrGs5PA4+07oaILLZxIRyeBR+VFXyebseCffyBPEVFC9GYsxUlq32F0p1HxX9w6LfK8Zf/FNQCdtcN62ahM3ZbuAQBftNtldQ885SwyjHVJo4ZUAjMvr4nB8+ZqAF8Oykgx0R24yVeq1N3TQbRF8nTbwcTgoXP37r0Pkuq6ljve3lV5SZi56a4h1aOSPxNAknBX9xz7Avv/NfgkZ7R+f+mk3juBZuPov02+3P7xHtCUi8yo/bNi96ufwXiWD9xZPjZDOK3owV9iwWR2E/MDcOpORvIh8Rim7i3kMx7vDOIDR3yyYR36FTh2DIbQVRLKxCix8uESxVy84DpaWEaCOzn0jx4ddD/+EGBVRTjWqddF3Pu5+cKFCx7BYKlIDNPtYq3fIfsUKqoA7OaqJAIbk5N+Fl6jaDbbui2FCZN8LymwzpOKHv68ILztDLGIDUd4u6NpJMMHjF4xdp1tSkLyVEIE9cmrWJFom4J2STh8Ji6bODUY2vNK2vvxohJ/Cp5qBXd4VvegZGQu6xmV8EBEtqHX7UO9uY308SIV9wtwSTKswJyoptkJLPgeFnA/gCdc26MFvfo5Lxo1Etx1W8nXJIfkMo103xEuybGW2U4A7KDcZXvjdnOR6oHKhtkE=
24+
file: dist/devo_sdk-*.whl
25+
on:
26+
repo: Devo/python-sdk

CHANGELOG.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## [1.6.1] - 2019-01-10
8+
#### Changed
9+
* Refactoring of devo.common.dates from objects to simple functions
10+
* Now API return bytes in Python 3 and str in Python 2 by default
11+
12+
#### Fixed
13+
* Problems with non ascii/utf-8 characters in API
14+
* Travis CI autodeploy to pypi
15+
16+
#### Added
17+
* Travis CI upload wheel to release on github
18+
719
## [1.6.0] - 2019-01-09
820
#### Changed
921
* Mild refactoring of Sender class
@@ -14,8 +26,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1426
#### Fixed
1527
* API responses blank lines and splitted lines
1628
* Problems with API CLI and automatic shutdowns
17-
18-
29+
1930
## [1.5.1] - 2018-12-28
2031
#### Fixed
2132
* devo.common buffer now receive data when CSV response

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
[![master Build Status](https://travis-ci.com/DevoInc/python-sdk.svg?branch=master)](https://travis-ci.com/DevoInc/python-sdk) [![LICENSE](https://img.shields.io/dub/l/vibe-d.svg)](https://github.com/DevoInc/python-sdk/blob/master/LICENSE)
33

4-
[![wheel](https://img.shields.io/badge/wheel-yes-brightgreen.svg)](https://pypi.org/project/devo-sdk/) [![version](https://img.shields.io/badge/version-1.6.0-blue.svg)](https://pypi.org/project/devo-sdk/) [![python](https://img.shields.io/badge/python-2.7%20%7C%203.3%20%7C%203.4%20%7C%203.5%20%7C%203.6%20%7C%203.7-blue.svg)](https://pypi.org/project/devo-sdk/)
4+
[![wheel](https://img.shields.io/badge/wheel-yes-brightgreen.svg)](https://pypi.org/project/devo-sdk/) [![version](https://img.shields.io/badge/version-1.6.1-blue.svg)](https://pypi.org/project/devo-sdk/) [![python](https://img.shields.io/badge/python-2.7%20%7C%203.3%20%7C%203.4%20%7C%203.5%20%7C%203.6%20%7C%203.7-blue.svg)](https://pypi.org/project/devo-sdk/)
55

66

77
# Devo Python SDK

devo/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
__description__ = 'Devo Python Library.'
22
__url__ = 'http://www.devo.com'
3-
__version__ = "1.6.0"
3+
__version__ = "1.6.1"
44
__author__ = 'Devo'
55
__author_email__ = 'support@devo.com'
66
__license__ = 'MIT'

devo/api/client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import ssl
99
import sys
1010
import requests
11-
from devo.common import DateParser, Buffer
11+
from devo.common import Buffer, default_from, default_to
1212

1313
PY3 = sys.version_info[0] > 2
1414

@@ -272,7 +272,7 @@ def _call_stream(self, payload=None):
272272
self.socket.recv(4096))
273273
if result:
274274
try:
275-
while self.buffer.decode(self.socket.recv(4096)):
275+
while self.buffer.buffering(self.socket.recv(4096)):
276276
pass
277277
except socket.timeout:
278278
while not self.buffer.is_empty() or self.buffer.close:
@@ -293,8 +293,8 @@ def _get_payload(query, query_id, dates, opts):
293293
:param opts: destination -> Destination for the results
294294
:return: Return the formed payload
295295
"""
296-
payload = {"from": int(DateParser.default_from(dates['from']) / 1000),
297-
"to": int(DateParser.default_to(dates['to']) / 1000) if
296+
payload = {"from": int(default_from(dates['from']) / 1000),
297+
"to": int(default_to(dates['to']) / 1000) if
298298
dates['to'] is not None else None,
299299
"mode": {"type": opts['response']}}
300300

devo/common/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
from .dates.dateparser import DateParser
1+
from .dates.dateparser import parse, parse_string, parse_expression, default_from, \
2+
default_to
3+
from .dates.dateoperations import month, week, day, hour, minute, second, now, \
4+
now_without_ms, today, yesterday, parse_functions
5+
from .dates.dateutils import to_millis, trunc_time, trunc_time_minute, \
6+
test_date_format, get_timestamp
27
from .generic.configuration import Configuration
38
from .logging.log import get_log, set_formatter, set_handler
49
from .data import Buffer, ChainDict

devo/common/data/buffer.py

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# -*- coding: utf-8 -*-
22
"""Simple Buffer generic class for use of some package functions."""
33
from threading import Thread
4+
from sys import version_info
5+
46

57
try:
68
import Queue
@@ -13,18 +15,38 @@ class DevoBufferException(Exception):
1315
pass
1416

1517

18+
def clrf():
19+
"""clrf character in"""
20+
return b"\r\n" if version_info[0] > 2 else "\r\n"
21+
22+
23+
def get_response_split(api_response):
24+
"""Get split for each event, if csv or other, and in bytes or str"""
25+
if version_info[0] > 2:
26+
return b"\n" if api_response is "csv" else b"\r\n"
27+
else:
28+
return "\n" if api_response is "csv" else "\r\n"
29+
30+
31+
def empty():
32+
"""Empty string in bytes or str if py2 or py3"""
33+
return bytes() if version_info[0] > 2 else str()
34+
35+
1636
class Buffer(object):
1737
""" Simple Buffer class """
1838
def __init__(self, buffer_max_size=1000, api_response="json/compact"):
1939
self.queue = Queue.Queue(maxsize=buffer_max_size)
2040
self.thread = None
21-
self.temp = ""
22-
self.temp_event = ""
41+
self.temp = empty()
42+
self.temp_event = empty()
43+
self.response_split = get_response_split(api_response)
44+
self.clrf = clrf()
2345
self.octet = 0
2446
self.error = None
2547
self.close = False
2648
self.timeout = None
27-
self.response_split = "\n" if api_response is "csv" else "\r\n"
49+
self.api_response = api_response
2850

2951
def is_alive(self):
3052
return self.thread.isAlive()
@@ -61,30 +83,28 @@ def get(self, processor=None, block=True, timeout=None):
6183

6284
def process_first_line(self, data):
6385
""" process first line of the Query call (For delete headers) """
64-
if not isinstance(data, str):
65-
data = data.decode('utf8')
6686

67-
if "200 OK" in data.split("\r\n\r\n")[0]:
68-
return self.decode(data[data.find("\r\n\r\n")+4:]), None
87+
if version_info[0] > 2:
88+
ok = b"200 OK"
89+
else:
90+
ok = "200 OK"
91+
92+
if ok in data.split(self.clrf+self.clrf)[0]:
93+
return self.buffering(data[data.find(self.clrf+self.clrf)+4:]), None
6994

7095
self.error = data
7196
return False, data
7297

73-
def decode(self, data):
74-
if not isinstance(data, str):
75-
data = data.decode('utf8')
76-
return self.buffering(data)
77-
7898
def buffering(self, data):
7999
if not self.octet:
80-
pointer = data.find("\r\n") + 2
100+
pointer = data.find(self.clrf) + 2
81101
size = int(data[:pointer], 16)
82102
data = self.temp_event + data[pointer:]
83103
self.octet = len(self.temp_event) + size
84-
self.temp_event = ""
104+
self.temp_event = empty()
85105

86106
if len(self.temp + data) < self.octet or \
87-
(not self.octet and not data.find("\r\n")):
107+
(not self.octet and not data.find(self.clrf)):
88108
self.temp += data
89109
return not self.close
90110

@@ -108,11 +128,8 @@ def process_recv(self, data):
108128
self.octet = 0
109129
if len(self.temp.strip()):
110130
data = self.temp
111-
self.temp = ""
112-
if data.find("\r\n") == 0:
131+
self.temp = empty()
132+
if data.find(self.clrf) == 0:
113133
data = data[2:]
114134
return self.buffering(data)
115135
return not self.close
116-
117-
def close(self):
118-
self.close = True

devo/common/dates/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1-
from .dateparser import DateParser
2-
from .dateoperations import DateOperations
3-
from .dateutils import DateUtils
1+
from .dateparser import parse, parse_string, parse_expression, default_from, \
2+
default_to
3+
from .dateoperations import month, week, day, hour, minute, second, now, \
4+
now_without_ms, today, yesterday, parse_functions
5+
from .dateutils import to_millis, trunc_time, trunc_time_minute, \
6+
test_date_format, get_timestamp

0 commit comments

Comments
 (0)