summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Cramer <dcramer@gmail.com>2017-02-15 13:37:01 -0800
committerGitHub <noreply@github.com>2017-02-15 13:37:01 -0800
commit88584005cf8954439accf818964476d977d7a58f (patch)
tree438be62c6d8ac53ededde9d2bda30b80f59e6ae6
parent632c343470a668ef08dd943e5b22489b469444f5 (diff)
parentcce5c2d2e6a3299808ea0832b9582e71a28d3c67 (diff)
downloadraven-88584005cf8954439accf818964476d977d7a58f.tar.gz
Merge pull request #905 from getsentry/feature/repos
Add repos configuration
-rw-r--r--docs/advanced.rst19
-rw-r--r--raven/base.py13
-rw-r--r--raven/utils/conf.py1
-rw-r--r--tests/base/tests.py18
4 files changed, 51 insertions, 0 deletions
diff --git a/docs/advanced.rst b/docs/advanced.rst
index 535e42a..4d94a6f 100644
--- a/docs/advanced.rst
+++ b/docs/advanced.rst
@@ -117,6 +117,25 @@ The following are valid arguments which may be passed to the Raven client:
tags = {'site': 'foo.com'}
+.. describe:: repos
+
+ This describes local repositories that are reflected in your source code::
+
+ repos = {
+ 'raven': {
+ # the name of the repository as registered in Sentry
+ 'name': 'getsentry/raven-python',
+ # the prefix where the local source code is found in the repo
+ 'prefix': 'src',
+ }
+ }
+
+ The repository key can either be a module name or the absolute path. When
+ a module name is given it will be automatically converted to its absolute path.
+
+ For more information, see the :doc:`repos interface <../../../interfaces/repos>`
+ docs.
+
.. describe:: exclude_paths
Extending this allow you to ignore module prefixes when we attempt to
diff --git a/raven/base.py b/raven/base.py
index fb2dfa8..6fadbce 100644
--- a/raven/base.py
+++ b/raven/base.py
@@ -190,6 +190,7 @@ class Client(object):
self.tags = o.get('tags') or {}
self.environment = o.get('environment') or None
self.release = o.get('release') or os.environ.get('HEROKU_SLUG_COMMIT')
+ self.repos = self._format_repos(o.get('repos'))
self.transaction = TransactionStack()
self.ignore_exceptions = set(o.get('ignore_exceptions') or ())
@@ -220,6 +221,17 @@ class Client(object):
self.hook_libraries(hook_libraries)
+ def _format_repos(self, value):
+ if not value:
+ return {}
+ result = {}
+ for path, config in iteritems(value):
+ if path[0] != '/':
+ # assume its a module
+ path = os.path.abspath(__import__(path).__file__)
+ result[path] = config
+ return result
+
def set_dsn(self, dsn=None, transport=None):
if not dsn and os.environ.get('SENTRY_DSN'):
msg = "Configuring Raven from environment variable 'SENTRY_DSN'"
@@ -468,6 +480,7 @@ class Client(object):
data.setdefault('event_id', event_id)
data.setdefault('platform', PLATFORM_NAME)
data.setdefault('sdk', SDK_VALUE)
+ data.setdefault('repos', self.repos)
# insert breadcrumbs
if self.enable_breadcrumbs:
diff --git a/raven/utils/conf.py b/raven/utils/conf.py
index 7a9bc42..906e158 100644
--- a/raven/utils/conf.py
+++ b/raven/utils/conf.py
@@ -50,6 +50,7 @@ def convert_options(settings, defaults=None):
options.setdefault('context', getopt('context'))
options.setdefault('tags', getopt('tags'))
options.setdefault('release', getopt('release'))
+ options.setdefault('repos', getopt('repos'))
options.setdefault('environment', getopt('environment'))
options.setdefault('ignore_exceptions', getopt('ignore_exceptions'))
diff --git a/tests/base/tests.py b/tests/base/tests.py
index 9660346..040f3bd 100644
--- a/tests/base/tests.py
+++ b/tests/base/tests.py
@@ -585,3 +585,21 @@ class ClientTest(TestCase):
Client()
finally:
sys.argv = argv
+
+ def test_repos_configuration(self):
+ client = Client(repos={
+ '/foo/bar': {
+ 'name': 'repo',
+ },
+ 'raven': {
+ 'name': 'getsentry/raven-python',
+ },
+ })
+ assert client.repos == {
+ '/foo/bar': {
+ 'name': 'repo',
+ },
+ os.path.abspath(raven.__file__): {
+ 'name': 'getsentry/raven-python',
+ },
+ }