Skip to content

Commit 9e1f72d

Browse files
authored
Merge pull request #25 from DevoInc/release-next
Version 1.5.0 to Master
2 parents 215ee58 + dbdbd12 commit 9e1f72d

File tree

13 files changed

+252
-191
lines changed

13 files changed

+252
-191
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ environment.env
66
tests_results/*
77
!tests_results/.gitkeep
88
!local_server_files/*
9+
check_list.txt
910

1011
.idea
1112
# Byte-compiled / optimized / DLL files

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ 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.5.0]
8+
#### Changed
9+
* Modify Configuration loads functions
10+
* Now Sender send, send_raw, flush_buffer and fill_buffer return the number of lines sent
11+
12+
#### Fixed
13+
* Problems when loads configuration from default sites
14+
* Problems with local_server
15+
716
## [1.4.0]
817
#### Added
918
* Allow the parameters user, application name and comment to queries

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.3.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.5.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/)
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.4.0"
3+
__version__ = "1.5.0"
44
__author__ = 'Devo'
55
__author_email__ = 'support@devo.com'
66
__license__ = 'MIT'

devo/api/scripts/client_cli.py

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ def cli():
2222

2323

2424
@cli.command()
25-
@click.option('--config', '-c', type=click.Path(),
26-
help='JSON/Yaml File with configuration,'
27-
' you can put all options here',
28-
default="~/.devo.json")
25+
@click.option('--config', '-c', type=click.Path(exists=True),
26+
help='Optional JSON/Yaml File with configuration info.')
27+
@click.option('--env', '-e', help='Use env vars for configuration',
28+
default=False)
29+
@click.option('--default', '-d', help='Use default file for configuration',
30+
default=False)
2931
@click.option('--url', '-u', help='Endpoint for the api.')
3032
@click.option('--user', '-user', help='User for the api.')
3133
@click.option('--app_name', '-app_name', help='Application name for the api.')
@@ -46,10 +48,10 @@ def cli():
4648
'stdout')
4749
@click.option('--format', '-f', default="json/simple/compact",
4850
help='The output format. Default is json/simple/compact')
49-
@click.option('--from',
51+
@click.option('--from', default=None,
5052
help='From date, and time for the query (YYYY-MM-DD hh:mm:ss). '
5153
'For valid formats see lt-common README')
52-
@click.option('--to',
54+
@click.option('--to', default=None,
5355
help='To date, and time for the query (YYYY-MM-DD hh:mm:ss). '
5456
'For valid formats see lt-common README')
5557
def query(**kwargs):
@@ -132,38 +134,30 @@ def configure(args):
132134
:return: Client API Object and Config values in array
133135
"""
134136
config = Configuration()
135-
if args.get('config') != "~/.devo.json":
136-
config.load_config(args.get('config'), 'api')
137-
138-
config.mix(dict(args))
137+
try:
138+
if args.get('config'):
139+
config.load_config(args.get('config'), 'api')
139140

140-
if "key" not in args.keys() and "api" not in args.keys() \
141-
and "token" not in args.keys():
142-
config.set("key", os.environ.get('DEVO_API_KEY', None))
143-
config.set("secret", os.environ.get('DEVO_API_SECRET', None))
144-
if "url" not in args.keys():
141+
if args.get('env'):
142+
config.set("key", os.environ.get('DEVO_API_KEY', None))
143+
config.set("secret", os.environ.get('DEVO_API_SECRET', None))
145144
config.set("url", os.environ.get('DEVO_API_URL', None))
145+
config.set("user", os.environ.get('DEVO_API_USER', None))
146+
config.set("comment", os.environ.get('DEVO_API_COMMENT', None))
146147

147-
if "user" not in args.keys():
148-
config.set("user", os.environ.get('DEVO_API_USER', None))
149-
if "comment" not in args.keys():
150-
config.set("comment", os.environ.get('DEVO_API_COMMENT', None))
151-
152-
if not config.keys("key") and not config.keys("api") \
153-
and not config.keys("token") \
154-
and os.path.exists("~/.devo.json"):
155-
config.load_default_json('api')
156-
157-
config.keys('from')
158-
config.keys('to')
148+
if args.get('default'):
149+
config.load_default_config(section="api")
150+
finally:
151+
config.mix(dict(args))
152+
conf = config.get()
159153

160154
# Try to compose the api
161155
api = None
162156
try:
163-
api = Client.from_config(config.get())
157+
api = Client.from_config(conf)
164158
except DevoClientException as error:
165159
print_error(str(error), show_help=True)
166-
return api, config.get()
160+
return api, conf
167161

168162

169163
def print_error(error, show_help=False, stop=True):

devo/common/generic/configuration.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
""" Util for load generic config file in devo standars"""
33
import json
44
import sys
5+
import os
6+
57

68
class ConfigurationException(Exception):
79
""" Default Configuration Exception """
810
pass
911

12+
1013
class Configuration(object):
1114
"""
1215
Main class for load config files, and extract config objects
@@ -71,7 +74,17 @@ def load_config(self, path, section=None):
7174

7275
raise ConfigurationException("Configuration file type unknown or not supportted: %s" %path)
7376

74-
def load_default_config(self, ext="yml", section=None):
77+
@staticmethod
78+
def __search_default_config_file():
79+
return "json" if os.path.exists(os.path.expanduser("~/.devo.json")) \
80+
else "yaml" if os.path.exists(os.path.expanduser("~/.devo.yaml")) \
81+
else "yml" if os.path.exists(os.path.expanduser("~/.devo.yml")) \
82+
else None
83+
84+
def load_default_config(self, ext=None, section=None):
85+
if not ext:
86+
ext = self.__search_default_config_file()
87+
7588
if ext is "yml" or ext is "yaml":
7689
return self.load_yaml("~/.devo.%s" % ext, section)
7790
elif ext is "json":
@@ -151,7 +164,7 @@ def set(self, key_list, value):
151164
if value:
152165
if not isinstance(key_list, list):
153166
key_list = [key_list]
154-
self.set_key_chain(self, key_list, value)
167+
self.cfg = self.set_key_chain(self.cfg, key_list, value)
155168

156169
@staticmethod
157170
def set_key_chain(aux_dict, key_list, value):

devo/sender/data.py

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
class DevoSenderException(Exception):
2222
""" Default Devo Sender Exception """
23-
pass
2423

2524

2625
class SenderConfigSSL:
@@ -121,7 +120,6 @@ def __init__(self, config=None, **kwargs):
121120
logger = kwargs.get('logger', None)
122121
tag = kwargs.get('tag', None)
123122

124-
125123
logging.Handler.__init__(self)
126124
self.logger = self.__set_logger(verbose_level) if logger is None \
127125
else logger
@@ -134,6 +132,7 @@ def __init__(self, config=None, **kwargs):
134132
self.max_zip_buffer = 19500
135133
self.compression_level = -1
136134
self.zip_buffer = b''
135+
self.zip_events = 0
137136
self.composed_msg = b''
138137
self.facility = facility
139138

@@ -210,8 +209,8 @@ def __connect_ssl(self):
210209
except socket.error as error:
211210
self.close()
212211
raise DevoSenderException(
213-
"Devo-Sender|SSL conn establishment socket error: %s" % str(error))
214-
212+
"Devo-Sender|SSL conn establishment socket error: %s" %
213+
str(error))
215214

216215
def info(self, msg):
217216
"""
@@ -261,12 +260,27 @@ def __encode_record(record):
261260

262261
return record
263262

263+
def __send_oc(self, record):
264+
msg_size = len(record)
265+
sent = 0
266+
total = int(msg_size / 4096)
267+
if msg_size % 4096 > 0:
268+
total += 1
269+
for iteration in range(0, total):
270+
sent += self.socket.send(
271+
record[int(iteration * 4096):
272+
int((iteration + 1) * 4096)])
273+
if sent == 0:
274+
raise DevoSenderException("Devo-Sender|Send error")
275+
return False
276+
return True
277+
264278
def send_raw(self, record, multiline=False, zip=False):
265279
"""
266280
Send raw messages to the collector
267281
268282
>>>con.send_raw('<14>Jan 1 00:00:00 MacBook-Pro-de-X.local'
269-
... 'my.app.devo_sender.test: txt Prueba')
283+
... 'my.app.devo_sender.test: txt test')
270284
271285
"""
272286
try:
@@ -277,30 +291,23 @@ def send_raw(self, record, multiline=False, zip=False):
277291
try:
278292
if not multiline and not zip:
279293
sent = self.socket.send(self.__encode_record(record))
294+
return 1
280295
else:
281296
if multiline:
282297
record = self.__encode_record(record)
283298

284-
msg_size = len(record)
285-
sent = 0
286-
total = int(msg_size / 4096)
287-
if msg_size % 4096 > 0:
288-
total += 1
289-
for iteration in range(0, total):
290-
sent += self.socket.send(
291-
record[int(iteration * 4096):
292-
int((iteration + 1) * 4096)])
293-
294-
if sent == 0:
295-
raise DevoSenderException("Devo-Sender|Send error")
296-
297-
if self._sender_config.debug:
298-
self.logger.debug('sent|%d|size|%d|msg|%s' %
299-
(sent, len(record), record))
299+
if self.__send_oc(record):
300+
return 1
301+
return 0
300302
except socket.error:
301303
self.close()
302304
raise DevoSenderException(
303305
"Devo-Sender|Socket error: %s" % str(socket.error))
306+
finally:
307+
if self._sender_config.debug:
308+
self.logger.debug('sent|%d|size|%d|msg|%s' %
309+
(sent, len(record), record))
310+
304311
except Exception as error:
305312
raise error
306313

@@ -352,14 +359,14 @@ def send(self, tag, msg, **kwargs):
352359
:param kwargs: date -> String Date format '%Y-%m-%d %H%M%S'
353360
354361
355-
>>>con.send(tag='my.app.devo_sender.test', msg='prueba mensaje')
362+
>>>con.send(tag='my.app.devo_sender.test', msg='test of msg')
356363
See Also:
357364
send_raw
358365
"""
359366
if isinstance(msg, bytes):
360-
self.send_bytes(tag, msg, **kwargs)
367+
return self.send_bytes(tag, msg, **kwargs)
361368
else:
362-
self.send_str(tag, msg, **kwargs)
369+
return self.send_str(tag, msg, **kwargs)
363370

364371
def send_str(self, tag, msg, **kwargs):
365372
"""
@@ -369,24 +376,24 @@ def send_str(self, tag, msg, **kwargs):
369376
msg += "\n"
370377

371378
msg = COMPOSE % (self.compose_mem(tag, **kwargs), msg)
372-
self.send_raw(msg, multiline=kwargs.get('multiline', False))
379+
return self.send_raw(msg, multiline=kwargs.get('multiline', False))
373380

374381
def send_bytes(self, tag, msg, **kwargs):
375382
"""
376383
Send function when bytes, sure py3x. Can be zipped
377384
"""
378385
msg = COMPOSE_BYTES % (self.compose_mem(tag, bytes=True, **kwargs), msg)
379386
if kwargs.get('zip', False):
380-
self.fill_buffer(msg)
387+
return self.fill_buffer(msg)
381388
else:
382389
if msg[-1:] != b"\n":
383390
msg += b"\n"
384391

385-
self.send_raw(msg, multiline=kwargs.get('multiline', False))
392+
return self.send_raw(msg, multiline=kwargs.get('multiline', False))
386393

387394
def fill_buffer(self, msg):
388395
"""
389-
Internal method for fill buffer for be zipped and sended
396+
Internal method for fill buffer for be zipped and sent
390397
:param msg: bytes
391398
:return: None
392399
"""
@@ -395,19 +402,29 @@ def fill_buffer(self, msg):
395402

396403
self.zip_buffer += msg
397404
if len(self.zip_buffer) > self.max_zip_buffer:
398-
self.flush_buffer()
405+
return self.flush_buffer()
406+
407+
self.zip_events += 1
408+
return 0
399409

400410
def flush_buffer(self):
401411
"""
402-
Method for flush-send buffer, its zipped and sended now
412+
Method for flush-send buffer, its zipped and sent now
403413
:return: None
404414
"""
405415
if self.zip_buffer:
406-
compressor = zlib.compressobj(self.compression_level,
407-
zlib.DEFLATED, 31)
408-
record = compressor.compress(self.zip_buffer) + compressor.flush()
409-
self.send_raw(record, zip=True)
410-
self.zip_buffer = b''
416+
try:
417+
compressor = zlib.compressobj(self.compression_level,
418+
zlib.DEFLATED, 31)
419+
record = compressor.compress(self.zip_buffer) + compressor.flush()
420+
if self.send_raw(record, zip=True):
421+
return self.zip_events
422+
return 0
423+
except Exception as error:
424+
raise error
425+
finally:
426+
self.zip_buffer = b''
427+
self.zip_events = 0
411428

412429
def set_logger_tag(self, tag):
413430
"""

devo/sender/lookup.py

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

1010
class Lookup:
1111
""" Main class Lookup for create and send the object from some sources """
12-
# Type of the header sended
12+
# Type of the header sent
1313
# - EVENT_START for START header
1414
# - EVENT_END for END header
1515
EVENT_START = 'START'

0 commit comments

Comments
 (0)