Flawless 0.9 Download
Find Flawless Complexion software downloads at CNET Download.com, the most comprehensive source for safe, trusted, and spyware-free downloads on the Web.
Latest versionReleased:
Python Error Monitoring and Reporting
Project description
Flawless
Flawless is a simple Python framework developed at shopkick for detecting bugs in a production
environment. Flawless traps exceptions and then sends an email to the developer responsible
for causing the exception. Flawless integrates with git and uses git-blame to determine which
developer to email.
Project website: http://shopkick.github.com/flawless/
Why You Should Use Flawless
---------------------------
* Only sends 1 email per line of code. Even if a particular line of code causes thousands of
exceptions, only one email will be sent.
* Only emails 1 developer. Flawless uses git-blame to figure out which developer is responsible
for a particular exception, and will only email that developer.
* Flawless logs the values of every variable in the stack frame at the time the exception
occurred. This makes debugging ten times faster.
* Don't report exceptions in old code. If you set report_only_after_minimum_date, then
Flawless will only report exceptions caused by code modified after
report_only_after_minimum_date.
* Don't alert on library code. You can mark certain files/functions as library code, and when an
exception originates in those files/functions, the caller will be blamed for the error instead
of the library code.
4 Step Setup Guide
------------------
1. Install Flawless. After this step you should have an executable named flawless in your path.
$> python setup.py install
2. Setup the Flawless server. Go to the server which you want to host the Flawless backend. Then
use the following command to start a short questionnaire to setup the server.
$> flawless configure
3. Start the Flawless server
$> flawless start -conf path/to/flawless.cfg
4. Integrate the Flawless client into your code. If you are running a WSGI application such as
django or pylons/pyramid, simply add the flawless.client.middleware to your application. Otherwise
you can wrap particular functions or entire classes by using flawless.client.decorators. View the
examples directory for some actual code examples.
How it Works
------------
The Flawless client wraps your code with a try/except block. When an exception is caught it then
sends the entire traceback to the Flawless server. The Flawless server then aggregates exception
reports from clients and figures out which line of code caused the exception. Once the line that
caused the exception is identified, Flawless runs 'git blame' to determine the email address of
the developer that last touched that line of code. Flawless then sends the developer an email with
the traceback.
Exceptions can be whitelisted if they are expected. To whitelist an exception you must specify
the filename, function name, and the text from the line of code being whitelisted in the appropriate
config file. Alternatively, exception emails include a link to automatically add an exception to
the whitelist. It is possible to whitelist all exceptions from a particular function by leaving the
line of code text blank. Likewise, an entire file can be whitelisted by leaving the line of code and
function blank.
Example Email
---------------------
<pre><code><b>Traceback (most recent call last):</b>
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/flawless-0.1.4-py2.6.egg/flawless/client/middleware.py', line 34, in __call__
return self.app(environ, start_response)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/Beaker-1.6.4-py2.6.egg/beaker/middleware.py', line 73, in __call__
return self.app(environ, start_response)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/lib/json_api.py', line 66, in wrapped
return func(obj, **new_kwargs)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 535, in create_web_registration
return handler.run() # Returns json string
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 2190, in run
session.commit()
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/SQLAlchemy-0.7.1-py2.6-linux-x86_64.egg/sqlalchemy/orm/session.py', line 617, in commit
self.transaction.commit()
File '/build/bdist.linux-x86_64/egg/MySQLdb/cursors.py', line 173, in execute
self.errorhandler(self, exc, value)
File '/build/bdist.linux-x86_64/egg/MySQLdb/connections.py', line 36, in defaulterrorhandler
raise errorclass, errorvalue
IntegrityError('(IntegrityError) (1062, 'Duplicate entry '10229602058' for key 'PRIMARY')',)
<b>Stack Frame:</b>
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/lib/json_api.py', line 66, in wrapped</b>
arg='self'
func=<function create_web_registration at 0x7f6c2acf35f0>
kwargs={'pylons': <pylons.util.PylonsContext object at 0x7f6a5c800190>, 'start_response': <function repl_start_response at 0x7f6a5c80fed8>, 'controller': u'user', 'environ': {'routes.route': <routes.route.Route object at 0x7f6c2a61b850>, 'mod_wsgi.listener_..
new_kwargs={}
obj=<apps.shopkick.pylons.controllers.user.UserController object at 0x7f6a5c800110>
self.request_info=JsonRequestInfo(logging_details_field_name='create_web_registration_request_details', web_authentication_type=0, logging_request_type=71, request_path='/shopkick/v1/user/create_web_registration')
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 535, in create_web_registration</b>
client_platform=2
download_url_type='
email=None
error_manager=<apps.shopkick.pylons.lib.web_registration_helpers.ErrorManager object at 0x7f6a5c800150>
facebook_access_token=None
first_name=None
gift_manager=<apps.shopkick.pylons.lib.gifts.GiftManager object at 0x7f6a5c800450>
gift_token='
handler=<apps.shopkick.pylons.controllers.user.CreateWebRegistrationHandler object at 0x7f6a5c800f90>
invite_token=None
self._pylons_log_debug=False
self.start_response=<function repl_start_response at 0x7f6a5c80fed8>
user_service=<lib.thrift.utils.persistent_thrift_service.ThriftService object at 0x7f6c2a1f2410>
zip_code=None
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 2190, in run</b>
b_resp=CreateWebRegistrationResponse(status=0, web_registration_id=10229602058)
create_web_registered_user=<function create_web_registered_user at 0x7f6a80faf9b0>
gift_resp=None
is_full_registration=False
is_new_web_registration=True
record=WebregRepingRecord(webreg_user_id=10229602058, encrypted_webreg_user_id='KIOTYQ97P7H8', client_platform=2, reping_status=0, created=None)
self.client_platform=2
self.download_url_type='
self.email=None
self.error_manager=<apps.shopkick.pylons.lib.web_registration_helpers.ErrorManager object at 0x7f6a5c800150>
self.facebook_access_token=None
self.facebook_access_token_func=<function _facebook_user_id_from_access_token at 0x7f6c2ac719b0>
self.facebook_user_id=None
web_registration_id='KIOTYQ97P7H8'
<b>Additional Information:</b>
POST /shopkick/v1/user/create_web_registration HTTP/1.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
Accept-Encoding: gzip
Accept-Language: en-us,en;q=0.9
Cache-Control: max-age=43200
Connection: close
Content-Length: -1
Content-Type: application/x-www-form-urlencoded
Cookie: session_id=1E9DTWDVCQ7M8; __utma=151718139.482813466.1384371861.1384371861.1384832848.2; __utmb=151718139.2.9.1384832848; __utmc=151718139;
Host: app.shopkick.com
Origin: http://app.shopkick.com
Referer: http://app.shopkick.com/download_page?launch_reg=1
User-Agent: Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; VM670 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
X-Forwarded-For: 255.87.109.255
X-Real-Ip: 255.87.109.255
X-Requested-With: XMLHttpRequest
gift_token=&download_url_type=&gift_token=
</code></pre>
Server User Interface
---------------------
**/get_weekly_error_report** - Shows all errors that happened this week. ses a leaderboard style
format to show which developer is responsible for causing the most errors this week.
Parameters:
*timestamp* - (optional) Specify which week you want to view. Default is the current week.
include_known_errors - (optional) Include errors from config/known_errors. Default is False.
*include_modified_before_min_date* - (optional) Include errors originating in code modified
before flawless.cfg option 'report_only_after_minimum_date'. Default is False.
**/check_health** - Check if the server is up and running. Also displays server's configuration
parameters
**/add_known_error** - Webpage in which you can whitelist errors
**/view_traceback** - View the most recent traceback for a particular error
Parameters:
*filename* - (required) Specify the filename in which the error occurred
function_name - (required) Specify the name of the function in which the error occurred
*line_number* - (required) Specify the line number on which the error occurred
text - (required) Specify the full text that appears on line_number
*timestamp* - (optional) Specify which week you want to view. Default is the current week.
Flawless is a simple Python framework developed at shopkick for detecting bugs in a production
environment. Flawless traps exceptions and then sends an email to the developer responsible
for causing the exception. Flawless integrates with git and uses git-blame to determine which
developer to email.
Project website: http://shopkick.github.com/flawless/
Why You Should Use Flawless
---------------------------
* Only sends 1 email per line of code. Even if a particular line of code causes thousands of
exceptions, only one email will be sent.
* Only emails 1 developer. Flawless uses git-blame to figure out which developer is responsible
for a particular exception, and will only email that developer.
* Flawless logs the values of every variable in the stack frame at the time the exception
occurred. This makes debugging ten times faster.
* Don't report exceptions in old code. If you set report_only_after_minimum_date, then
Flawless will only report exceptions caused by code modified after
report_only_after_minimum_date.
* Don't alert on library code. You can mark certain files/functions as library code, and when an
exception originates in those files/functions, the caller will be blamed for the error instead
of the library code.
4 Step Setup Guide
------------------
1. Install Flawless. After this step you should have an executable named flawless in your path.
$> python setup.py install
2. Setup the Flawless server. Go to the server which you want to host the Flawless backend. Then
use the following command to start a short questionnaire to setup the server.
$> flawless configure
3. Start the Flawless server
$> flawless start -conf path/to/flawless.cfg
4. Integrate the Flawless client into your code. If you are running a WSGI application such as
django or pylons/pyramid, simply add the flawless.client.middleware to your application. Otherwise
you can wrap particular functions or entire classes by using flawless.client.decorators. View the
examples directory for some actual code examples.
How it Works
------------
The Flawless client wraps your code with a try/except block. When an exception is caught it then
sends the entire traceback to the Flawless server. The Flawless server then aggregates exception
reports from clients and figures out which line of code caused the exception. Once the line that
caused the exception is identified, Flawless runs 'git blame' to determine the email address of
the developer that last touched that line of code. Flawless then sends the developer an email with
the traceback.
Exceptions can be whitelisted if they are expected. To whitelist an exception you must specify
the filename, function name, and the text from the line of code being whitelisted in the appropriate
config file. Alternatively, exception emails include a link to automatically add an exception to
the whitelist. It is possible to whitelist all exceptions from a particular function by leaving the
line of code text blank. Likewise, an entire file can be whitelisted by leaving the line of code and
function blank.
Example Email
---------------------
<pre><code><b>Traceback (most recent call last):</b>
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/flawless-0.1.4-py2.6.egg/flawless/client/middleware.py', line 34, in __call__
return self.app(environ, start_response)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/Beaker-1.6.4-py2.6.egg/beaker/middleware.py', line 73, in __call__
return self.app(environ, start_response)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/lib/json_api.py', line 66, in wrapped
return func(obj, **new_kwargs)
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 535, in create_web_registration
return handler.run() # Returns json string
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 2190, in run
session.commit()
File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/SQLAlchemy-0.7.1-py2.6-linux-x86_64.egg/sqlalchemy/orm/session.py', line 617, in commit
self.transaction.commit()
File '/build/bdist.linux-x86_64/egg/MySQLdb/cursors.py', line 173, in execute
self.errorhandler(self, exc, value)
File '/build/bdist.linux-x86_64/egg/MySQLdb/connections.py', line 36, in defaulterrorhandler
raise errorclass, errorvalue
IntegrityError('(IntegrityError) (1062, 'Duplicate entry '10229602058' for key 'PRIMARY')',)
<b>Stack Frame:</b>
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/lib/json_api.py', line 66, in wrapped</b>
arg='self'
func=<function create_web_registration at 0x7f6c2acf35f0>
kwargs={'pylons': <pylons.util.PylonsContext object at 0x7f6a5c800190>, 'start_response': <function repl_start_response at 0x7f6a5c80fed8>, 'controller': u'user', 'environ': {'routes.route': <routes.route.Route object at 0x7f6c2a61b850>, 'mod_wsgi.listener_..
new_kwargs={}
obj=<apps.shopkick.pylons.controllers.user.UserController object at 0x7f6a5c800110>
self.request_info=JsonRequestInfo(logging_details_field_name='create_web_registration_request_details', web_authentication_type=0, logging_request_type=71, request_path='/shopkick/v1/user/create_web_registration')
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 535, in create_web_registration</b>
client_platform=2
download_url_type='
email=None
error_manager=<apps.shopkick.pylons.lib.web_registration_helpers.ErrorManager object at 0x7f6a5c800150>
facebook_access_token=None
first_name=None
gift_manager=<apps.shopkick.pylons.lib.gifts.GiftManager object at 0x7f6a5c800450>
gift_token='
handler=<apps.shopkick.pylons.controllers.user.CreateWebRegistrationHandler object at 0x7f6a5c800f90>
invite_token=None
self._pylons_log_debug=False
self.start_response=<function repl_start_response at 0x7f6a5c80fed8>
user_service=<lib.thrift.utils.persistent_thrift_service.ThriftService object at 0x7f6c2a1f2410>
zip_code=None
<b>File '/services/shopkick_pylons/shopkick_pylons-current/py/lib/python2.6/site-packages/apps/shopkick/pylons/controllers/user.py', line 2190, in run</b>
b_resp=CreateWebRegistrationResponse(status=0, web_registration_id=10229602058)
create_web_registered_user=<function create_web_registered_user at 0x7f6a80faf9b0>
gift_resp=None
is_full_registration=False
is_new_web_registration=True
record=WebregRepingRecord(webreg_user_id=10229602058, encrypted_webreg_user_id='KIOTYQ97P7H8', client_platform=2, reping_status=0, created=None)
self.client_platform=2
self.download_url_type='
self.email=None
self.error_manager=<apps.shopkick.pylons.lib.web_registration_helpers.ErrorManager object at 0x7f6a5c800150>
self.facebook_access_token=None
self.facebook_access_token_func=<function _facebook_user_id_from_access_token at 0x7f6c2ac719b0>
self.facebook_user_id=None
web_registration_id='KIOTYQ97P7H8'
<b>Additional Information:</b>
POST /shopkick/v1/user/create_web_registration HTTP/1.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
Accept-Encoding: gzip
Accept-Language: en-us,en;q=0.9
Cache-Control: max-age=43200
Connection: close
Content-Length: -1
Content-Type: application/x-www-form-urlencoded
Cookie: session_id=1E9DTWDVCQ7M8; __utma=151718139.482813466.1384371861.1384371861.1384832848.2; __utmb=151718139.2.9.1384832848; __utmc=151718139;
Host: app.shopkick.com
Origin: http://app.shopkick.com
Referer: http://app.shopkick.com/download_page?launch_reg=1
User-Agent: Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; VM670 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
X-Forwarded-For: 255.87.109.255
X-Real-Ip: 255.87.109.255
X-Requested-With: XMLHttpRequest
gift_token=&download_url_type=&gift_token=
</code></pre>
Server User Interface
---------------------
**/get_weekly_error_report** - Shows all errors that happened this week. ses a leaderboard style
format to show which developer is responsible for causing the most errors this week.
Parameters:
*timestamp* - (optional) Specify which week you want to view. Default is the current week.
include_known_errors - (optional) Include errors from config/known_errors. Default is False.
*include_modified_before_min_date* - (optional) Include errors originating in code modified
before flawless.cfg option 'report_only_after_minimum_date'. Default is False.
**/check_health** - Check if the server is up and running. Also displays server's configuration
parameters
**/add_known_error** - Webpage in which you can whitelist errors
**/view_traceback** - View the most recent traceback for a particular error
Parameters:
*filename* - (required) Specify the filename in which the error occurred
function_name - (required) Specify the name of the function in which the error occurred
*line_number* - (required) Specify the line number on which the error occurred
text - (required) Specify the full text that appears on line_number
*timestamp* - (optional) Specify which week you want to view. Default is the current week.
Release historyRelease notifications
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3
0.2.9
0.2.8
0.2.7 Timerik 1.3 download.
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size flawless-0.4.4-py2.7.egg (112.9 kB) | File type Egg | Python version 2.7 | Upload date | Hashes |
Filename, size flawless-0.4.4.tar.gz (55.6 kB) | File type Source | Python version None | Upload date | Hashes |
Hashes for flawless-0.4.4-py2.7.egg
Algorithm | Hash digest |
---|---|
SHA256 | 2c057d917127da6bfa34958ce8eeba50d7b83943b53fdc2b6f293731e4449e46 |
MD5 | 3a8eb3a89dcfd126917f8ac3e83c2b6e |
BLAKE2-256 | cff2c9d7398a69ccd69d3a3bec60cf8052abcb8a84a3d047f7a415d15340bba9 |
Hashes for flawless-0.4.4.tar.gz
Algorithm | Hash digest |
---|---|
SHA256 | e7a5dab05904afdad3706cf475ee92631a7999dcba652a4876f940984ff81054 |
MD5 | 2c2ccee629147df3617f9411750b8c88 |
BLAKE2-256 | e5bd24283b97e81919caf5a72562969b6c3a936380dfdde635d54ed1f88ebe82 |
- Choose a tag to compare
- Choose a tag to compare
ZeroFox5866 released this
- Nucleus now supports multiple Mice and Keyboards [thanks to @Ilyaki]
- Added the ability to search for scripts (handlers) and download them directly from the UI [thanks to @r-mach]
- You can now edit scripts while Nucleus is open and changes will take effect (no need to restart Nucleus each time anymore)
- Added a new option in game scripts to do resizing, repositioning and post-launch hooking of ALL instances at the very end (after all have been opened)
- Note: This method will not work for every option to-date
- Added an option in game scripts to re-register raw input in game process, a replacement for forwarding raw input [thanks to @Ilyaki]
- Added a new utility, Flawless Widescreen. Can be setup by calling it in game script
- Added an option in game scripts to change your IP per instance (NOTE: Highly experimental), a drop-down has been added to settings to select which network to change IP for
- Added logic to delete certain files that Nucleus adds to original game folder (when not linking or copying). For example, some that get deleted: Nucleus custom dlls, x360ce, xinput plus, custom utils
- Added an option in game scripts to kill mutexes in launchers
- Added an option in game scripts to kill mutexes in the last instance (normally last is ignored)
- Added an option in game scripts to rename, move or delete files in instance folders
- Added an option in game scripts to prompt the user after launching each instance, but before the grab process is grabbed
- Added an option in game scripts to delete file(s) from user profile config or save path, a prompt asking you to confirm will typically show, but this can be turned off in script too
- Added an option in game scripts to rename the steam api for Goldberg experimental (default will now not rename, you must set it to do so)
- Added an option in game scripts to kill additional processes upon exiting Nucleus or stopping a session
- Added an option in game scripts to ignore PreventWindowDeactivation if player is using keyboard
- Added an option in game scripts to copy (not symlink) all files within a given folder
- Added options in game scripts to disable Nucleus resizing, repositioning or making windows top most
- Added an option in game scripts to specify custom window styles (extended window styles as well)
- Increased max nickname length to 9 characters
- Exposed IsKeyboardPlayer to Context (will be True or False), can now be called in Game.Play
- Launchers will now also be killed upon exiting Nucleus or stopping a session (if any remain open throughout session), in addition to game windows
- Added logic to KeepAspectRatio & KeepMonitorAspectRatio if new width is to be determined (previously only new height)
- Added logic so that mutexes of different kinds can be killed. In Game.KillMutex(Launcher), simply begin the string with 'Type:Mutant ' following by the name of the mutex to kill. Can replace mutant with any mutex type
- Added logic to check if borders are removed at very end (some games bring them back), and if they aren't, remove them again
- Added Steam language in UI settings, and language gets updated automatically for SSE now as well
- Updated logic when launching games with start up hooks. Will check if process for that instance is already running, as well as try to grab the correct process if it is detected to be wrong
- Updated logic for Goldberg to set the settings folder in Nucleus Environment if environment and no local save are enabled
- Updated Goldberg emulator to latest git build (sha a0b66407bf2b8da686a708802cbc412f9cd386ca)
- Updated Context.LocalIP to better identify user's local IP when there are multiple IPs
- Updated method to capture current environment's user profile if different than their username [thanks to @Ilyaki]
- Fixed bug with x360ce placing files in wrong directory
- Fixed some duplicate operations happening if game was not linked or copied
- Fixed instanced folders trying to be deleted if game was not linked or copied
- Fixed a bug with PreventWindowDeactivation causing input to not work for some users
- Fixed some bugs with HexEditFileAddress and HexEditExeAddress
- Fixed architecture displayed in UI script details