{"action":"created","comment":{"url":"https://api.github.com/repos/obspy/obspy/pulls/comments/78399144","id":78399144,"diff_hunk":"@@ -0,0 +1,1071 @@\n+# -*- coding: utf-8 -*-\n+\"\"\"\n+GSE2.0 bulletin read support.\n+\n+:copyright:\n+    The ObsPy Development Team (devs@obspy.org)\n+:license:\n+    GNU Lesser General Public License, Version 3\n+    (https://www.gnu.org/copyleft/lesser.html)\n+\"\"\"\n+from __future__ import (absolute_import, division, print_function,\n+                        unicode_literals)\n+from future.builtins import *  # NOQA\n+\n+import re\n+import warnings\n+\n+from obspy.core.event import (Amplitude, Arrival, Catalog, Comment,\n+                              CreationInfo, Event, EventDescription,\n+                              Magnitude, Origin, OriginQuality,\n+                              OriginUncertainty, Pick, ResourceIdentifier,\n+                              StationMagnitude, WaveformStreamID)\n+from obspy.core.event.header import (\n+    EvaluationMode, EventDescriptionType, EventType, EventTypeCertainty,\n+    OriginUncertaintyDescription, PickOnset)\n+from obspy.core.utcdatetime import UTCDateTime\n+\n+\n+# Convert GSE2 analysis type to ObsPy evaluation modes\n+EVALUATION_MODES = {\n+    'm': EvaluationMode.MANUAL,\n+    'a': EvaluationMode.AUTOMATIC,\n+    'g': EvaluationMode.MANUAL,\n+}\n+\n+\n+# Convert GSE2 to ObsPy location methods\n+LOCATION_METHODS = {\n+    'i': 'inversion',\n+    'p': 'pattern recognation',\n+    'g': 'ground truth',\n+    'o': 'other',\n+}\n+\n+\n+# Convert GSE2 to ObsPy event types\n+EVENT_TYPES = {\n+    'ke': (EventTypeCertainty.KNOWN,\n+           EventType('earthquake')),\n+    'se': (EventTypeCertainty.SUSPECTED,\n+           EventType('earthquake')),\n+    'kr': (EventTypeCertainty.KNOWN,\n+           EventType('rock burst')),\n+    'sr': (EventTypeCertainty.SUSPECTED,\n+           EventType('rock burst')),\n+    'ki': (EventTypeCertainty.KNOWN,\n+           EventType('induced or triggered event')),\n+    'si': (EventTypeCertainty.SUSPECTED,\n+           EventType('induced or triggered event')),\n+    'km': (EventTypeCertainty.KNOWN,\n+           EventType('mining explosion')),\n+    'sm': (EventTypeCertainty.SUSPECTED,\n+           EventType('mining explosion')),\n+    'kx': (EventTypeCertainty.KNOWN,\n+           EventType('experimental explosion')),\n+    'sx': (EventTypeCertainty.SUSPECTED,\n+           EventType('experimental explosion')),\n+    'kn': (EventTypeCertainty.KNOWN,\n+           EventType('nuclear explosion')),\n+    'sn': (EventTypeCertainty.SUSPECTED,\n+           EventType('nuclear explosion')),\n+    'ls': (EventTypeCertainty.KNOWN,\n+           EventType('landslide')),\n+    'uk': (None,\n+           EventType('other')),\n+}\n+\n+\n+# Convert GSE2 to ObsPy pick onset\n+PICK_ONSETS = {\n+    'E': PickOnset.EMERGENT,\n+    'I': PickOnset.IMPULSIVE,\n+    'Q': PickOnset.QUESTIONABLE,\n+}\n+\n+\n+def _is_gse2(filename):\n+    \"\"\"\n+    Checks whether a file is GSE2.0 format.\n+\n+    :type filename: str\n+    :param filename: Name of the GSE2.0 file to be checked.\n+    :rtype: bool\n+    :return: ``True`` if GSE2.0 file.\n+    \"\"\"\n+    try:\n+        with open(filename, 'rb') as fh:\n+            temp = fh.read(12)\n+    except:\n+        return False\n+    if temp != b'BEGIN GSE2.0':\n+        return False\n+    return True\n+\n+\n+class LinesIterator(object):\n+    \"\"\"\n+    Iterator to iterate file lines and count lines. Usefull for warning\n+    messages.\n+    \"\"\"\n+    def __init__(self, lines):\n+        self.lines = iter(lines)\n+        self.line_nb = 0\n+\n+    def __iter__(self):\n+        return self\n+\n+    def __next__(self):\n+        self.line_nb += 1\n+        return next(self.lines)\n+\n+\n+class Unpickler(object):\n+    \"\"\"\n+    De-serialize a GSE2.0 string into an ObsPy Catalog object.\n+    \"\"\"\n+\n+    def __init__(self, inventory, default_network_code, default_location_code,\n+                 default_channel_code, res_id_prefix, fields,\n+                 event_point_separator, agency):\n+        self.default_network_code = default_network_code\n+        self.default_location_code = default_location_code\n+        self.default_channel_code = default_channel_code\n+        self.inventory = inventory\n+        self.res_id_prefix = res_id_prefix\n+        self.event_point_separator = event_point_separator\n+        self.agency = agency\n+        self.author = ''\n+\n+        self.fields = {\n+            'line_1': {\n+                'time': slice(0, 21),\n+                'time_fixf': slice(22, 23),\n+                'lat': slice(25, 33),\n+                'lon': slice(34, 43),\n+                'epicenter_fixf': slice(44, 45),\n+                'depth': slice(47, 52),\n+                'depth_fixf': slice(53, 54),\n+                'n_def': slice(56, 60),\n+                'n_sta': slice(61, 65),\n+                'gap': slice(66, 69),\n+                'mag_type_1': slice(71, 73),\n+                'mag_1': slice(73, 77),\n+                'mag_n_sta_1': slice(78, 80),\n+                'mag_type_2': slice(82, 84),\n+                'mag_2': slice(84, 88),\n+                'mag_n_sta_2': slice(89, 91),\n+                'mag_type_3': slice(93, 95),\n+                'mag_3': slice(95, 99),\n+                'mag_n_sta_3': slice(100, 102),\n+                'author': slice(104, 112),\n+                'id': slice(114, 122),\n+            },\n+            'line_2': {\n+                'rms': slice(5, 10),\n+                'ot_error': slice(15, 21),\n+                's_major': slice(25, 31),\n+                's_minor': slice(32, 38),\n+                'az': slice(40, 43),\n+                'depth_err': slice(49, 54),\n+                'min_dist': slice(56, 62),\n+                'max_dist': slice(63, 69),\n+                'mag_err_1': slice(74, 77),\n+                'mag_err_2': slice(85, 88),\n+                'mag_err_3': slice(96, 99),\n+                'antype': slice(104, 105),\n+                'loctype': slice(106, 107),\n+                'evtype': slice(108, 110),\n+            },\n+            'arrival': {\n+                'sta': slice(0, 5),\n+                'dist': slice(6, 12),\n+                'ev_az': slice(13, 18),\n+                'picktype': slice(19, 20),\n+                'direction': slice(20, 21),\n+                'detchar': slice(21, 22),\n+                'phase': slice(23, 30),\n+                'time': slice(31, 52),\n+                't_res': slice(53, 58),\n+                'azim': slice(59, 64),\n+                'az_res': slice(65, 71),\n+                'slow': slice(72, 77),\n+                's_res': slice(78, 83),\n+                't_def': slice(84, 85),\n+                'a_def': slice(85, 86),\n+                's_def': slice(86, 87),\n+                'snr': slice(88, 93),\n+                'amp': slice(94, 103),\n+                'per': slice(104, 109),\n+                'mag_type_1': slice(110, 112),\n+                'mag_1': slice(112, 116),\n+                'mag_type_2': slice(117, 119),\n+                'mag_2': slice(119, 123),\n+                'id': slice(124, 132),\n+            },\n+        }\n+\n+        if fields:\n+            if 'line_1' in fields:\n+                self.fields['line_1'].update(fields['line_1'])\n+            if 'line_2' in fields:\n+                self.fields['line_2'].update(fields['line_2'])\n+            if 'arrival' in fields:\n+                self.fields['arrival'].update(fields['arrival'])\n+\n+    def load(self, filename):\n+        \"\"\"\n+        Read GSE2.0 file into ObsPy catalog object.\n+\n+        :type filename: str\n+        :param filename: File name to read.\n+        :rtype: :class:`~obspy.core.event.Catalog`\n+        :return: ObsPy Catalog object.\n+        \"\"\"\n+        with open(filename, 'r') as f:\n+            self.lines = LinesIterator(f.readlines())\n+        return self._deserialize()\n+\n+    def _add_line_nb(self, message):\n+        \"\"\"\n+        Add line number at the end of a str message.\n+\n+        :type message: str\n+        :param message: Message for warnings or exceptions.\n+        :rtype: str\n+        :return: Message with line number.\n+        \"\"\"\n+        return \"%s, line %s\" % (message, self.lines.line_nb)\n+\n+    def _warn(self, message):\n+        warnings.warn(self._add_line_nb(message))\n+\n+    def _skip_empty_lines(self):\n+        line = next(self.lines)\n+        while not line or line.isspace():\n+            line = next(self.lines)\n+        return line\n+\n+    def _get_res_id(self, ident, parent=None, parent_res_id=None):\n+        \"\"\"\n+        Create a :class:`~obspy.core.event.base.ResourceIdentifier` object.\n+\n+        :type ident: str\n+        :param ident: Id of\n+            the :class:`~obspy.core.event.base.ResourceIdentifier`.\n+        :type parent: :class:`~obspy.core.event.origin.Origin`,\n+            :class:`~obspy.core.event.Event` or any other object with a\n+            resource_id attribute.\n+        :param parent: The resource_id attribute of the parent will be\n+            used as a prefix for the new\n+            :class:`~obspy.core.event.base.ResourceIdentifier`.\n+        :type parent_res_id: :class:`~obspy.core.event.ResourceIdentifier`\n+            of the parent.\n+        :param parent_res_id: :class:`~obspy.core.event.ResourceIdentifier`\n+        :rtype: :class:`~obspy.core.event.ResourceIdentifier`\n+        :return: ResourceIdentifier object.\n+        \"\"\"\n+        prefix = self.res_id_prefix\n+        # Put the parent id as prefix\n+        # Example: smi:local/origin/351412/arrival/6389611\n+        #          |        prefix        |     ident    |\n+        if parent:\n+            prefix = parent.resource_id.id\n+        elif parent_res_id:\n+            prefix = parent_res_id.id\n+\n+        public_id = \"%s/%s\" % (prefix, ident)\n+        return ResourceIdentifier(public_id)\n+\n+    def _comment(self, text):\n+        comment = Comment()\n+        comment.text = text\n+        comment.resource_id = ResourceIdentifier(prefix=self.res_id_prefix)\n+        return comment\n+\n+    def _get_creation_info(self):\n+        creation_info = CreationInfo(creation_time=UTCDateTime())\n+        if self.agency:\n+            creation_info.agency_id = self.agency\n+        if self.author:\n+            creation_info.author = self.author\n+        return creation_info\n+\n+    def _check_header(self, first_line):\n+        \"\"\"\n+        Just check some stuff in header.\n+\n+        :type first_line: str\n+        :param first_line: First line of header.\n+        \"\"\"\n+        line_1_pattern = 'BEGIN\\sGSE2.0'\n+        line_2_pattern = 'MSG_TYPE\\s(REQUEST|DATA|SUBSCRIPTION|PROBLEM)'\n+        line_3_pattern = 'MSG_ID\\s\\w{1,20}\\s?\\w{1,8}'\n+\n+        if not re.match(line_1_pattern, first_line):\n+            raise SyntaxError('Wrong GSE2.0 header')","path":"obspy/io/gse2/bulletin.py","position":306,"original_position":306,"commit_id":"a7454634b133715dcfd252282d528ac51ec1be61","original_commit_id":"a7454634b133715dcfd252282d528ac51ec1be61","user":{"login":"claudiodsf","id":1390993,"avatar_url":"https://avatars.githubusercontent.com/u/1390993?v=3","gravatar_id":"","url":"https://api.github.com/users/claudiodsf","html_url":"https://github.com/claudiodsf","followers_url":"https://api.github.com/users/claudiodsf/followers","following_url":"https://api.github.com/users/claudiodsf/following{/other_user}","gists_url":"https://api.github.com/users/claudiodsf/gists{/gist_id}","starred_url":"https://api.github.com/users/claudiodsf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/claudiodsf/subscriptions","organizations_url":"https://api.github.com/users/claudiodsf/orgs","repos_url":"https://api.github.com/users/claudiodsf/repos","events_url":"https://api.github.com/users/claudiodsf/events{/privacy}","received_events_url":"https://api.github.com/users/claudiodsf/received_events","type":"User","site_admin":false},"body":"Maybe just a `ValueError` ?","created_at":"2016-09-12T15:50:15Z","updated_at":"2016-09-12T15:50:15Z","html_url":"https://github.com/obspy/obspy/pull/1528#discussion_r78399144","pull_request_url":"https://api.github.com/repos/obspy/obspy/pulls/1528","_links":{"self":{"href":"https://api.github.com/repos/obspy/obspy/pulls/comments/78399144"},"html":{"href":"https://github.com/obspy/obspy/pull/1528#discussion_r78399144"},"pull_request":{"href":"https://api.github.com/repos/obspy/obspy/pulls/1528"}}},"pull_request":{"url":"https://api.github.com/repos/obspy/obspy/pulls/1528","id":84879222,"html_url":"https://github.com/obspy/obspy/pull/1528","diff_url":"https://github.com/obspy/obspy/pull/1528.diff","patch_url":"https://github.com/obspy/obspy/pull/1528.patch","issue_url":"https://api.github.com/repos/obspy/obspy/issues/1528","number":1528,"state":"open","locked":false,"title":"Add GSE2.0 bulletin read support","user":{"login":"Brtle","id":19774452,"avatar_url":"https://avatars.githubusercontent.com/u/19774452?v=3","gravatar_id":"","url":"https://api.github.com/users/Brtle","html_url":"https://github.com/Brtle","followers_url":"https://api.github.com/users/Brtle/followers","following_url":"https://api.github.com/users/Brtle/following{/other_user}","gists_url":"https://api.github.com/users/Brtle/gists{/gist_id}","starred_url":"https://api.github.com/users/Brtle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Brtle/subscriptions","organizations_url":"https://api.github.com/users/Brtle/orgs","repos_url":"https://api.github.com/users/Brtle/repos","events_url":"https://api.github.com/users/Brtle/events{/privacy}","received_events_url":"https://api.github.com/users/Brtle/received_events","type":"User","site_admin":false},"body":"I did a module to read GSE2.0 bulletin. Since there was a GSE2 module for waveforms, I added my code into this module.\r\n\r\nI also added the documentation but I'm not sure about the license. It's an old documentation from 1995. I found it [here](http://www.seismo.ethz.ch/prod/autodrm/manual/index_EN) and the `provisional_GSE2.1.pdf` file (which can also be found on this page) was already in the GSE2 module. I assume that's OK.\r\n\r\nI didn't add it to `CHANGELOG.txt`, it may be good to do it.\r\n\r\nThis is my first pull request so feel free to tell me if I've missed something!","created_at":"2016-09-12T14:17:29Z","updated_at":"2016-09-12T15:50:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2c835e037088e2ff8c1c925eac2f9ef73f2d32cf","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/obspy/obspy/pulls/1528/commits","review_comments_url":"https://api.github.com/repos/obspy/obspy/pulls/1528/comments","review_comment_url":"https://api.github.com/repos/obspy/obspy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/obspy/obspy/issues/1528/comments","statuses_url":"https://api.github.com/repos/obspy/obspy/statuses/a7454634b133715dcfd252282d528ac51ec1be61","head":{"label":"Brtle:gse2_bulletin","ref":"gse2_bulletin","sha":"a7454634b133715dcfd252282d528ac51ec1be61","user":{"login":"Brtle","id":19774452,"avatar_url":"https://avatars.githubusercontent.com/u/19774452?v=3","gravatar_id":"","url":"https://api.github.com/users/Brtle","html_url":"https://github.com/Brtle","followers_url":"https://api.github.com/users/Brtle/followers","following_url":"https://api.github.com/users/Brtle/following{/other_user}","gists_url":"https://api.github.com/users/Brtle/gists{/gist_id}","starred_url":"https://api.github.com/users/Brtle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Brtle/subscriptions","organizations_url":"https://api.github.com/users/Brtle/orgs","repos_url":"https://api.github.com/users/Brtle/repos","events_url":"https://api.github.com/users/Brtle/events{/privacy}","received_events_url":"https://api.github.com/users/Brtle/received_events","type":"User","site_admin":false},"repo":{"id":60854461,"name":"obspy","full_name":"Brtle/obspy","owner":{"login":"Brtle","id":19774452,"avatar_url":"https://avatars.githubusercontent.com/u/19774452?v=3","gravatar_id":"","url":"https://api.github.com/users/Brtle","html_url":"https://github.com/Brtle","followers_url":"https://api.github.com/users/Brtle/followers","following_url":"https://api.github.com/users/Brtle/following{/other_user}","gists_url":"https://api.github.com/users/Brtle/gists{/gist_id}","starred_url":"https://api.github.com/users/Brtle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Brtle/subscriptions","organizations_url":"https://api.github.com/users/Brtle/orgs","repos_url":"https://api.github.com/users/Brtle/repos","events_url":"https://api.github.com/users/Brtle/events{/privacy}","received_events_url":"https://api.github.com/users/Brtle/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Brtle/obspy","description":"ObsPy: A Python Toolbox for seismology/seismological observatories.","fork":true,"url":"https://api.github.com/repos/Brtle/obspy","forks_url":"https://api.github.com/repos/Brtle/obspy/forks","keys_url":"https://api.github.com/repos/Brtle/obspy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Brtle/obspy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Brtle/obspy/teams","hooks_url":"https://api.github.com/repos/Brtle/obspy/hooks","issue_events_url":"https://api.github.com/repos/Brtle/obspy/issues/events{/number}","events_url":"https://api.github.com/repos/Brtle/obspy/events","assignees_url":"https://api.github.com/repos/Brtle/obspy/assignees{/user}","branches_url":"https://api.github.com/repos/Brtle/obspy/branches{/branch}","tags_url":"https://api.github.com/repos/Brtle/obspy/tags","blobs_url":"https://api.github.com/repos/Brtle/obspy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Brtle/obspy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Brtle/obspy/git/refs{/sha}","trees_url":"https://api.github.com/repos/Brtle/obspy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Brtle/obspy/statuses/{sha}","languages_url":"https://api.github.com/repos/Brtle/obspy/languages","stargazers_url":"https://api.github.com/repos/Brtle/obspy/stargazers","contributors_url":"https://api.github.com/repos/Brtle/obspy/contributors","subscribers_url":"https://api.github.com/repos/Brtle/obspy/subscribers","subscription_url":"https://api.github.com/repos/Brtle/obspy/subscription","commits_url":"https://api.github.com/repos/Brtle/obspy/commits{/sha}","git_commits_url":"https://api.github.com/repos/Brtle/obspy/git/commits{/sha}","comments_url":"https://api.github.com/repos/Brtle/obspy/comments{/number}","issue_comment_url":"https://api.github.com/repos/Brtle/obspy/issues/comments{/number}","contents_url":"https://api.github.com/repos/Brtle/obspy/contents/{+path}","compare_url":"https://api.github.com/repos/Brtle/obspy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Brtle/obspy/merges","archive_url":"https://api.github.com/repos/Brtle/obspy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Brtle/obspy/downloads","issues_url":"https://api.github.com/repos/Brtle/obspy/issues{/number}","pulls_url":"https://api.github.com/repos/Brtle/obspy/pulls{/number}","milestones_url":"https://api.github.com/repos/Brtle/obspy/milestones{/number}","notifications_url":"https://api.github.com/repos/Brtle/obspy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Brtle/obspy/labels{/name}","releases_url":"https://api.github.com/repos/Brtle/obspy/releases{/id}","deployments_url":"https://api.github.com/repos/Brtle/obspy/deployments","created_at":"2016-06-10T14:36:46Z","updated_at":"2016-06-10T14:36:52Z","pushed_at":"2016-09-12T13:40:57Z","git_url":"git://github.com/Brtle/obspy.git","ssh_url":"git@github.com:Brtle/obspy.git","clone_url":"https://github.com/Brtle/obspy.git","svn_url":"https://github.com/Brtle/obspy","homepage":"https://www.obspy.org","size":79804,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"obspy:master","ref":"master","sha":"b79e6a1a654a30911ae7fba7635819b3d82819ff","user":{"login":"obspy","id":1701221,"avatar_url":"https://avatars.githubusercontent.com/u/1701221?v=3","gravatar_id":"","url":"https://api.github.com/users/obspy","html_url":"https://github.com/obspy","followers_url":"https://api.github.com/users/obspy/followers","following_url":"https://api.github.com/users/obspy/following{/other_user}","gists_url":"https://api.github.com/users/obspy/gists{/gist_id}","starred_url":"https://api.github.com/users/obspy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/obspy/subscriptions","organizations_url":"https://api.github.com/users/obspy/orgs","repos_url":"https://api.github.com/users/obspy/repos","events_url":"https://api.github.com/users/obspy/events{/privacy}","received_events_url":"https://api.github.com/users/obspy/received_events","type":"Organization","site_admin":false},"repo":{"id":5731348,"name":"obspy","full_name":"obspy/obspy","owner":{"login":"obspy","id":1701221,"avatar_url":"https://avatars.githubusercontent.com/u/1701221?v=3","gravatar_id":"","url":"https://api.github.com/users/obspy","html_url":"https://github.com/obspy","followers_url":"https://api.github.com/users/obspy/followers","following_url":"https://api.github.com/users/obspy/following{/other_user}","gists_url":"https://api.github.com/users/obspy/gists{/gist_id}","starred_url":"https://api.github.com/users/obspy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/obspy/subscriptions","organizations_url":"https://api.github.com/users/obspy/orgs","repos_url":"https://api.github.com/users/obspy/repos","events_url":"https://api.github.com/users/obspy/events{/privacy}","received_events_url":"https://api.github.com/users/obspy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/obspy/obspy","description":"ObsPy: A Python Toolbox for seismology/seismological observatories.","fork":false,"url":"https://api.github.com/repos/obspy/obspy","forks_url":"https://api.github.com/repos/obspy/obspy/forks","keys_url":"https://api.github.com/repos/obspy/obspy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/obspy/obspy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/obspy/obspy/teams","hooks_url":"https://api.github.com/repos/obspy/obspy/hooks","issue_events_url":"https://api.github.com/repos/obspy/obspy/issues/events{/number}","events_url":"https://api.github.com/repos/obspy/obspy/events","assignees_url":"https://api.github.com/repos/obspy/obspy/assignees{/user}","branches_url":"https://api.github.com/repos/obspy/obspy/branches{/branch}","tags_url":"https://api.github.com/repos/obspy/obspy/tags","blobs_url":"https://api.github.com/repos/obspy/obspy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/obspy/obspy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/obspy/obspy/git/refs{/sha}","trees_url":"https://api.github.com/repos/obspy/obspy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/obspy/obspy/statuses/{sha}","languages_url":"https://api.github.com/repos/obspy/obspy/languages","stargazers_url":"https://api.github.com/repos/obspy/obspy/stargazers","contributors_url":"https://api.github.com/repos/obspy/obspy/contributors","subscribers_url":"https://api.github.com/repos/obspy/obspy/subscribers","subscription_url":"https://api.github.com/repos/obspy/obspy/subscription","commits_url":"https://api.github.com/repos/obspy/obspy/commits{/sha}","git_commits_url":"https://api.github.com/repos/obspy/obspy/git/commits{/sha}","comments_url":"https://api.github.com/repos/obspy/obspy/comments{/number}","issue_comment_url":"https://api.github.com/repos/obspy/obspy/issues/comments{/number}","contents_url":"https://api.github.com/repos/obspy/obspy/contents/{+path}","compare_url":"https://api.github.com/repos/obspy/obspy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/obspy/obspy/merges","archive_url":"https://api.github.com/repos/obspy/obspy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/obspy/obspy/downloads","issues_url":"https://api.github.com/repos/obspy/obspy/issues{/number}","pulls_url":"https://api.github.com/repos/obspy/obspy/pulls{/number}","milestones_url":"https://api.github.com/repos/obspy/obspy/milestones{/number}","notifications_url":"https://api.github.com/repos/obspy/obspy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/obspy/obspy/labels{/name}","releases_url":"https://api.github.com/repos/obspy/obspy/releases{/id}","deployments_url":"https://api.github.com/repos/obspy/obspy/deployments","created_at":"2012-09-08T19:17:46Z","updated_at":"2016-09-09T20:29:24Z","pushed_at":"2016-09-12T15:31:38Z","git_url":"git://github.com/obspy/obspy.git","ssh_url":"git@github.com:obspy/obspy.git","clone_url":"https://github.com/obspy/obspy.git","svn_url":"https://github.com/obspy/obspy","homepage":"https://www.obspy.org","size":97622,"stargazers_count":230,"watchers_count":230,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":171,"mirror_url":null,"open_issues_count":188,"forks":171,"open_issues":188,"watchers":230,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/obspy/obspy/pulls/1528"},"html":{"href":"https://github.com/obspy/obspy/pull/1528"},"issue":{"href":"https://api.github.com/repos/obspy/obspy/issues/1528"},"comments":{"href":"https://api.github.com/repos/obspy/obspy/issues/1528/comments"},"review_comments":{"href":"https://api.github.com/repos/obspy/obspy/pulls/1528/comments"},"review_comment":{"href":"https://api.github.com/repos/obspy/obspy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/obspy/obspy/pulls/1528/commits"},"statuses":{"href":"https://api.github.com/repos/obspy/obspy/statuses/a7454634b133715dcfd252282d528ac51ec1be61"}}}}
{"actor":{"display_login":"claudiodsf"}}