{"action":"created","comment":{"url":"https://api.github.com/repos/astropy/astropy/pulls/comments/227160130","pull_request_review_id":167136147,"id":227160130,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNzE2MDEzMA==","diff_hunk":"@@ -543,175 +282,87 @@ def test_identity_input():\n     model = ident1 & shift | rotation\n     assert_allclose(model(1, 2), [-3.0, 1.0])\n \n-    # Same test case but using class composition\n-    TestModel = ident1 & Shift | Rotation2D\n-    model = TestModel(offset_1=1, angle_2=90)\n-    assert_allclose(model(1, 2), [-3.0, 1.0])\n-\n \n-def test_slicing_on_instances_2():\n+def test_invalid_operands():\n     \"\"\"\n-    More slicing tests.\n-\n-    Regression test for https://github.com/embray/astropy/pull/10\n+    Test that certain operators do not work with models whose inputs/outputs do\n+    not match up correctly.\n     \"\"\"\n \n-    model_a = Shift(1, name='a')\n-    model_b = Shift(2, name='b')\n-    model_c = Rotation2D(3, name='c')\n-    model_d = Scale(2, name='d')\n-    model_e = Scale(3, name='e')\n-\n-    m = (model_a & model_b) | model_c | (model_d & model_e)\n-\n-    with pytest.raises(ModelDefinitionError):\n-        # The slice can't actually be taken since the resulting model cannot be\n-        # evaluated\n-        assert m[1:].submodel_names == ('b', 'c', 'd', 'e')\n-\n-    assert m[:].submodel_names == ('a', 'b', 'c', 'd', 'e')\n-    assert m['a':].submodel_names == ('a', 'b', 'c', 'd', 'e')\n-\n     with pytest.raises(ModelDefinitionError):\n-        assert m['c':'d'].submodel_names == ('c', 'd')\n-\n-    assert m[1:2].name == 'b'\n-    assert m[2:7].submodel_names == ('c', 'd', 'e')\n-    with pytest.raises(IndexError):\n-        m['x']\n-    with pytest.raises(IndexError):\n-        m['a': 'r']\n-\n-    with pytest.raises(ModelDefinitionError):\n-        assert m[-4:4].submodel_names == ('b', 'c', 'd')\n+        Rotation2D(90) | Gaussian1D(1, 0, 0.1)\n \n     with pytest.raises(ModelDefinitionError):\n-        assert m[-4:-2].submodel_names == ('b', 'c')\n-\n-\n-def test_slicing_on_instances_3():\n-    \"\"\"\n-    Like `test_slicing_on_instances_2` but uses a compound model that does not\n-    have any invalid slices due to the resulting model being invalid\n-    (originally test_slicing_on_instances_2 passed without any\n-    ModelDefinitionErrors being raised, but that was before we prevented\n-    invalid models from being created).\n-    \"\"\"\n-\n-    model_a = Shift(1, name='a')\n-    model_b = Shift(2, name='b')\n-    model_c = Gaussian1D(3, 0, 0.1, name='c')\n-    model_d = Scale(2, name='d')\n-    model_e = Scale(3, name='e')\n-\n-    m = (model_a + model_b) | model_c | (model_d + model_e)\n-\n-    assert m[1:].submodel_names == ('b', 'c', 'd', 'e')\n-    assert m[:].submodel_names == ('a', 'b', 'c', 'd', 'e')\n-    assert m['a':].submodel_names == ('a', 'b', 'c', 'd', 'e')\n-    assert m['c':'d'].submodel_names == ('c', 'd')\n-    assert m[1:2].name == 'b'\n-    assert m[2:7].submodel_names == ('c', 'd', 'e')\n-    with pytest.raises(IndexError):\n-        m['x']\n-    with pytest.raises(IndexError):\n-        m['a': 'r']\n-    assert m[-4:4].submodel_names == ('b', 'c', 'd')\n-    assert m[-4:-2].submodel_names == ('b', 'c')\n-\n-\n-def test_slicing_on_instance_with_parameterless_model():\n-    \"\"\"\n-    Regression test to fix an issue where the indices attached to parameter\n-    names on a compound model were not handled properly when one or more\n-    submodels have no parameters.  This was especially evident in slicing.\n-    \"\"\"\n-\n-    p2 = Polynomial2D(1, c0_0=1, c1_0=2, c0_1=3)\n-    p1 = Polynomial2D(1, c0_0=1, c1_0=2, c0_1=3)\n-    mapping = Mapping((0, 1, 0, 1))\n-    offx = Shift(-2, name='x_translation')\n-    offy = Shift(-1, name='y_translation')\n-    aff = AffineTransformation2D(matrix=[[1, 2], [3, 4]], name='rotation')\n-    model = mapping | (p1 & p2) | (offx & offy) | aff\n-\n-    assert model.param_names == ('c0_0_1', 'c1_0_1', 'c0_1_1',\n-                                 'c0_0_2', 'c1_0_2', 'c0_1_2',\n-                                 'offset_3', 'offset_4',\n-                                 'matrix_5', 'translation_5')\n-    assert model(1, 2) == (23.0, 53.0)\n-\n-    m = model[3:]\n-    assert m.param_names == ('offset_3', 'offset_4', 'matrix_5',\n-                             'translation_5')\n-    assert m(1, 2) == (1.0, 1.0)\n+        Rotation2D(90) + Gaussian1D(1, 0, 0.1)\n \n \n-def test_compound_model_with_nonstandard_broadcasting():\n+@pytest.mark.parametrize('poly', [Chebyshev2D(1, 2), Polynomial2D(2), Legendre2D(1, 2),\n+                                  Chebyshev1D(5), Legendre1D(5), Polynomial1D(5)])\n+def test_compound_with_polynomials(poly):\n     \"\"\"\n-    Ensure that the ``standard_broadcasting`` flag is properly propagated when\n-    creating compound models.\n-\n-    See the commit message for the commit in which this was added for more\n-    details.\n+    Tests that polynomials are scaled when used in compound models.\n+    Issue #3699\n     \"\"\"\n+    poly.parameters = [1, 2, 3, 4, 1, 2]\n+    shift = Shift(3)\n+    model = poly | shift\n+    x, y = np.mgrid[:20, :37]\n+    result_compound = model(x, y)\n+    result = shift(poly(x, y))\n+    assert_allclose(result, result_compound)\n \n-    offx = Shift(1)\n-    offy = Shift(2)\n-    rot = AffineTransformation2D([[0, -1], [1, 0]])\n-    m = (offx & offy) | rot\n-\n-    x, y = m(0, 0)\n-    assert x == -2\n-    assert y == 1\n-\n-    # make sure conversion back to scalars is working properly\n-    assert isinstance(x, float)\n-    assert isinstance(y, float)\n-\n-    x, y = m([0, 1, 2], [0, 1, 2])\n-    assert np.all(x == [-2, -3, -4])\n-    assert np.all(y == [1, 2, 3])\n-\n-\n-def test_compound_model_classify_attributes():\n-    \"\"\"\n-    Regression test for an issue raised here:\n-    https://github.com/astropy/astropy/pull/3231#discussion_r22221123\n \n-    The issue is that part of the `help` implementation calls a utility\n-    function called `inspect.classify_class_attrs`, which was leading to an\n-    infinite recursion.\n+# def test_variable_substitution():\n+#     g1 = Gaussian2D(1, 0, 0, 1, 2)\n+#     g2 = Gaussian2D(1.5, .5, -.2, .5, .3)\n+#     sg1_1 = g1 % {1: 0}\n+#     assert_almost_equal(sg1_1(0), g1(0, 0))\n+#     sg1_2 = g1 % {'x': 1}\n+#     assert_almost_equal(sg1_2(1.5), g1(1, 1.5))\n+#     gg1 = g1 & g2\n+#     sgg1_1 = gg1 % {1: 0.1, 3: 0.2}\n+#     assert_almost_equal(sgg1_1(0, 0), gg1(0, 0.1, 0, 0.2))\n+#     sgg1_2 = gg1 % {'x0': -.1, 2: .1}\n+#     assert_almost_equal(sgg1_2(1,1), gg1(-0.1, 1, 0.1, 1))\n+#     with pytest.raises(ValueError):\n+#         egg1 = gg1 % {'x0': 0, 0: 0}","path":"astropy/modeling/tests/test_compound.py","position":643,"original_position":643,"commit_id":"e11adc0c60fc8933914186bc4b74cf2fa6c9260c","original_commit_id":"e11adc0c60fc8933914186bc4b74cf2fa6c9260c","user":{"login":"drdavella","id":2458487,"node_id":"MDQ6VXNlcjI0NTg0ODc=","avatar_url":"https://avatars0.githubusercontent.com/u/2458487?v=4","gravatar_id":"","url":"https://api.github.com/users/drdavella","html_url":"https://github.com/drdavella","followers_url":"https://api.github.com/users/drdavella/followers","following_url":"https://api.github.com/users/drdavella/following{/other_user}","gists_url":"https://api.github.com/users/drdavella/gists{/gist_id}","starred_url":"https://api.github.com/users/drdavella/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drdavella/subscriptions","organizations_url":"https://api.github.com/users/drdavella/orgs","repos_url":"https://api.github.com/users/drdavella/repos","events_url":"https://api.github.com/users/drdavella/events{/privacy}","received_events_url":"https://api.github.com/users/drdavella/received_events","type":"User","site_admin":false},"body":"Just wondering whether this and other commented-out tests are supposed to run eventually or not? If they are no longer useful, they should be removed entirely. If they don't pass yet, it might be useful to see the failures on CI.","created_at":"2018-10-22T22:28:04Z","updated_at":"2018-10-22T22:28:04Z","html_url":"https://github.com/astropy/astropy/pull/7945#discussion_r227160130","pull_request_url":"https://api.github.com/repos/astropy/astropy/pulls/7945","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/astropy/astropy/pulls/comments/227160130"},"html":{"href":"https://github.com/astropy/astropy/pull/7945#discussion_r227160130"},"pull_request":{"href":"https://api.github.com/repos/astropy/astropy/pulls/7945"}}},"pull_request":{"url":"https://api.github.com/repos/astropy/astropy/pulls/7945","id":224799452,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI0Nzk5NDUy","html_url":"https://github.com/astropy/astropy/pull/7945","diff_url":"https://github.com/astropy/astropy/pull/7945.diff","patch_url":"https://github.com/astropy/astropy/pull/7945.patch","issue_url":"https://api.github.com/repos/astropy/astropy/issues/7945","number":7945,"state":"open","locked":false,"title":"Reworking astropy model core code","user":{"login":"perrygreenfield","id":981803,"node_id":"MDQ6VXNlcjk4MTgwMw==","avatar_url":"https://avatars0.githubusercontent.com/u/981803?v=4","gravatar_id":"","url":"https://api.github.com/users/perrygreenfield","html_url":"https://github.com/perrygreenfield","followers_url":"https://api.github.com/users/perrygreenfield/followers","following_url":"https://api.github.com/users/perrygreenfield/following{/other_user}","gists_url":"https://api.github.com/users/perrygreenfield/gists{/gist_id}","starred_url":"https://api.github.com/users/perrygreenfield/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/perrygreenfield/subscriptions","organizations_url":"https://api.github.com/users/perrygreenfield/orgs","repos_url":"https://api.github.com/users/perrygreenfield/repos","events_url":"https://api.github.com/users/perrygreenfield/events{/privacy}","received_events_url":"https://api.github.com/users/perrygreenfield/received_events","type":"User","site_admin":false},"body":"Since travis is not currently picking up the latest version, I'm submitting this before knowing what issue travis will raise. The compound-models.rst file doesn't pass doctests currently, but it needs significant editing.\r\n\r\nThe following describes major changes to the internals of modeling I’ve made over the past year. \r\n\r\nRationale for major changes to modeling:\r\n----------------------------------------\r\n\r\n0) [This may be more detail than some wish to see] Much of the original rationale was driven by improving the performance. At the time it seemed that compound models were using enormous amounts of memory for complex models (we are talking on the order of 90 component models and approximately 280 parameters). It appeared that parameter objects were being propagated at every node of the expression tree leading to a huge number of parameter object instances. But in doing the work, I don’t actually see how that happened since the previous implementation does go to pains to avoid such parameter creation. It may be that ASDF somehow triggered that regardless, or some other fix made since then has rectified the previous memory issue. Even so, the changes still appeared worthwhile for the reasons listed below.\r\n\r\n1) Removing use of the metaclass from compound models. It is not believed that generating compound classes through expressions is useful enough to justify the complexity introduced by yet another metaclass (the current implementation has the CompoundModel use a metaclass and is also a subclass of Model, which has its own metaclass as well. Besides the complexity of this approach, there are very unexpected results when mixing classes and instances within an expression. The new implementation is more straightforward in approach, though not necessarily shorter in lines of code (though probably as well since calls to other libraries implementing tree handling and such are now eliminated). Essentially, the primary approach is to make CompoundModels intrinsically tree structures, i.e., they are themselves nodes in the expression tree, rather than resulting in a tree attribute that mirrors the implied tree structure.\r\n\r\n2) Changing the semantics of parameters so that parameters are now not shared objects between models of the same class. This has many benefits since the previous behavior led to surprising results (e.g., corresponding parameters in compound models were disconnected from the value contained in the constituent models; change one and the other would not see the change). Making this change makes it simpler to clone models and change aspects of the parameters; something that is quite difficult to do now without resorting to interface violations or tedious construction of the arguments to the class constructor. Making changes to this effectively required a major reimplementation of compound models so these changes were coupled rather than implemented separately.\r\n\r\nChanges in Behavior or Interface\r\n--------------------------------\r\n\r\nThis version of modeling has made substantial internal changes to the implementation of modeling and their associated parameters. Some of these changes impact previous behavior. This will summarize the most important changes.\r\n\r\n1) Compound model classes are no longer supported. In previous versions it was possible to create a new model class (not instance!) by doing something like this:\r\n\r\nfrom astropy.modeling.models import Gaussian1D, Const1D\r\nNewCompoundClass = Gaussian1d + Const1D\r\n\r\nThat no longer is possible. It was removed to make the implementation simpler, as well as eliminate a number of odd results (particularly when combining classes with instances). As far as we know, there are not many uses of this capability, and most such uses have alternatives.\r\n\r\n2) Parameters now store their values within the parameter instance. Previously, all parameter values were stored with the model the parameters were defined with. This leads to differences in behavior. In the past, if one defined a compound model, the parameter values were copied to the compound model instance. If the parameter value was changed in the compound model, that would not be reflected in the parameter value in constituent model that made up part of the compound model. In the current implementation the compound model uses the parameter values within the constituent model so changes to that parameter affect both. With the new implementation, it is possible for multiple models to share the same parameter and thus all be affected by a change in its value. Implementing this change while retaining the syntactic convenience of Descriptors requires some trickery. This was implemented by retaining the definition of parameters at the class level. But now when a model is instantiated, copies of the parameter instances are made and referenced at the model instance level; the existence of these parameter instances in the model’s instance dict effectively shields the class level instances (so long as the class level instance is *not* a descriptor).\r\n\r\n3) When n_models > 1, previously the shape of the corresponding parameters removed the axis corresponding to the model_set_axis. Now the model_set_axis is part of the parameter shape. To illustrate:\r\n\r\nOld:\r\n\r\nIn [1]: g = Gaussian1D([1,1], [1,2], [2,4], n_models=2)\r\n\r\nIn [2]: g.amplitude\r\nOut[2]: Parameter('amplitude', value=[1. 1.])\r\n\r\nIn [3]: g.amplitude.shape\r\nOut[3]: ()\r\n\r\nNew:\r\n\r\nIn [1]: g = Gaussian1D([1,1], [1,2], [2,4], n_models=2)\r\n\r\nIn [2]: g.amplitude\r\nOut[2]: Parameter('amplitude', value=[1. 1.])\r\n\r\nIn [3]: g.amplitude.shape\r\nOut[3]: (2,)\r\n\r\n3) The implementation of the parameter validator method has changed though the behavior for most cases of use shouldn’t. But note, the current method stands double duty as a decorator and a method depending on the context. In the previous version the context was provided by whether the parameter had a link to a model. If not, it was interpreted as a decorator (it’s complicated; even though the use of the decorator is within a model, at the time the decorator is used, there is no link to the model—no, you don’t want to know the details). Since parameters no longer have links to the model, the method uses the type of the argument to distinguish the context. Callables imply decorator context; numbers imply method context. I recommend the method context be deprecated. A new method called “validate” is now available and recommended for that purpose.\r\n\r\n4) Generally we expect the new implementation is faster, particularly for more complex models. If you find cases where it is significantly slower, please file an issue.\r\n\r\nOther changes involve methods of compound model classes and parameter classes, mostly internal ones (i.e., ones that start with an underscore). The new compound model class no longer uses _CompoundModelMeta.\r\n","created_at":"2018-10-22T20:13:23Z","updated_at":"2018-10-22T22:28:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d8d903fddeb44be327088be72b688f2fb34e2700","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":316473427,"node_id":"MDU6TGFiZWwzMTY0NzM0Mjc=","url":"https://api.github.com/repos/astropy/astropy/labels/Refactoring","name":"Refactoring","color":"fef2c0","default":false},{"id":373761720,"node_id":"MDU6TGFiZWwzNzM3NjE3MjA=","url":"https://api.github.com/repos/astropy/astropy/labels/Work%20in%20progress","name":"Work in progress","color":"f9d0c4","default":false},{"id":35800382,"node_id":"MDU6TGFiZWwzNTgwMDM4Mg==","url":"https://api.github.com/repos/astropy/astropy/labels/modeling","name":"modeling","color":"c7def8","default":false},{"id":972437447,"node_id":"MDU6TGFiZWw5NzI0Mzc0NDc=","url":"https://api.github.com/repos/astropy/astropy/labels/run-asv","name":"run-asv","color":"c2e0c6","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/astropy/astropy/pulls/7945/commits","review_comments_url":"https://api.github.com/repos/astropy/astropy/pulls/7945/comments","review_comment_url":"https://api.github.com/repos/astropy/astropy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/astropy/astropy/issues/7945/comments","statuses_url":"https://api.github.com/repos/astropy/astropy/statuses/e11adc0c60fc8933914186bc4b74cf2fa6c9260c","head":{"label":"perrygreenfield:newparm_subclass_rebased","ref":"newparm_subclass_rebased","sha":"e11adc0c60fc8933914186bc4b74cf2fa6c9260c","user":{"login":"perrygreenfield","id":981803,"node_id":"MDQ6VXNlcjk4MTgwMw==","avatar_url":"https://avatars0.githubusercontent.com/u/981803?v=4","gravatar_id":"","url":"https://api.github.com/users/perrygreenfield","html_url":"https://github.com/perrygreenfield","followers_url":"https://api.github.com/users/perrygreenfield/followers","following_url":"https://api.github.com/users/perrygreenfield/following{/other_user}","gists_url":"https://api.github.com/users/perrygreenfield/gists{/gist_id}","starred_url":"https://api.github.com/users/perrygreenfield/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/perrygreenfield/subscriptions","organizations_url":"https://api.github.com/users/perrygreenfield/orgs","repos_url":"https://api.github.com/users/perrygreenfield/repos","events_url":"https://api.github.com/users/perrygreenfield/events{/privacy}","received_events_url":"https://api.github.com/users/perrygreenfield/received_events","type":"User","site_admin":false},"repo":{"id":114004335,"node_id":"MDEwOlJlcG9zaXRvcnkxMTQwMDQzMzU=","name":"astropy","full_name":"perrygreenfield/astropy","private":false,"owner":{"login":"perrygreenfield","id":981803,"node_id":"MDQ6VXNlcjk4MTgwMw==","avatar_url":"https://avatars0.githubusercontent.com/u/981803?v=4","gravatar_id":"","url":"https://api.github.com/users/perrygreenfield","html_url":"https://github.com/perrygreenfield","followers_url":"https://api.github.com/users/perrygreenfield/followers","following_url":"https://api.github.com/users/perrygreenfield/following{/other_user}","gists_url":"https://api.github.com/users/perrygreenfield/gists{/gist_id}","starred_url":"https://api.github.com/users/perrygreenfield/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/perrygreenfield/subscriptions","organizations_url":"https://api.github.com/users/perrygreenfield/orgs","repos_url":"https://api.github.com/users/perrygreenfield/repos","events_url":"https://api.github.com/users/perrygreenfield/events{/privacy}","received_events_url":"https://api.github.com/users/perrygreenfield/received_events","type":"User","site_admin":false},"html_url":"https://github.com/perrygreenfield/astropy","description":"Repository for the Astropy core package","fork":true,"url":"https://api.github.com/repos/perrygreenfield/astropy","forks_url":"https://api.github.com/repos/perrygreenfield/astropy/forks","keys_url":"https://api.github.com/repos/perrygreenfield/astropy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/perrygreenfield/astropy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/perrygreenfield/astropy/teams","hooks_url":"https://api.github.com/repos/perrygreenfield/astropy/hooks","issue_events_url":"https://api.github.com/repos/perrygreenfield/astropy/issues/events{/number}","events_url":"https://api.github.com/repos/perrygreenfield/astropy/events","assignees_url":"https://api.github.com/repos/perrygreenfield/astropy/assignees{/user}","branches_url":"https://api.github.com/repos/perrygreenfield/astropy/branches{/branch}","tags_url":"https://api.github.com/repos/perrygreenfield/astropy/tags","blobs_url":"https://api.github.com/repos/perrygreenfield/astropy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/perrygreenfield/astropy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/perrygreenfield/astropy/git/refs{/sha}","trees_url":"https://api.github.com/repos/perrygreenfield/astropy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/perrygreenfield/astropy/statuses/{sha}","languages_url":"https://api.github.com/repos/perrygreenfield/astropy/languages","stargazers_url":"https://api.github.com/repos/perrygreenfield/astropy/stargazers","contributors_url":"https://api.github.com/repos/perrygreenfield/astropy/contributors","subscribers_url":"https://api.github.com/repos/perrygreenfield/astropy/subscribers","subscription_url":"https://api.github.com/repos/perrygreenfield/astropy/subscription","commits_url":"https://api.github.com/repos/perrygreenfield/astropy/commits{/sha}","git_commits_url":"https://api.github.com/repos/perrygreenfield/astropy/git/commits{/sha}","comments_url":"https://api.github.com/repos/perrygreenfield/astropy/comments{/number}","issue_comment_url":"https://api.github.com/repos/perrygreenfield/astropy/issues/comments{/number}","contents_url":"https://api.github.com/repos/perrygreenfield/astropy/contents/{+path}","compare_url":"https://api.github.com/repos/perrygreenfield/astropy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/perrygreenfield/astropy/merges","archive_url":"https://api.github.com/repos/perrygreenfield/astropy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/perrygreenfield/astropy/downloads","issues_url":"https://api.github.com/repos/perrygreenfield/astropy/issues{/number}","pulls_url":"https://api.github.com/repos/perrygreenfield/astropy/pulls{/number}","milestones_url":"https://api.github.com/repos/perrygreenfield/astropy/milestones{/number}","notifications_url":"https://api.github.com/repos/perrygreenfield/astropy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/perrygreenfield/astropy/labels{/name}","releases_url":"https://api.github.com/repos/perrygreenfield/astropy/releases{/id}","deployments_url":"https://api.github.com/repos/perrygreenfield/astropy/deployments","created_at":"2017-12-12T15:06:54Z","updated_at":"2018-04-30T14:11:35Z","pushed_at":"2018-10-22T20:15:33Z","git_url":"git://github.com/perrygreenfield/astropy.git","ssh_url":"git@github.com:perrygreenfield/astropy.git","clone_url":"https://github.com/perrygreenfield/astropy.git","svn_url":"https://github.com/perrygreenfield/astropy","homepage":"www.astropy.org","size":72781,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"astropy:master","ref":"master","sha":"179dc668c96496656c693221f9d16693dcf2dc43","user":{"login":"astropy","id":847984,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg0Nzk4NA==","avatar_url":"https://avatars0.githubusercontent.com/u/847984?v=4","gravatar_id":"","url":"https://api.github.com/users/astropy","html_url":"https://github.com/astropy","followers_url":"https://api.github.com/users/astropy/followers","following_url":"https://api.github.com/users/astropy/following{/other_user}","gists_url":"https://api.github.com/users/astropy/gists{/gist_id}","starred_url":"https://api.github.com/users/astropy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/astropy/subscriptions","organizations_url":"https://api.github.com/users/astropy/orgs","repos_url":"https://api.github.com/users/astropy/repos","events_url":"https://api.github.com/users/astropy/events{/privacy}","received_events_url":"https://api.github.com/users/astropy/received_events","type":"Organization","site_admin":false},"repo":{"id":2081289,"node_id":"MDEwOlJlcG9zaXRvcnkyMDgxMjg5","name":"astropy","full_name":"astropy/astropy","private":false,"owner":{"login":"astropy","id":847984,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg0Nzk4NA==","avatar_url":"https://avatars0.githubusercontent.com/u/847984?v=4","gravatar_id":"","url":"https://api.github.com/users/astropy","html_url":"https://github.com/astropy","followers_url":"https://api.github.com/users/astropy/followers","following_url":"https://api.github.com/users/astropy/following{/other_user}","gists_url":"https://api.github.com/users/astropy/gists{/gist_id}","starred_url":"https://api.github.com/users/astropy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/astropy/subscriptions","organizations_url":"https://api.github.com/users/astropy/orgs","repos_url":"https://api.github.com/users/astropy/repos","events_url":"https://api.github.com/users/astropy/events{/privacy}","received_events_url":"https://api.github.com/users/astropy/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/astropy/astropy","description":"Repository for the Astropy core package","fork":false,"url":"https://api.github.com/repos/astropy/astropy","forks_url":"https://api.github.com/repos/astropy/astropy/forks","keys_url":"https://api.github.com/repos/astropy/astropy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/astropy/astropy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/astropy/astropy/teams","hooks_url":"https://api.github.com/repos/astropy/astropy/hooks","issue_events_url":"https://api.github.com/repos/astropy/astropy/issues/events{/number}","events_url":"https://api.github.com/repos/astropy/astropy/events","assignees_url":"https://api.github.com/repos/astropy/astropy/assignees{/user}","branches_url":"https://api.github.com/repos/astropy/astropy/branches{/branch}","tags_url":"https://api.github.com/repos/astropy/astropy/tags","blobs_url":"https://api.github.com/repos/astropy/astropy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/astropy/astropy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/astropy/astropy/git/refs{/sha}","trees_url":"https://api.github.com/repos/astropy/astropy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/astropy/astropy/statuses/{sha}","languages_url":"https://api.github.com/repos/astropy/astropy/languages","stargazers_url":"https://api.github.com/repos/astropy/astropy/stargazers","contributors_url":"https://api.github.com/repos/astropy/astropy/contributors","subscribers_url":"https://api.github.com/repos/astropy/astropy/subscribers","subscription_url":"https://api.github.com/repos/astropy/astropy/subscription","commits_url":"https://api.github.com/repos/astropy/astropy/commits{/sha}","git_commits_url":"https://api.github.com/repos/astropy/astropy/git/commits{/sha}","comments_url":"https://api.github.com/repos/astropy/astropy/comments{/number}","issue_comment_url":"https://api.github.com/repos/astropy/astropy/issues/comments{/number}","contents_url":"https://api.github.com/repos/astropy/astropy/contents/{+path}","compare_url":"https://api.github.com/repos/astropy/astropy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/astropy/astropy/merges","archive_url":"https://api.github.com/repos/astropy/astropy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/astropy/astropy/downloads","issues_url":"https://api.github.com/repos/astropy/astropy/issues{/number}","pulls_url":"https://api.github.com/repos/astropy/astropy/pulls{/number}","milestones_url":"https://api.github.com/repos/astropy/astropy/milestones{/number}","notifications_url":"https://api.github.com/repos/astropy/astropy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/astropy/astropy/labels{/name}","releases_url":"https://api.github.com/repos/astropy/astropy/releases{/id}","deployments_url":"https://api.github.com/repos/astropy/astropy/deployments","created_at":"2011-07-21T01:33:49Z","updated_at":"2018-10-22T18:48:49Z","pushed_at":"2018-10-22T22:06:56Z","git_url":"git://github.com/astropy/astropy.git","ssh_url":"git@github.com:astropy/astropy.git","clone_url":"https://github.com/astropy/astropy.git","svn_url":"https://github.com/astropy/astropy","homepage":"www.astropy.org","size":74448,"stargazers_count":1894,"watchers_count":1894,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":967,"mirror_url":null,"archived":false,"open_issues_count":936,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":967,"open_issues":936,"watchers":1894,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/astropy/astropy/pulls/7945"},"html":{"href":"https://github.com/astropy/astropy/pull/7945"},"issue":{"href":"https://api.github.com/repos/astropy/astropy/issues/7945"},"comments":{"href":"https://api.github.com/repos/astropy/astropy/issues/7945/comments"},"review_comments":{"href":"https://api.github.com/repos/astropy/astropy/pulls/7945/comments"},"review_comment":{"href":"https://api.github.com/repos/astropy/astropy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/astropy/astropy/pulls/7945/commits"},"statuses":{"href":"https://api.github.com/repos/astropy/astropy/statuses/e11adc0c60fc8933914186bc4b74cf2fa6c9260c"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"drdavella"}}