{"action":"created","comment":{"url":"https://api.github.com/repos/jason-neal/eniric/pulls/comments/209589620","pull_request_review_id":145629383,"id":209589620,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwOTU4OTYyMA==","diff_hunk":"@@ -1,25 +1,349 @@\n-\"\"\"Functions to deal with the atmosphere models.\n+import warnings\n+from os.path import join\n+from typing import List, Optional\n \n-Mainly the barycentric shifting of the absorption mask.\n-\"\"\"\n-\n-from typing import Tuple\n-\n-import matplotlib.pyplot as plt\n import numpy as np\n-from astropy.constants import c\n+from astropy import constants as const\n from numpy import ndarray\n \n+import eniric\n import eniric.IOmodule as io\n+from eniric.broaden import resolution_convolution\n+from eniric.utilities import band_limits\n+\n+\n+class Atmosphere(object):\n+    \"\"\"Atmospheric transmission object.\n+\n+    Stores wavelength and atmospheric transmission arrays.\n+    Enables telluric masking and accounting for barycentric motion.\n+\n+    Attributes\n+    ----------\n+    wl: ndarray\n+        Wavelength array\n+    transmission: ndarray\n+        Atmospheric transmission (between 0 and 1)\n+    std: ndarray\n+        Standard deviation of transmission.\n+    mask: ndarray\n+        Transmission mask (1's are kept)\n+    shifted: bool\n+        Indicate shifted mask\n+\n+    Constructors\n+    ----------\n+    from_file(atmmodel)\n+        Read in atmospheric model and prepare.\n+    from_band(band, bary=False)\n+        Read in atmospheric model for given band.\n+\n+    Methods\n+    -------\n+    to_file(fname, header, fmt)\n+        Save the atmospheric model to a txt file.\n+    at(wave)\n+        Return the transmission value at the closest points to wave.\n+    wave_select(wl_min, wl_max)\n+       Slice Atmosphere between two wavelengths.\n+    band_select(band)\n+        Slice Atmosphere to a given band.\n+    copy()\n+        Make a copy of atmosphere object.\n+    mask_transmission(depth)\n+        Mask the transmission below given depth. e.g. 2%\n+    bary_shift_mask(rv, consecutive_test)\n+        Sweep telluric mask symmetrically by rv.\n+    broaden(resolution, *kwargs)\n+        Instrument broadening of the atmospheric transmission profile.\n+\n+    Configuration\n+    -------------\n+    Two things can be set for the Atmosphere class in the `config.yaml` file\n+    The path to atmosphere data\n+    e.g.\n+        paths:\n+            atmmodel: \"path/to/atmmodel/directory\"\n+    The name for the atmosphere model .txt file\n+        atmmodel:\n+            base: \"Average_TAPAS_2014\"\n+    \"\"\"\n+\n+    def __init__(self, wavelength, transmission, mask=None, std=None, shifted=False):\n+        assert len(wavelength) == len(\n+            transmission\n+        ), \"Wavelength and transmission do not match length.\"\n+        self.wl = np.asarray(wavelength)\n+        self.transmission = np.asarray(transmission)\n+        if std is None:\n+            self.std = np.zeros_like(wavelength)\n+        else:\n+            self.std = np.asarray(std)\n+        if mask is None:\n+            self.mask = np.ones_like(wavelength, dtype=bool)\n+        else:\n+            self.mask = np.asarray(mask, dtype=bool)\n+        self.shifted = shifted\n+\n+    @classmethod\n+    def from_file(cls, atmmodel: str):\n+        \"\"\"Read in atmospheric model and prepare.\n+\n+        Alternate constructor for Atmosphere.\n+\n+        Parameters\n+        ----------\n+        atmmodel: str\n+            Name of atmosphere file.\n+        \"\"\"\n+        wav_atm, flux_atm, std_flux_atm, mask_atm = io.pdread_4col(atmmodel)\n+        wav_atm = wav_atm / 1e3  # conversion from nanometers to micrometers\n+        mask_atm = np.array(mask_atm, dtype=bool)\n+        # We do not use the std from the year atmosphere but need it for compatibility.\n+        shifted = True if \"_bary\" in atmmodel else False\n+        return cls(\n+            wavelength=wav_atm,\n+            transmission=flux_atm,\n+            mask=mask_atm,\n+            std=std_flux_atm,\n+            shifted=shifted,\n+        )\n+\n+    @classmethod\n+    def from_band(cls, band: str, bary: bool = False):\n+        \"\"\"Read in atmospheric model for given band.\n+\n+        Alternate constructor for Atmosphere. Base on \"base\" path in config.yaml.\n+\n+        Parameters\n+        ----------\n+        band: str\n+            Name of atmosphere file.\n+        bary: bool\n+            Barycentric shifted mask.\n+        \"\"\"\n+\n+        extension = \"_bary.txt\" if bary else \".txt\"\n+        atmmodel = join(\n+            eniric.paths[\"atmmodel\"],\n+            \"{0}_{1}{2}\".format(eniric.atmmodel[\"base\"], band, extension),\n+        )\n+\n+        try:\n+            # Try find the band file\n+            atm = cls.from_file(atmmodel)\n+        except:\n+            warnings.warn(\n+                \"\"\"Could not find band file for band {0}.\n+             It is recommend to create this using\n+                `split_atmosphere.py -b {0}`\n+                `bary_shift_atmmodel.py -b {0}`\n+             Trying to load main atmosphere file for now. (will be slower).\"\"\".format(\n+                    band\n+                )\n+            )\n+            full_model = join(\n+                eniric.paths[\"atmmodel\"], \"{0}.txt\".format(eniric.atmmodel[\"base\"])\n+            )\n+            atm = cls.from_file(full_model)\n+\n+            # Shorten to band\n+            atm = atm.wave_select(*band_limits(band))\n+            if bary:\n+                atm.bary_shift_mask(consecutive_test=True)\n+        return atm\n+\n+    def to_file(\n+        self, fname: str, header: Optional[List[str]] = None, fmt: str = \"%11.8f\"\n+    ):\n+        \"\"\"Save the atmospheric model to a txt file.\n+\n+        Converts micron back into nanometers to be consistent with from_file().\n+\n+        Parameters\n+        ----------\n+        fname: str\n+            Name of atmosphere file to save to.\n+        header:\n+            Header lines to add.\n+        fmt: str\n+             String formatting\n+        \"\"\"\n+        if header is None:\n+            header = [\"# atm_wav(nm)\", \"atm_flux\", \"atm_std_flux\", \"atm_mask\"]\n+        return io.pdwrite_cols(\n+            fname,\n+            self.wl * 1000,\n+            self.transmission,\n+            self.std,\n+            self.mask.astype(int),\n+            header=header,\n+            float_format=fmt,\n+        )\n+\n+    def __getitem__(self, item):\n+        \"\"\"Index Atmosphere by returning a Atmosphere with indexed components.\"\"\"\n+        return Atmosphere(\n+            wavelength=self.wl[item],\n+            transmission=self.transmission[item],\n+            mask=self.mask[item],\n+            std=self.std[item],\n+        )\n \n+    def at(self, wave):\n+        \"\"\"Return the transmission value at the closest points to wave.\n+\n+        This assumes that the atmosphere model is\n+        sampled much higher than the stellar spectra.\n+\n+        For instance the default has a sampling if 10 compared to 3.\n+        (instead of interpolation)\n+\n+        Parameters\n+        ----------\n+        wave: ndarray\n+            Wavelengths at which to return closest atmosphere values.\n+        \"\"\"\n+        # Getting the wav, flux and mask values from the atm model\n+        # that are the closest to the stellar wav values, see\n+        # https://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array\n+        index_atm = np.searchsorted(self.wl, wave)\n+        wl_len = len(self.wl)\n+        # replace indexes outside the array, at the very end, by the value at the very end\n+        # index_atm = [index if(index < len(wav_atm)) else len(wav_atm)-1 for index in index_atm]\n+        index_mask = index_atm >= wl_len  # find broken indices\n+        index_atm[index_mask] = wl_len - 1  # replace with index of end.\n+        return self[index_atm]\n+\n+    def wave_select(self, wl_min, wl_max):\n+        \"\"\"Slice Atmosphere between two wavelengths.\"\"\"\n+        wl_mask = (self.wl < wl_max) & (self.wl > wl_min)\n+        return self[wl_mask]\n+\n+    def band_select(self, band):\n+        \"\"\"Slice Atmosphere to a given Band.\"\"\"\n+        wl_min, wl_max = band_limits(band)\n+        return self.wave_select(wl_min, wl_max)\n+\n+    def copy(self):\n+        \"\"\"Make a copy of atmosphere object.\"\"\"\n+        return Atmosphere(\n+            wavelength=self.wl.copy(),\n+            transmission=self.transmission.copy(),\n+            mask=self.mask.copy(),\n+            std=self.std.copy(),\n+        )\n \n-def prepare_atmosphere(atmmodel: str) -> Tuple[ndarray, ndarray, ndarray, ndarray]:\n-    \"\"\"Read in atmospheric model and prepare.\"\"\"\n-    wav_atm, flux_atm, std_flux_atm, mask_atm = io.pdread_4col(atmmodel)\n-    # pandas already returns numpy arrays\n-    wav_atm = wav_atm / 1000.0  # conversion from nanometers to micrometers\n-    mask_atm = np.array(mask_atm, dtype=bool)\n-    return wav_atm, flux_atm, std_flux_atm, mask_atm\n+    def mask_transmission(self, depth: float = 2.0) -> None:\n+        \"\"\"Mask the transmission below given depth. e.g. 2%\n+\n+        Parameters\n+        ----------\n+        depth : float (default = 2.0)\n+            Telluric line depth percentage to mask out.\n+            E.g. depth=2 will mask transmission deeper than 2%.\n+\n+        Updates the mask.\n+        \"\"\"\n+        cutoff = 1 - depth / 100.0\n+        self.mask = self.transmission >= cutoff\n+\n+    def bary_shift_mask(self, rv: float = 30.0, consecutive_test: bool = False):\n+        \"\"\"Sweep telluric mask symmetrically by rv.\n+\n+        Parameters\n+        ----------\n+        rv: float (default=30 km/s)\n+            Barycentric RV to extend masks in km/s. (Default=30 km/s)\n+        consecutive_test: bool (default False)\n+            Checks for 3 consecutive zeros to mask out transmission.\n+\n+        \"\"\"\n+        if self.shifted:\n+            warnings.warn(\n+                \"Detected that 'shifted' is already True. \"\n+                \"Check that you want to rv extend masks again.\"\n+            )\n+        rv_mps = rv * 1e3  # Convert from km/s into m/s\n+\n+        shift_amplitudes = self.wl * rv_mps / const.c.value\n+        # Operate element wise\n+        blue_shifts = self.wl - shift_amplitudes\n+        red_shifts = self.wl + shift_amplitudes\n+\n+        bary_mask = []\n+        for (blue_wl, wl, red_wl, mask) in zip(","path":"eniric/atmosphere.py","position":290,"original_position":290,"commit_id":"9e2f0fb3d39ce249b9a94609bfcb776692d66a31","original_commit_id":"9e2f0fb3d39ce249b9a94609bfcb776692d66a31","user":{"login":"codacy-bot","id":19940114,"node_id":"MDQ6VXNlcjE5OTQwMTE0","avatar_url":"https://avatars1.githubusercontent.com/u/19940114?v=4","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [Unused variable 'wl'](https://app.codacy.com/app/jason-neal/eniric/pullRequest?prid=2023590)","created_at":"2018-08-13T12:28:11Z","updated_at":"2018-08-13T12:28:11Z","html_url":"https://github.com/jason-neal/eniric/pull/82#discussion_r209589620","pull_request_url":"https://api.github.com/repos/jason-neal/eniric/pulls/82","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/comments/209589620"},"html":{"href":"https://github.com/jason-neal/eniric/pull/82#discussion_r209589620"},"pull_request":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/82"}}},"pull_request":{"url":"https://api.github.com/repos/jason-neal/eniric/pulls/82","id":207407749,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA3NDA3NzQ5","html_url":"https://github.com/jason-neal/eniric/pull/82","diff_url":"https://github.com/jason-neal/eniric/pull/82.diff","patch_url":"https://github.com/jason-neal/eniric/pull/82.patch","issue_url":"https://api.github.com/repos/jason-neal/eniric/issues/82","number":82,"state":"open","locked":false,"title":"Update Atmosphere handing","user":{"login":"jason-neal","id":10076879,"node_id":"MDQ6VXNlcjEwMDc2ODc5","avatar_url":"https://avatars3.githubusercontent.com/u/10076879?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-neal","html_url":"https://github.com/jason-neal","followers_url":"https://api.github.com/users/jason-neal/followers","following_url":"https://api.github.com/users/jason-neal/following{/other_user}","gists_url":"https://api.github.com/users/jason-neal/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-neal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-neal/subscriptions","organizations_url":"https://api.github.com/users/jason-neal/orgs","repos_url":"https://api.github.com/users/jason-neal/repos","events_url":"https://api.github.com/users/jason-neal/events{/privacy}","received_events_url":"https://api.github.com/users/jason-neal/received_events","type":"User","site_admin":false},"body":"Creation of Atmosphere handling Class.\r\n\r\nChecks barycenter shifting of masks.\r\n\r\nMakes it possible to add your own atmosphere transmission, and preform the same masking.\r\n\r\n\r\nToDo:\r\n- [x]  Use class in ´aces_precision.py´\r\n- [ ] Show how to use atmosphere\r\n","created_at":"2018-08-09T18:43:29Z","updated_at":"2018-08-13T12:28:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9f3d382a627d4f1b46809e1474af7e6a6f201f1d","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/jason-neal/eniric/pulls/82/commits","review_comments_url":"https://api.github.com/repos/jason-neal/eniric/pulls/82/comments","review_comment_url":"https://api.github.com/repos/jason-neal/eniric/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jason-neal/eniric/issues/82/comments","statuses_url":"https://api.github.com/repos/jason-neal/eniric/statuses/9e2f0fb3d39ce249b9a94609bfcb776692d66a31","head":{"label":"jason-neal:atmosphere","ref":"atmosphere","sha":"9e2f0fb3d39ce249b9a94609bfcb776692d66a31","user":{"login":"jason-neal","id":10076879,"node_id":"MDQ6VXNlcjEwMDc2ODc5","avatar_url":"https://avatars3.githubusercontent.com/u/10076879?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-neal","html_url":"https://github.com/jason-neal","followers_url":"https://api.github.com/users/jason-neal/followers","following_url":"https://api.github.com/users/jason-neal/following{/other_user}","gists_url":"https://api.github.com/users/jason-neal/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-neal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-neal/subscriptions","organizations_url":"https://api.github.com/users/jason-neal/orgs","repos_url":"https://api.github.com/users/jason-neal/repos","events_url":"https://api.github.com/users/jason-neal/events{/privacy}","received_events_url":"https://api.github.com/users/jason-neal/received_events","type":"User","site_admin":false},"repo":{"id":76452634,"node_id":"MDEwOlJlcG9zaXRvcnk3NjQ1MjYzNA==","name":"eniric","full_name":"jason-neal/eniric","owner":{"login":"jason-neal","id":10076879,"node_id":"MDQ6VXNlcjEwMDc2ODc5","avatar_url":"https://avatars3.githubusercontent.com/u/10076879?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-neal","html_url":"https://github.com/jason-neal","followers_url":"https://api.github.com/users/jason-neal/followers","following_url":"https://api.github.com/users/jason-neal/following{/other_user}","gists_url":"https://api.github.com/users/jason-neal/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-neal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-neal/subscriptions","organizations_url":"https://api.github.com/users/jason-neal/orgs","repos_url":"https://api.github.com/users/jason-neal/repos","events_url":"https://api.github.com/users/jason-neal/events{/privacy}","received_events_url":"https://api.github.com/users/jason-neal/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jason-neal/eniric","description":"Extended Near InfraRed spectra Information Content analysis.","fork":false,"url":"https://api.github.com/repos/jason-neal/eniric","forks_url":"https://api.github.com/repos/jason-neal/eniric/forks","keys_url":"https://api.github.com/repos/jason-neal/eniric/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jason-neal/eniric/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jason-neal/eniric/teams","hooks_url":"https://api.github.com/repos/jason-neal/eniric/hooks","issue_events_url":"https://api.github.com/repos/jason-neal/eniric/issues/events{/number}","events_url":"https://api.github.com/repos/jason-neal/eniric/events","assignees_url":"https://api.github.com/repos/jason-neal/eniric/assignees{/user}","branches_url":"https://api.github.com/repos/jason-neal/eniric/branches{/branch}","tags_url":"https://api.github.com/repos/jason-neal/eniric/tags","blobs_url":"https://api.github.com/repos/jason-neal/eniric/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jason-neal/eniric/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jason-neal/eniric/git/refs{/sha}","trees_url":"https://api.github.com/repos/jason-neal/eniric/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jason-neal/eniric/statuses/{sha}","languages_url":"https://api.github.com/repos/jason-neal/eniric/languages","stargazers_url":"https://api.github.com/repos/jason-neal/eniric/stargazers","contributors_url":"https://api.github.com/repos/jason-neal/eniric/contributors","subscribers_url":"https://api.github.com/repos/jason-neal/eniric/subscribers","subscription_url":"https://api.github.com/repos/jason-neal/eniric/subscription","commits_url":"https://api.github.com/repos/jason-neal/eniric/commits{/sha}","git_commits_url":"https://api.github.com/repos/jason-neal/eniric/git/commits{/sha}","comments_url":"https://api.github.com/repos/jason-neal/eniric/comments{/number}","issue_comment_url":"https://api.github.com/repos/jason-neal/eniric/issues/comments{/number}","contents_url":"https://api.github.com/repos/jason-neal/eniric/contents/{+path}","compare_url":"https://api.github.com/repos/jason-neal/eniric/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jason-neal/eniric/merges","archive_url":"https://api.github.com/repos/jason-neal/eniric/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jason-neal/eniric/downloads","issues_url":"https://api.github.com/repos/jason-neal/eniric/issues{/number}","pulls_url":"https://api.github.com/repos/jason-neal/eniric/pulls{/number}","milestones_url":"https://api.github.com/repos/jason-neal/eniric/milestones{/number}","notifications_url":"https://api.github.com/repos/jason-neal/eniric/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jason-neal/eniric/labels{/name}","releases_url":"https://api.github.com/repos/jason-neal/eniric/releases{/id}","deployments_url":"https://api.github.com/repos/jason-neal/eniric/deployments","created_at":"2016-12-14T11:14:31Z","updated_at":"2018-08-09T10:10:08Z","pushed_at":"2018-08-13T12:21:40Z","git_url":"git://github.com/jason-neal/eniric.git","ssh_url":"git@github.com:jason-neal/eniric.git","clone_url":"https://github.com/jason-neal/eniric.git","svn_url":"https://github.com/jason-neal/eniric","homepage":"","size":335985,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":1,"open_issues":9,"watchers":0,"default_branch":"master"}},"base":{"label":"jason-neal:develop","ref":"develop","sha":"179c75980c586430f1d000fe8146febd399786db","user":{"login":"jason-neal","id":10076879,"node_id":"MDQ6VXNlcjEwMDc2ODc5","avatar_url":"https://avatars3.githubusercontent.com/u/10076879?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-neal","html_url":"https://github.com/jason-neal","followers_url":"https://api.github.com/users/jason-neal/followers","following_url":"https://api.github.com/users/jason-neal/following{/other_user}","gists_url":"https://api.github.com/users/jason-neal/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-neal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-neal/subscriptions","organizations_url":"https://api.github.com/users/jason-neal/orgs","repos_url":"https://api.github.com/users/jason-neal/repos","events_url":"https://api.github.com/users/jason-neal/events{/privacy}","received_events_url":"https://api.github.com/users/jason-neal/received_events","type":"User","site_admin":false},"repo":{"id":76452634,"node_id":"MDEwOlJlcG9zaXRvcnk3NjQ1MjYzNA==","name":"eniric","full_name":"jason-neal/eniric","owner":{"login":"jason-neal","id":10076879,"node_id":"MDQ6VXNlcjEwMDc2ODc5","avatar_url":"https://avatars3.githubusercontent.com/u/10076879?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-neal","html_url":"https://github.com/jason-neal","followers_url":"https://api.github.com/users/jason-neal/followers","following_url":"https://api.github.com/users/jason-neal/following{/other_user}","gists_url":"https://api.github.com/users/jason-neal/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-neal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-neal/subscriptions","organizations_url":"https://api.github.com/users/jason-neal/orgs","repos_url":"https://api.github.com/users/jason-neal/repos","events_url":"https://api.github.com/users/jason-neal/events{/privacy}","received_events_url":"https://api.github.com/users/jason-neal/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jason-neal/eniric","description":"Extended Near InfraRed spectra Information Content analysis.","fork":false,"url":"https://api.github.com/repos/jason-neal/eniric","forks_url":"https://api.github.com/repos/jason-neal/eniric/forks","keys_url":"https://api.github.com/repos/jason-neal/eniric/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jason-neal/eniric/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jason-neal/eniric/teams","hooks_url":"https://api.github.com/repos/jason-neal/eniric/hooks","issue_events_url":"https://api.github.com/repos/jason-neal/eniric/issues/events{/number}","events_url":"https://api.github.com/repos/jason-neal/eniric/events","assignees_url":"https://api.github.com/repos/jason-neal/eniric/assignees{/user}","branches_url":"https://api.github.com/repos/jason-neal/eniric/branches{/branch}","tags_url":"https://api.github.com/repos/jason-neal/eniric/tags","blobs_url":"https://api.github.com/repos/jason-neal/eniric/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jason-neal/eniric/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jason-neal/eniric/git/refs{/sha}","trees_url":"https://api.github.com/repos/jason-neal/eniric/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jason-neal/eniric/statuses/{sha}","languages_url":"https://api.github.com/repos/jason-neal/eniric/languages","stargazers_url":"https://api.github.com/repos/jason-neal/eniric/stargazers","contributors_url":"https://api.github.com/repos/jason-neal/eniric/contributors","subscribers_url":"https://api.github.com/repos/jason-neal/eniric/subscribers","subscription_url":"https://api.github.com/repos/jason-neal/eniric/subscription","commits_url":"https://api.github.com/repos/jason-neal/eniric/commits{/sha}","git_commits_url":"https://api.github.com/repos/jason-neal/eniric/git/commits{/sha}","comments_url":"https://api.github.com/repos/jason-neal/eniric/comments{/number}","issue_comment_url":"https://api.github.com/repos/jason-neal/eniric/issues/comments{/number}","contents_url":"https://api.github.com/repos/jason-neal/eniric/contents/{+path}","compare_url":"https://api.github.com/repos/jason-neal/eniric/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jason-neal/eniric/merges","archive_url":"https://api.github.com/repos/jason-neal/eniric/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jason-neal/eniric/downloads","issues_url":"https://api.github.com/repos/jason-neal/eniric/issues{/number}","pulls_url":"https://api.github.com/repos/jason-neal/eniric/pulls{/number}","milestones_url":"https://api.github.com/repos/jason-neal/eniric/milestones{/number}","notifications_url":"https://api.github.com/repos/jason-neal/eniric/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jason-neal/eniric/labels{/name}","releases_url":"https://api.github.com/repos/jason-neal/eniric/releases{/id}","deployments_url":"https://api.github.com/repos/jason-neal/eniric/deployments","created_at":"2016-12-14T11:14:31Z","updated_at":"2018-08-09T10:10:08Z","pushed_at":"2018-08-13T12:21:40Z","git_url":"git://github.com/jason-neal/eniric.git","ssh_url":"git@github.com:jason-neal/eniric.git","clone_url":"https://github.com/jason-neal/eniric.git","svn_url":"https://github.com/jason-neal/eniric","homepage":"","size":335985,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":1,"open_issues":9,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/82"},"html":{"href":"https://github.com/jason-neal/eniric/pull/82"},"issue":{"href":"https://api.github.com/repos/jason-neal/eniric/issues/82"},"comments":{"href":"https://api.github.com/repos/jason-neal/eniric/issues/82/comments"},"review_comments":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/82/comments"},"review_comment":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jason-neal/eniric/pulls/82/commits"},"statuses":{"href":"https://api.github.com/repos/jason-neal/eniric/statuses/9e2f0fb3d39ce249b9a94609bfcb776692d66a31"}},"author_association":"OWNER"}}
{"actor":{"display_login":"codacy-bot"}}