{"action":"created","comment":{"url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/comments/23466911","id":23466911,"diff_hunk":"@@ -0,0 +1,402 @@\n+# Licensed under a 3-clause BSD style license - see LICENSE.rst\n+\"\"\"\n+Defines coordinate frames and ties them to data axes.\n+\"\"\"\n+from __future__ import division, print_function\n+\n+import numpy as np\n+from astropy import time\n+from astropy import units as u\n+from astropy import utils as astutil\n+from astropy import coordinates as coo\n+from astropy.coordinates import (BaseCoordinateFrame, FrameAttribute,\n+                                 RepresentationMapping)\n+\n+from . import spectral_builtin_frames\n+from .spectral_builtin_frames import *\n+from .representation import *\n+\n+\n+__all__ = ['DetectorFrame', 'CelestialFrame', 'SpectralFrame', 'TimeFrame',\n+           'CompositeFrame', 'FocalPlaneFrame']\n+\n+\n+STANDARD_REFERENCE_POSITION = [\"GEOCENTER\", \"BARYCENTER\", \"HELIOCENTER\",\n+                               \"TOPOCENTER\", \"LSR\", \"LSRK\", \"LSRD\",\n+                               \"GALACTIC_CENTER\", \"MOON\", \"LOCAL_GROUP_CENTER\"]\n+\n+\n+class CoordinateFrame(object):\n+    \"\"\"\n+    Base class for CoordinateFrames\n+\n+    Parameters\n+    ----------\n+    naxes : int\n+        Number of axes.\n+    axes_order : tuple\n+        A mapping of inputs to coordinate frame axes order.\n+    reference_frame : astropy.coordinates.builtin_frames or spectral_builtin_frames\n+        Reference frame (see subclasses).\n+    reference_position : str or tuple\n+        Reference position - one of ``STANDARD_REFERENCE_POSITION`` or a tuple of floats\n+    unit : list\n+        Unit for each axis.\n+    axes_names : list\n+        Names of the axes in this frame, in the order of axes_order.\n+    name : str\n+        Name of this frame.\n+    \"\"\"\n+    def __init__(self, naxes, axes_order=(0, 1), reference_frame=None, reference_position=None,\n+                 unit=None, axes_names=None, name=None):\n+        \"\"\" Initialize a frame\"\"\"\n+        self._axes_order = axes_order\n+        # map data axis into frame axes - 0-based\n+        self._naxes = naxes\n+\n+        if unit is not None:\n+            if astutil.isiterable(unit):\n+                if len(unit) != naxes:\n+                    raise ValueError(\"Number of units does not match number of axes.\")\n+                else:\n+                    self._unit = [u.Unit(au) for au in unit]\n+            else:\n+                self._unit = [u.Unit(unit)]\n+        else:\n+            self._unit = reference_frame.representation_component_units.values()\n+\n+        if axes_names is not None and astutil.isiterable(axes_names):\n+            if len(axes_names) != naxes:\n+                raise ValueError(\"Number of axes names does not match number of axes.\")\n+        else:\n+            axes_names = reference_frame.representation_component_names.values()\n+        self._axes_names = axes_names\n+\n+        self._reference_frame = reference_frame\n+\n+        if name is None:\n+            try:\n+                self._name = reference_frame.name\n+            except AttributeError:\n+                self._name = repr(reference_frame)\n+        else:\n+            self._name = name\n+\n+        if reference_position is not None:\n+            self._reference_position = reference_position\n+        else:\n+            try:\n+                self._reference_position = reference_frame.reference_position\n+            except AttributeError:\n+                self._reference_position = None\n+\n+        super(CoordinateFrame, self).__init__()\n+\n+    def __repr__(self):\n+        '''\n+        if self._name is not None:\n+            return self._name\n+        else:\n+            return \"\"\n+        '''\n+        fmt = \"<{0}({1}, axes_order={2}, reference_frame={3}, reference_position{4},\"\n+        \"unit={5}, axes_names={6}, name={7})>\".format(\n+            self.__class__.__name__, self.naxes, self.axes_order,\n+            self.reference_frame, self.reference_position, self.unit,\n+            self.axes_names, self.name)\n+        return fmt\n+\n+    def __str__(self):\n+        if self._name is not None:\n+            return self._name\n+        else:\n+            return self.__class__.__name__\n+\n+    @property\n+    def name(self):\n+        return self._name\n+\n+    @name.setter\n+    def name(self, val):\n+        self._name = name\n+\n+    @property\n+    def naxes(self):\n+        return self._naxes\n+\n+    @property\n+    def unit(self):\n+        return self._unit\n+\n+    @property\n+    def axes_names(self):\n+        return self._axes_names\n+\n+    @property\n+    def reference_frame(self):\n+        return self._reference_frame\n+\n+    @property\n+    def reference_position(self):\n+        try:\n+            return self._reference_position\n+        except AttributeError:\n+            return None\n+\n+    @property\n+    def axes_order(self):\n+        return self._axes_order\n+\n+    def transform_to(self, other):\n+        \"\"\"\n+        Transform from the current reference system to other\n+        \"\"\"\n+        raise NotImplementedError(\"Subclasses should implement this\")\n+\n+    def world_coordinates(self, *args):\n+        \"\"\" Create world coordinates object\"\"\"\n+        raise NotImplementedError(\"Subclasses may implement this\")\n+\n+\n+class TimeFrame(CoordinateFrame):\n+    \"\"\"\n+    Time Frame\n+\n+    Parameters\n+    ----------\n+    scale : str\n+        time scale, one of ``standard_time_scale``\n+    format : str\n+        time representation\n+    obslat : float or ``astropy.coordinates.Latitude``\n+        observer's latitude\n+    obslon : float or ``astropy.coordinates.Longitude``\n+        observer's longitude\n+     units : str or ``astropy.units.Unit``\n+        unit for each axis\n+    axes_names : list of str\n+        names of the axes in this frame\n+    \"\"\"\n+\n+    standard_time_scale = time.Time.SCALES\n+\n+    time_format = time.Time.FORMATS\n+\n+    def __init__(self, scale, format, obslat=0., obslon=0., units=\"s\", axes_names=\"Time\", name=\"Time\"):\n+        assert scale in self.standard_time_scale, \"Unrecognized time scale\"\n+        assert format in self.time_format, \"Unrecognized time representation\"\n+        super(TimeFrame, self).__init__(1, units=[units], axes_names=[axes_names], name=name)\n+        self._scale = scale\n+        self._format = format\n+        self._obslat = obslat\n+        self._obslon = obslon\n+\n+    def transform_to(self, val, tosys, val2=None, precision=None, in_subfmt=None,\n+                     out_subfmt=None, copy=False):\n+        \"\"\"Transforms to a different scale/representation\"\"\"\n+\n+        t = time.Time(val, val2, format=self._format, scale=self._scale,\n+                      precision=precision, in_subfmt=in_subfmt, out_subfmt=out_subfmt,\n+                      lat=self._obslat, lon=self._obslon)\n+        return getattr(t, tosys)\n+\n+\n+class CelestialFrame(CoordinateFrame):\n+    \"\"\"\n+    Celestial Frame Representation.\n+\n+    Parameters\n+    ----------\n+    reference_frame : astropy.coordinates.builtin_frames instance\n+        A reference frame.\n+    axes_order : tuple\n+        A mapping of inputs to coordinate frame axes order.\n+    reference_position : str\n+        Reference position.\n+    unit : str or units.Unit instance or iterable of those\n+        Units on axes.\n+\n+    \"\"\"\n+\n+    def __init__(self, reference_frame, axes_order=(0, 1), reference_position=None,\n+                 unit=[u.degree, u.degree], name=\"\"):\n+        reference_position = 'Barycenter' #??\n+        if reference_frame.name.upper() in coo.builtin_frames.__all__:\n+            axes_names = reference_frame.representation_component_names.keys()[:2]\n+        super(CelestialFrame, self).__init__(naxes=2, reference_frame=reference_frame,\n+                                             unit=unit, axes_order= axes_order,\n+                                             reference_position=reference_position,\n+                                             axes_names=axes_names, name=name)\n+\n+    def world_coordinates(self, lon, lat):\n+        \"\"\"\n+        Create a SkyCoord object.\n+\n+        Parameters\n+        ----------\n+        lon, lat : float\n+            longitude and latitude\n+        \"\"\"\n+        return coo.SkyCoord(lon, lat, unit=self.unit, frame=self._reference_frame)\n+\n+    def __repr__(self):\n+\n+        fmt = \"<CelestialFrame(reference_frame={0}, axes_order={1}, reference_position={2}, \\\n+        unit={3}, name={4})>\".format(\n+                                 self.reference_frame, self.axes_order,\n+                                 self.reference_position, self.unit, self.name)\n+        return fmt\n+\n+\n+    def transform_to(self, lat, lon, other):\n+        \"\"\"\n+        Transform from the current reference frame to other.\n+\n+        Parameters\n+        ----------\n+        lon, lat : float\n+            longitude and latitude\n+        other : str or `BaseCoordinateFrame` class\n+            The frame to transform this coordinate into.\n+        \"\"\"\n+        return self.world_coordinates(lon, lat).transform_to(other)\n+\n+\n+class SpectralFrame(CoordinateFrame):\n+    \"\"\"\n+    Represents Spectral Frame\n+\n+    Parameters\n+    ----------\n+    reference_frame : astropy.coordinates.BaseCoordinateFrame\n+        One of spectral_builtin_frame.\n+    axes_order : tuple\n+        A mapping of inputs to coordinate frame axes order.\n+    unit : str or units.Unit instance\n+        Spectral unit.\n+    axes_names : str\n+        Spectral axis name.\n+    name : str\n+        Name for this frame.\n+\n+    \"\"\"\n+\n+    def __init__(self, reference_frame, axes_order=(0,), unit=None, axes_names=None, name=\"\"):\n+        super(SpectralFrame, self).__init__(naxes=1, reference_frame=reference_frame,\n+                                            axes_order=axes_order,\n+                                            axes_names=axes_names,\n+                                            unit=unit, name=name)\n+\n+    def __repr__(self):\n+        fmt = \"<SpectralFrame(reference_frame={0}, unit={1}, axes_names={2}, axes_order={3}, name={4})>\".format(\n+            self.reference_frame, self.unit,\n+            self.axes_names, self.axes_order, self.name)\n+        return fmt\n+\n+    def world_coordinates(self, value):\n+        \"\"\"\n+        Create a SkyCoord object.\n+\n+        Parameters\n+        ----------\n+        value : float\n+            Coordinate value.\n+        \"\"\"\n+        return self.reference_frame.realize_frame(Cartesian1DRepresentation(value * u.Unit(self.unit[0])))\n+\n+    def transform_to(self, x, other):\n+        \"\"\"\n+        Transform from the current reference frame to other.\n+\n+        Parameters\n+        ----------\n+        x : float or array-like\n+        other : str or `BaseCoordinateFrame` class\n+            The frame to transform this coordinate into.\n+        \"\"\"\n+        return self.world_coordinates(x).transform_to(other)\n+\n+\n+class CompositeFrame(CoordinateFrame):\n+    \"\"\"\n+    Represents one or more frames.\n+\n+    Parameters\n+    ----------\n+    frames : list\n+        List of frames (TimeFrame, CelestialFrame, SpectralFrame, CoordinateFrame).\n+    name : str\n+        Name for this frame.\n+\n+    \"\"\"\n+    def __init__(self, frames, name=\"\"):\n+        \"\"\"\n+        naxes, axes_order=(0, 1), reference_frame=None, reference_position=None,\n+                 unit=None, axes_names=None, name=None):\n+\n+\n+        \"\"\"\n+        self._frames = frames[:]\n+        naxes = sum([frame._naxes for frame in self._frames])\n+        unit = []\n+        axes_order = []\n+        axes_names = []\n+        for frame in frames:\n+            unit.extend(frame.unit)\n+            axes_order.extend(frame.axes_order)\n+            axes_names.extend(frame.axes_names)\n+        super(CompositeFrame, self).__init__(naxes, axes_order=axes_order,\n+                                             unit=unit, axes_names=axes_names,\n+                                             name=name)\n+\n+    @property\n+    def frames(self):\n+        return self._frames\n+\n+    def __repr__(self):\n+        return repr(self.frames)\n+\n+    def world_coordinates(self, *args):\n+        \"\"\"\n+        Create world coordinates.\n+        \"\"\"\n+        if len(args) != self.naxes:\n+            raise TypeError(\"Expected {0} arguments ({1} given)\".format(len(args), self.naxes))\n+        result = ()\n+        n = 0\n+        for frame in self.frames:\n+            result += (frame.world_coordinates(*args[n : frame.naxes + n]), )\n+            n = frame.naxes\n+        return result","path":"gwcs/coordinate_frames.py","position":370,"original_position":370,"commit_id":"ed07458bd8a558010020e24c5040e05a0bb0fc61","original_commit_id":"ed07458bd8a558010020e24c5040e05a0bb0fc61","user":{"login":"mdboom","id":38294,"avatar_url":"https://avatars.githubusercontent.com/u/38294?v=3","gravatar_id":"","url":"https://api.github.com/users/mdboom","html_url":"https://github.com/mdboom","followers_url":"https://api.github.com/users/mdboom/followers","following_url":"https://api.github.com/users/mdboom/following{/other_user}","gists_url":"https://api.github.com/users/mdboom/gists{/gist_id}","starred_url":"https://api.github.com/users/mdboom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mdboom/subscriptions","organizations_url":"https://api.github.com/users/mdboom/orgs","repos_url":"https://api.github.com/users/mdboom/repos","events_url":"https://api.github.com/users/mdboom/events{/privacy}","received_events_url":"https://api.github.com/users/mdboom/received_events","type":"User","site_admin":false},"body":"This can come later, but we'll probably want some tools to work with this.  Say you have some complicated nested thing like:\r\n\r\n```\r\n[CelestialFrame(...), CompositeFrame([SpectralFrame(...), TimeFrame(...)])]\r\n```\r\n\r\nit would probably be helpful to have a method that takes an axis number and returns the frame object it's actually in as well as an index into that frame (in the case of multi-axis frames like Celestial).","created_at":"2015-01-23T17:55:05Z","updated_at":"2015-01-23T17:55:05Z","html_url":"https://github.com/spacetelescope/gwcs/pull/1#discussion_r23466911","pull_request_url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/comments/23466911"},"html":{"href":"https://github.com/spacetelescope/gwcs/pull/1#discussion_r23466911"},"pull_request":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1","id":27928377,"html_url":"https://github.com/spacetelescope/gwcs/pull/1","diff_url":"https://github.com/spacetelescope/gwcs/pull/1.diff","patch_url":"https://github.com/spacetelescope/gwcs/pull/1.patch","issue_url":"https://api.github.com/repos/spacetelescope/gwcs/issues/1","number":1,"state":"open","locked":false,"title":"Add coordinate frames","user":{"login":"nden","id":1110361,"avatar_url":"https://avatars.githubusercontent.com/u/1110361?v=3","gravatar_id":"","url":"https://api.github.com/users/nden","html_url":"https://github.com/nden","followers_url":"https://api.github.com/users/nden/followers","following_url":"https://api.github.com/users/nden/following{/other_user}","gists_url":"https://api.github.com/users/nden/gists{/gist_id}","starred_url":"https://api.github.com/users/nden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nden/subscriptions","organizations_url":"https://api.github.com/users/nden/orgs","repos_url":"https://api.github.com/users/nden/repos","events_url":"https://api.github.com/users/nden/events{/privacy}","received_events_url":"https://api.github.com/users/nden/received_events","type":"User","site_admin":false},"body":"Initial implementation of coordinate frames.\r\n@mdboom @perrygreenfield any comments?","created_at":"2015-01-23T14:49:19Z","updated_at":"2015-01-23T17:55:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1/commits","review_comments_url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1/comments","review_comment_url":"https://api.github.com/repos/spacetelescope/gwcs/pulls/comments/{number}","comments_url":"https://api.github.com/repos/spacetelescope/gwcs/issues/1/comments","statuses_url":"https://api.github.com/repos/spacetelescope/gwcs/statuses/ed07458bd8a558010020e24c5040e05a0bb0fc61","head":{"label":"nden:add-coordinate-frames","ref":"add-coordinate-frames","sha":"ed07458bd8a558010020e24c5040e05a0bb0fc61","user":{"login":"nden","id":1110361,"avatar_url":"https://avatars.githubusercontent.com/u/1110361?v=3","gravatar_id":"","url":"https://api.github.com/users/nden","html_url":"https://github.com/nden","followers_url":"https://api.github.com/users/nden/followers","following_url":"https://api.github.com/users/nden/following{/other_user}","gists_url":"https://api.github.com/users/nden/gists{/gist_id}","starred_url":"https://api.github.com/users/nden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nden/subscriptions","organizations_url":"https://api.github.com/users/nden/orgs","repos_url":"https://api.github.com/users/nden/repos","events_url":"https://api.github.com/users/nden/events{/privacy}","received_events_url":"https://api.github.com/users/nden/received_events","type":"User","site_admin":false},"repo":{"id":29211892,"name":"gwcs","full_name":"nden/gwcs","owner":{"login":"nden","id":1110361,"avatar_url":"https://avatars.githubusercontent.com/u/1110361?v=3","gravatar_id":"","url":"https://api.github.com/users/nden","html_url":"https://github.com/nden","followers_url":"https://api.github.com/users/nden/followers","following_url":"https://api.github.com/users/nden/following{/other_user}","gists_url":"https://api.github.com/users/nden/gists{/gist_id}","starred_url":"https://api.github.com/users/nden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nden/subscriptions","organizations_url":"https://api.github.com/users/nden/orgs","repos_url":"https://api.github.com/users/nden/repos","events_url":"https://api.github.com/users/nden/events{/privacy}","received_events_url":"https://api.github.com/users/nden/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nden/gwcs","description":"Generalized World Coordinate System: provides tools to create and work with WCS in a general way","fork":true,"url":"https://api.github.com/repos/nden/gwcs","forks_url":"https://api.github.com/repos/nden/gwcs/forks","keys_url":"https://api.github.com/repos/nden/gwcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nden/gwcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nden/gwcs/teams","hooks_url":"https://api.github.com/repos/nden/gwcs/hooks","issue_events_url":"https://api.github.com/repos/nden/gwcs/issues/events{/number}","events_url":"https://api.github.com/repos/nden/gwcs/events","assignees_url":"https://api.github.com/repos/nden/gwcs/assignees{/user}","branches_url":"https://api.github.com/repos/nden/gwcs/branches{/branch}","tags_url":"https://api.github.com/repos/nden/gwcs/tags","blobs_url":"https://api.github.com/repos/nden/gwcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nden/gwcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nden/gwcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/nden/gwcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nden/gwcs/statuses/{sha}","languages_url":"https://api.github.com/repos/nden/gwcs/languages","stargazers_url":"https://api.github.com/repos/nden/gwcs/stargazers","contributors_url":"https://api.github.com/repos/nden/gwcs/contributors","subscribers_url":"https://api.github.com/repos/nden/gwcs/subscribers","subscription_url":"https://api.github.com/repos/nden/gwcs/subscription","commits_url":"https://api.github.com/repos/nden/gwcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/nden/gwcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/nden/gwcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/nden/gwcs/issues/comments/{number}","contents_url":"https://api.github.com/repos/nden/gwcs/contents/{+path}","compare_url":"https://api.github.com/repos/nden/gwcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nden/gwcs/merges","archive_url":"https://api.github.com/repos/nden/gwcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nden/gwcs/downloads","issues_url":"https://api.github.com/repos/nden/gwcs/issues{/number}","pulls_url":"https://api.github.com/repos/nden/gwcs/pulls{/number}","milestones_url":"https://api.github.com/repos/nden/gwcs/milestones{/number}","notifications_url":"https://api.github.com/repos/nden/gwcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nden/gwcs/labels{/name}","releases_url":"https://api.github.com/repos/nden/gwcs/releases{/id}","created_at":"2015-01-13T21:22:54Z","updated_at":"2015-01-13T21:22:55Z","pushed_at":"2015-01-22T22:15:53Z","git_url":"git://github.com/nden/gwcs.git","ssh_url":"git@github.com:nden/gwcs.git","clone_url":"https://github.com/nden/gwcs.git","svn_url":"https://github.com/nden/gwcs","homepage":null,"size":87,"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":"spacetelescope:master","ref":"master","sha":"bdf45f2200212bdf7f9d06ec6e52e4c1d9d8cd5f","user":{"login":"spacetelescope","id":2751928,"avatar_url":"https://avatars.githubusercontent.com/u/2751928?v=3","gravatar_id":"","url":"https://api.github.com/users/spacetelescope","html_url":"https://github.com/spacetelescope","followers_url":"https://api.github.com/users/spacetelescope/followers","following_url":"https://api.github.com/users/spacetelescope/following{/other_user}","gists_url":"https://api.github.com/users/spacetelescope/gists{/gist_id}","starred_url":"https://api.github.com/users/spacetelescope/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spacetelescope/subscriptions","organizations_url":"https://api.github.com/users/spacetelescope/orgs","repos_url":"https://api.github.com/users/spacetelescope/repos","events_url":"https://api.github.com/users/spacetelescope/events{/privacy}","received_events_url":"https://api.github.com/users/spacetelescope/received_events","type":"Organization","site_admin":false},"repo":{"id":29208937,"name":"gwcs","full_name":"spacetelescope/gwcs","owner":{"login":"spacetelescope","id":2751928,"avatar_url":"https://avatars.githubusercontent.com/u/2751928?v=3","gravatar_id":"","url":"https://api.github.com/users/spacetelescope","html_url":"https://github.com/spacetelescope","followers_url":"https://api.github.com/users/spacetelescope/followers","following_url":"https://api.github.com/users/spacetelescope/following{/other_user}","gists_url":"https://api.github.com/users/spacetelescope/gists{/gist_id}","starred_url":"https://api.github.com/users/spacetelescope/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spacetelescope/subscriptions","organizations_url":"https://api.github.com/users/spacetelescope/orgs","repos_url":"https://api.github.com/users/spacetelescope/repos","events_url":"https://api.github.com/users/spacetelescope/events{/privacy}","received_events_url":"https://api.github.com/users/spacetelescope/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spacetelescope/gwcs","description":"Generalized World Coordinate System: provides tools to create and work with WCS in a general way","fork":false,"url":"https://api.github.com/repos/spacetelescope/gwcs","forks_url":"https://api.github.com/repos/spacetelescope/gwcs/forks","keys_url":"https://api.github.com/repos/spacetelescope/gwcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spacetelescope/gwcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spacetelescope/gwcs/teams","hooks_url":"https://api.github.com/repos/spacetelescope/gwcs/hooks","issue_events_url":"https://api.github.com/repos/spacetelescope/gwcs/issues/events{/number}","events_url":"https://api.github.com/repos/spacetelescope/gwcs/events","assignees_url":"https://api.github.com/repos/spacetelescope/gwcs/assignees{/user}","branches_url":"https://api.github.com/repos/spacetelescope/gwcs/branches{/branch}","tags_url":"https://api.github.com/repos/spacetelescope/gwcs/tags","blobs_url":"https://api.github.com/repos/spacetelescope/gwcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spacetelescope/gwcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spacetelescope/gwcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/spacetelescope/gwcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spacetelescope/gwcs/statuses/{sha}","languages_url":"https://api.github.com/repos/spacetelescope/gwcs/languages","stargazers_url":"https://api.github.com/repos/spacetelescope/gwcs/stargazers","contributors_url":"https://api.github.com/repos/spacetelescope/gwcs/contributors","subscribers_url":"https://api.github.com/repos/spacetelescope/gwcs/subscribers","subscription_url":"https://api.github.com/repos/spacetelescope/gwcs/subscription","commits_url":"https://api.github.com/repos/spacetelescope/gwcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/spacetelescope/gwcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/spacetelescope/gwcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/spacetelescope/gwcs/issues/comments/{number}","contents_url":"https://api.github.com/repos/spacetelescope/gwcs/contents/{+path}","compare_url":"https://api.github.com/repos/spacetelescope/gwcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spacetelescope/gwcs/merges","archive_url":"https://api.github.com/repos/spacetelescope/gwcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spacetelescope/gwcs/downloads","issues_url":"https://api.github.com/repos/spacetelescope/gwcs/issues{/number}","pulls_url":"https://api.github.com/repos/spacetelescope/gwcs/pulls{/number}","milestones_url":"https://api.github.com/repos/spacetelescope/gwcs/milestones{/number}","notifications_url":"https://api.github.com/repos/spacetelescope/gwcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spacetelescope/gwcs/labels{/name}","releases_url":"https://api.github.com/repos/spacetelescope/gwcs/releases{/id}","created_at":"2015-01-13T20:16:16Z","updated_at":"2015-01-13T22:05:06Z","pushed_at":"2015-01-13T22:05:06Z","git_url":"git://github.com/spacetelescope/gwcs.git","ssh_url":"git@github.com:spacetelescope/gwcs.git","clone_url":"https://github.com/spacetelescope/gwcs.git","svn_url":"https://github.com/spacetelescope/gwcs","homepage":null,"size":116,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1"},"html":{"href":"https://github.com/spacetelescope/gwcs/pull/1"},"issue":{"href":"https://api.github.com/repos/spacetelescope/gwcs/issues/1"},"comments":{"href":"https://api.github.com/repos/spacetelescope/gwcs/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/spacetelescope/gwcs/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/spacetelescope/gwcs/statuses/ed07458bd8a558010020e24c5040e05a0bb0fc61"}}}}