{"action":"created","comment":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33531176","id":33531176,"diff_hunk":"@@ -0,0 +1,574 @@\n+:author: Sebastian Benthall\n+:email: sb@ischool.berkeley.edu\n+:institution: UC Berkeley School of Information\n+\n+--------------------------------------------------------------\n+Testing Generative Models of Online Collaboration with BigBang\n+--------------------------------------------------------------\n+\n+.. class:: abstract\n+\n+   We introduce BigBang, a new Python toolkit for analyzing \n+   online collaborative communities such as those that \n+   build open source software.\n+   Mailing lists serve as critical communications infrastructure for\n+   many communities, including several of the open source software \n+   development communities that build scientific Python packages.\n+   BigBang provides tools for analyzing mailing lists.\n+   In this paper, we present results from testing a generative\n+   model of online collaboration in mailing lists.\n+   We derive a social network fro archival mailing list history\n+   and test the Barabasi-Alpert model of network formation\n+   against this data.\n+   We find the model does not fit the data, but that mailist list\n+   social networks share statistical regularities not explained in\n+   existing complex systems literature.\n+   This suggests room for a new generative model of network formation\n+   in the open collaborative setting.\n+\n+.. class:: keywords\n+\n+   mailing lists, network analysis\n+\n+\n+Introduction\n+------------\n+\n+Open source software communites such as those that produce many scientific \n+Python packages are a critical part of contemporary scientific organization.\n+A distinguishing feature of these communities is their heavy use of\n+Internet-based infrastructure, such as mailing lists, version control systems, and\n+issue trackers, for managing communications and organizing work on distributed teams.\n+This data is often deliberately publicly accessible as open source best practices\n+include the \"conspicuous use of archives\" [Fogel]_.\n+The availability of these digital records are also an excellent resource for\n+the researcher interested in sociotechnical organization and collaboration\n+within science.\n+\n+This paper introduces BigBang, a Python project whose purpose is the collection,\n+preprocessing, and analysis of data from open collaborative communities.\n+Built for the use case of studying the Scientific Python communities in particular,\n+it generalizes to other communities and supports fruitful comparisons between them.\n+\n+To demonstrate the potential of this approach, this paper will explore the\n+structure of mailing list discussions in the context of open collaborative projects.\n+We extract social network data from the archives of public mailing lists and test\n+the plausibility that these graphs were generation by Barabasi-Alpert network model.\n+We find that of the mailing lists we've analyzed, none exhibit two features of\n+Barabasi-Alpert networks: power law degree distribution and zero degree assortativity.\n+This result suggests the possibility of future work of scientifically developing a\n+generative model of collaboration.\n+\n+BigBang Overview\n+----------------\n+\n+Launched last year and presented at SciPy 2014, BigBang is a software project \n+that aims to provide researchers a complete toolkit for the scientific analysis\n+of open online collaborative communities.\n+Though applicable to many domains, research into online collaboration has\n+special relevance to practicioners of computationally intensive open science.\n+Through it scientific programming communities such as Scientific Python can\n+achieve a quantitative understanding of their own work and innovation process.\n+\n+Thorough study of these kinds of communities requires the collection and\n+rationalization of many heterogenous and high-dimensional data sources,\n+including but not limited to:\n+\n+- mailing lists\n+- version control systems such as Git\n+- issue trackers such as GitHub and Bugzilla\n+\n+This data is complex in it has many dimensions that afford very different\n+kinds of analysis:\n+\n+- **Time.** All data from online collaboration infrastructure is timestamped,\n+  affording use of time series methods.\n+- **Text.** Email message bodies, issue contents, and commit messages in version\n+  control are all text data suitable for study with natural language processing \n+  techniques.\n+- **Social network.** Participants in the project are individuals linked by relational\n+  ties of communication. Hence these data afford study through social\n+  network analysis techniques.\n+- **Software static analysis.** Source code in version control is complex data containing\n+  the definition of many interelated variables, functions, classes, and modules. Static\n+  analysis and compilation techniques from computer science can be used to study these\n+  entities within the software itself.\n+\n+The richness and granularity of the data from open source software communities and other\n+open on-line collaborative projects promise the answers to many research questions about\n+software engineering, innovation, social organization, and more.\n+The catch is that with data that is so multifaceted, preprocessing the data is an\n+engineering-intensive endeavor.\n+\n+The versatility and scope of open source Scientific Python packages makes building\n+a generic research infrastructure for analyzing these communities a possibility within \n+reach. Architecturally, BigBang is a Python package that includes Scientific Python\n+libraries for time series analysis, natural language processing, network analysis,\n+and software analysis as dependencies.\n+\n+BigBang includes methods for collecting research data from source on the web about\n+the activity of open collaborative communities. At the time of this writing,\n+BigBang supports data collection from Mailman, the mailing list service, as well\n+as other `.mbox` formatted email archives. It also supports data collection\n+from Git repositories. Future versions will have methods for collecting data\n+from issue trackers.\n+\n+The BigBang repository contains an `examples` directory with Jupyter notebooks\n+demonstrating its functionality and exploring lines of research inquiry.\n+Researchers can contribute to the project by submitting Jupyter notebooks to the\n+repository for review through the GitHub Pull Request system.\n+Source code that performs preprocessing that is usable by multiple computational\n+experiments is in a separate source code directory that can be imported as a\n+Python module.\n+\n+In the context of Scientific Python, BigBang is deliberately recursive.\n+It is a Python project that depends on many other scientific Python projects.\n+It is designed to study, among other things, dependencies and interactions between \n+the Scientific Python technologies and communities.\n+Our goal is for BigBang to providing a new means for these communities to engage i\n+in scientific self-management.\n+\n+Email data collection\n+---------------------\n+\n+BigBang supports collection of email data.\n+It can do this either by scraping the archival pages of a Mailman instance,\n+or by importing an `.mbox` formatted file.\n+\n+\n+Deriving interaction graphs\n+---------------------------\n+\n+Email is archived in the same text format that email is sent in, as specified in\n+RFC2822 [RFC2822]_.\n+Every email is comprised of a message body and a number of metadata headers\n+that are essential for email processing and presentation.\n+\n+For our study, we have been interested in extracting the implied social\n+network from an email archive of a public mailing list. To construct this\n+network, we have used the `From`, `Message-ID`, and `In-Reply-To` headers\n+of the email.\n+\n+The `From` field of an email contains data about the sender of the message.\n+This often includes both a full name and an email address of the sender.\n+As this is set by the email client (note: or is it the mailing list server?)\n+a single person is often represented differently in the `From` field\n+across many emails. See *Entity Resolution* for our strategies for\n+resolving entities from divergent email headers.\n+\n+The `Message-ID` header provides a globally unique identification string\n+for every email.\n+This is accomplished by (how?).\n+The `In-Reply-To` header is set when an email is sent as a reply to\n+another email.\n+The reply's `In-Reply-To` header will match the `Message-ID` of the\n+original email.\n+\n+We construct the directed *interaction graph* :math:`G` for a set of emails as follows:\n+\n+* For every email :math:`e`, add a node :math:`v_{f(e)}` to :math:`G` corresponding \n+  to its `From` header :math:`f(e)`  and set its `sent` attribute :math:`v_{f(e)}` \n+  (notation is sloppy here -- can we write a pseudocode algorithm?)\n+* If :math:`e_1` is a reply to another email :math:`e_2`, create an edge between\n+  their corresponding nodes or, if it already exists, increment its weight by 1\n+\n+BigBang implements this interaction graph creation using Python's native\n+email processing libraries, `pandas`, and `networkx`.\n+\n+.. code-block:: python\n+\n+   import networkx as nx\n+\n+   def messages_to_interaction_graph(messages):\n+       \"\"\"\n+       *messages* is a Pandas DataFrame, each row\n+       containing the body and header metadata for\n+       an email from the archive.\n+       Messages should be in chronological order.\n+\n+       Returns a NetworkX DiGraph (directed graph),\n+       the nodes of which are mailing list participants.\n+\n+       Nodes have a 'sent' attribute indicating number\n+       of emails they have sent within the archive.\n+\n+       Edges from i to j indicate that i has sent at least\n+       one reply to j. The weight of the edge is equal\n+       to the number of replies sent from i to j.\n+       \"\"\"\n+\n+       IG = nx.DiGraph()\n+\n+       from_dict = {}\n+\n+       sender_counts = {}\n+       reply_counts = {}\n+\n+       for m in df.iterrows():\n+           m_from = m[1]['From']\n+\n+           from_dict[m[0]] = m_from\n+           sender_counts[m_from] = \\\\\n+               sender_counts.get(m_from, 0) + 1\n+           IG.add_node(m_from)\n+\n+           if m[1]['In-Reply-To'] is not None:\n+               reply_to_mid = m[1]['In-Reply-To']\n+\n+               if reply_to_mid in from_dict:\n+                   m_to = from_dict[reply_to_mid]\n+                   reply_counts[m_from][m_to] = \\\\\n+                       reply_counts[m_from].get(m_to, 0) + 1\n+\n+       for sender, count in sender_counts.items():\n+           IG.node[sender]['sent'] = count\n+\n+       for m_from, edges in reply_counts.items():\n+           for m_to, count in edges.items():\n+               IG.add_edge(m_from, m_to, weight=count)\n+\n+       return IG\n+\n+The motivation for constructing interaction graphs in this way is to build a\n+concise representation of the social network implied by email data.\n+We posit that building a social network representation based on actual messages\n+sent between people provides a more granular and faithful description of\n+social relationships than one based on higher-level descriptions of social\n+relationships or ties from web services such as Facebook 'friends' and\n+Twitter 'followers'\n+\n+It may be objected that since the data we are considering comes from public\n+mailing lists where every message has a potentially large audience, it may be\n+misleading to build a network representation on the assumption that a reply\n+is directed primarily at the person who was replied to and not more broadly\n+to other participants in a thread or, even more broadly, to the mailing list\n+as a whole.\n+\n+While this is a valid objection, it points to the heart of what is distinctive\n+about this research.\n+While there have been many studies of social network formation in conventional\n+settings, the conditions of open collaboration are potentially quite different.\n+Theoretically, we expect them to be explicitly and collectively goal-directed,\n+are self-organized for efficient action as opposed to positional \n+social advantage, and designed around an archiving system for the sake of\n+efficiency.\n+Understanding the statistical properties of this particular form of social\n+organization, as opposed to others, is the very purpose of this empirical work.\n+\n+*Interaction graph study*.\n+By looking at the *Reply-To* header of the emails, we\n+are able to construct a graph of who replies to who in the email list. (How?)\n+Drawing on (x,y, and z) we are studying the empirical properties of these\n+networks in order to come up with a generative model of community graph.\n+Whereas (Barabasi reference) models graphs with power-law degree distribution,\n+we find (verify using Clauset et al. method) that degree distribution in\n+these graphs is log normally distributed. Moreover, whereas [Newman2002]_\n+hypothesizes that socially generated graphs will be characterized by high\n+degree assortativity, we find empirically that these interaction graphs\n+have degree assortativity comparable with biological and technical networks.\n+\n+Entity Resolution\n+-----------------\n+\n+Empirically, over the extent of a mailing list's archival\n+data it is common for the *From* fields of emails to vary even when the\n+email is coming from the same person. Not only do people sometimes change their\n+email address or use multiple addresses to interact with the same list, but\n+also different email clients may represent the same email address in the *From*\n+header in different ways. BigBang includes automated techniques for resolving\n+these entities, cleaning the data for downstream processing.\n+\n+Data from the `From` header of messages stored by Mailman is most often represented\n+in a form that includes both a full name representation and an email representation.\n+Unfortunately these fields can vary widely for one person. The following list\n+shows some of the variability that might appear for a single prolific sender.\n+\n+.. table:: Examples of variations in `From` header values corresponding to the\n+           same person in an email archive. Some of these changes reflect changes\n+           of email address. Others are artifacts of the users' email clients and\n+           the mailing list software. :label:`mtable`\n+\n+   +----------------------------------------------------------------------------+\n+   | Variations                                                                 |\n+   +============================================================================+\n+   | ``tyrion.lannister at gmail.com (Tyrion Lannister)``                       |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister at gmail.com (Tyrion Lannister)``                       |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister at gmail.com (Tyrion.Lannister@gmail.com)``             |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister at gmail.com (Tyrion.Lannister at gmail.com)``          |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister@gmail.com (Tyrion Lannister)``                          |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister@gmail.... (Tyrion Lannister)``                          |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister@gmail.com``                                             |\n+   +----------------------------------------------------------------------------+\n+   | ``Tyrion.Lannister at gmail.com (Tyrion)``                                 |\n+   +----------------------------------------------------------------------------+\n+   | ``tyrion at lanister.net (Tyrion Lannister)``                              |\n+   +----------------------------------------------------------------------------+\n+   | ``halfman@council.kings-landing.gov (Tyrion Lannister)``                   |\n+   +----------------------------------------------------------------------------+\n+   | ``halfman@council.kings-landing.gov (Tyrion Lannister, Hand of the King)`` |\n+   +----------------------------------------------------------------------------+\n+   | ``halfman@council.kings-landing.gov (halfman@council.kings-landing.gov)``  |\n+   +----------------------------------------------------------------------------+\n+   | ``tyrion+hand at lanister.net (Tyrion Lannister)``                         |\n+   +----------------------------------------------------------------------------+\n+   | ``tyrion.lannister at gmail.com (=?UTF-8?B?RGF2aWQgQWJpw6Fu?=)``           |\n+   +----------------------------------------------------------------------------+\n+   | ``\"Tyrion Lannister\" <Tyrion.Lannister@gmail.com>``                        |\n+   +----------------------------------------------------------------------------+\n+\n+Variation in entity representation is a source of noise in our research and an\n+ongoing area of development for BigBang.\n+For the study in this paper, we have implemented a heuristic system for\n+entity matching.\n+First we standardize the data by converting it to lower case and normalizing\n+\" at \" and \"@\". Then we parse out the email and full name subfields of the\n+data and look for exact matches.\n+Under this procedure, all of the above email addresses would be collapsed into a single\n+entity.\n+\n+In our interaction graph study, this has the effect of combining several nodes into a single one\n+in a way that's similar to the (cite) blockmodel technique.\n+The edges to and from the derived node are weighted by the sum of the edges of the original\n+nodes.\n+The `sent` attribute of the new node is also set as the sum of the `sent` attribute of the\n+original nodes.\n+\n+Preferential attachment model\n+-----------------------------\n+\n+A early result in the study of complex networks was the observation that many networks\n+existing in nature exhibit a scale-free degree distribution.\n+This means that the distribution of the number of edges of each node in the network (the\n+node's *degree*) is a power law distribution, characterized by the formula: \n+\n+.. math::\n+\n+   formula here\n+\n+The other most widely known random graph model, the Erdos-Renri model, produces\n+networks with normal(?) degree distribution.\n+Barabasi and Alpert [BarabasiAlbert]_ have proposed a model of network generation\n+that produces graphs with scale-free degree distribution.\n+The Barabasi-Alpert model is now widely known in the literature.\n+\n+The attractiveness of the Barabasi-Alpert model is due in part to its being a\n+generative model, meaning that it describes a process for creating data of an\n+observed distribution, as opposed to being simply a description of the distribution\n+itself.\n+This gives the Barabasi-Alpert model explanatory power.\n+\n+In particular, the Barabasi-Alpert model attributes the scale-free distribution of\n+node degree to a *preferential attachment* mechanism. \n+The network is formed by beginning with a small number :math:`m_0` of nodes and adding\n+new nodes, connecting each new node to :math:`m < m_0` nodes, where the probability\n+of connecting to node :math:`i` is relative to the prior degree of that node,\n+:math:`k_i`:  adding new nodes to the network one by one. \n+\n+.. math::\n+\n+   \\Pi(k_i) = \\frac{k_i}{\\sum_{j} k_j}\n+\n+\n+[AlbertBarabasi]_\n+\n+The Barabasi-Alpert model is favored for its simplicity, its intuitively clear mechanism \n+of preferential attachment, and for its analytic tractability.\n+As said above, the degree distribution of Barabasi-Alpert networks is power law.\n+\n+Degree assortativity\n+--------------------\n+\n+Degree assortativity is the correlation between degrees of adjacent nodes in the network.\n+Following the definitions of [Newman2003]_, the degree assorativity coefficient is\n+\n+.. math::\n+\n+   r = \\frac{\\sum_{jk}jk(e_{jk} - q_{j}q_{k}))}{\\sigma_{q}^{2}}\n+\n+In the above formula, :math:`e_{jk}` is the fraction of edges the connect vertices\n+of degree :math:`j + 1` and :math:`k + 1`, i.e. the degrees of the connected vertices\n+not including the connecting edge itself. [Newman2003] calls this *excess degree*.\n+The value :math:`q_k` is the distribution of excess degree.\n+\n+.. math::\n+\n+   \\sum_{j} e_{jk} = q_{k}\n+\n+The value :math:`\\sigma_{q}` is the standard deviation of :math:`q_k`. [TODO: I'm using directed\n+assortativity here, yes? And what about weighted degrees?]\n+\n+Degree assortativity in complex networks is studied by [Newman2002]_, who makes the intriguing \n+claim that observed social networks, such as coauthorship networks, exhibit positive degree\n+assortativity, while technical and biological networks exhibit negative degree assortativity.\n+\n+Newman also notes that the degree assortativity of Barabasi-Alpert networks is zero.\n+Variations on the Barabasi-Alpert model do have other properties.\n+(cite: http://arxiv.org/pdf/cond-mat/0402315.pdf)\n+\n+Studies have supported the role of a preferential attachment mechanism in social network\n+formation [Zhou2011]_ [Tinatti2012]_.\n+However, these studies do not take degree assortativity into account.\n+This leaves open the question of whether the Barabasi-Alpert model is sufficient to\n+characterize these networks.\n+\n+Power law or log normal?\n+------------------------\n+\n+A further challenge to the Barabasi-Alpert model comes from [Clauset2007]_, who argue that\n+many conventionally accepted techniques for fitting power law distributions to empirical data \n+are biased and unsound.\n+They propose a Bayesian technique for testing power law distributions.\n+By computing the likelihood of the data being generated by a power law distribution and\n+comparing it with the likelihood of it being generated by other heavy-tail distributions,\n+such as the log normal distribution, they provide a statistically sound basis for model\n+comparison.\n+The Clauset et al. method also carefully considers only the tail of the data, picking a\n+cutoff value below which data are ignored.\n+This method of testing power law distributions is implemented in Python in the `powerlaw`\n+package by [Alstott2014]_\n+\n+From a Bayesian perspective, the ratio of likelihoods represents how much one should\n+update ones beliefs based on observation of data.\n+In this case, the computed likelihood ratio of the data being generated by a power law\n+over a log normal distribution would be interpreted as how much one should be\n+persuaded that the data came from a power law distribution based on ones prior\n+belief in the originary distribution of data in general.\n+\n+While this may be a perplexingly abstract way of considering the problem for a\n+non-Bayesian, there is an argument that log normal distributions should be\n+given a higher prior probability than power law distributions.\n+This is because of the Central Limit Theorem, from which it follows that\n+a log normal distribution would result from the multiplication of many\n+other otherwise distributed factors.\n+\n+There are two consequences of these considerations.\n+First, it makes sense to consider log normal distributions as a kind of null hypotheses\n+against which empirical claims to power law generation must be proven.\n+Second, it suggest that where a log normal is discovered, the generative mechanism that\n+produced it is not the same as the generative mechanism that produces a power law.\n+In particular, we would not expect a network that exhibits a log normal power law\n+distribution to be generated by preferential attachment, at least as formalized\n+specifically by Barabasi and Alpert.\n+\n+\n+Methods\n+-------\n+\n+We built interaction graphs according to the above procedure for 10 mailing lists from open\n+collaborative communities.\n+We then computed the degree assortativity of these networks.\n+We also used the Alstott package to test the degree distribution of these networks using\n+the Clauset method.\n+\n+Results\n+-------\n+\n+Every mailing list of the 10 we analyzed exhibits degree disassortivity and a significantly\n+(:math:`p` > .05) better fit to log normal instead of power law distribution.\n+\n+.. table:: Results of analysis. For each mailing list archive, number of participants :math:`n`,\n+           computed degree assortativity of the interaction graph, and loglikelihood ratio R and\n+           statistical significance :math:`p` of comparison of fit between power law and log normal\n+           distributions. In all cases the interaction graph is disassortative with significantly\n+           more log normal degree distribution. :label:`mtable`","path":"papers/sebastian_benthall/sebastian_benthall.rst","position":479,"original_position":479,"commit_id":"0dc2d7d04a6f3c880c34bc4f62c3eab762e612d9","original_commit_id":"0dc2d7d04a6f3c880c34bc4f62c3eab762e612d9","user":{"login":"takluyver","id":327925,"avatar_url":"https://avatars.githubusercontent.com/u/327925?v=3","gravatar_id":"","url":"https://api.github.com/users/takluyver","html_url":"https://github.com/takluyver","followers_url":"https://api.github.com/users/takluyver/followers","following_url":"https://api.github.com/users/takluyver/following{/other_user}","gists_url":"https://api.github.com/users/takluyver/gists{/gist_id}","starred_url":"https://api.github.com/users/takluyver/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/takluyver/subscriptions","organizations_url":"https://api.github.com/users/takluyver/orgs","repos_url":"https://api.github.com/users/takluyver/repos","events_url":"https://api.github.com/users/takluyver/events{/privacy}","received_events_url":"https://api.github.com/users/takluyver/received_events","type":"User","site_admin":false},"body":"Oh, I see now your note above about `p > 0.5`. Is this standard in the Bayesian world?","created_at":"2015-06-30T00:51:08Z","updated_at":"2015-06-30T00:51:08Z","html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/154#discussion_r33531176","pull_request_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154","_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33531176"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/154#discussion_r33531176"},"pull_request":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154"}}},"pull_request":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154","id":37762213,"html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/154","diff_url":"https://github.com/scipy-conference/scipy_proceedings/pull/154.diff","patch_url":"https://github.com/scipy-conference/scipy_proceedings/pull/154.patch","issue_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/154","number":154,"state":"open","locked":false,"title":"Paper: Testing Generative Models of Online Collaboration with BigBang (Benthall)","user":{"login":"sbenthall","id":68752,"avatar_url":"https://avatars.githubusercontent.com/u/68752?v=3","gravatar_id":"","url":"https://api.github.com/users/sbenthall","html_url":"https://github.com/sbenthall","followers_url":"https://api.github.com/users/sbenthall/followers","following_url":"https://api.github.com/users/sbenthall/following{/other_user}","gists_url":"https://api.github.com/users/sbenthall/gists{/gist_id}","starred_url":"https://api.github.com/users/sbenthall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbenthall/subscriptions","organizations_url":"https://api.github.com/users/sbenthall/orgs","repos_url":"https://api.github.com/users/sbenthall/repos","events_url":"https://api.github.com/users/sbenthall/events{/privacy}","received_events_url":"https://api.github.com/users/sbenthall/received_events","type":"User","site_admin":false},"body":"Pull request for Sebastian Benthall paper.\r\n\r\nRegrettably, the current state of this paper is a (very) incomplete draft. More revisions to follow.","created_at":"2015-06-16T06:05:54Z","updated_at":"2015-06-30T00:51:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"955195458f058a956e140b2809bf33aad327fc20","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154/commits","review_comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154/comments","review_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/154/comments","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/0dc2d7d04a6f3c880c34bc4f62c3eab762e612d9","head":{"label":"sbenthall:2015","ref":"2015","sha":"0dc2d7d04a6f3c880c34bc4f62c3eab762e612d9","user":{"login":"sbenthall","id":68752,"avatar_url":"https://avatars.githubusercontent.com/u/68752?v=3","gravatar_id":"","url":"https://api.github.com/users/sbenthall","html_url":"https://github.com/sbenthall","followers_url":"https://api.github.com/users/sbenthall/followers","following_url":"https://api.github.com/users/sbenthall/following{/other_user}","gists_url":"https://api.github.com/users/sbenthall/gists{/gist_id}","starred_url":"https://api.github.com/users/sbenthall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbenthall/subscriptions","organizations_url":"https://api.github.com/users/sbenthall/orgs","repos_url":"https://api.github.com/users/sbenthall/repos","events_url":"https://api.github.com/users/sbenthall/events{/privacy}","received_events_url":"https://api.github.com/users/sbenthall/received_events","type":"User","site_admin":false},"repo":{"id":36956177,"name":"scipy_proceedings","full_name":"sbenthall/scipy_proceedings","owner":{"login":"sbenthall","id":68752,"avatar_url":"https://avatars.githubusercontent.com/u/68752?v=3","gravatar_id":"","url":"https://api.github.com/users/sbenthall","html_url":"https://github.com/sbenthall","followers_url":"https://api.github.com/users/sbenthall/followers","following_url":"https://api.github.com/users/sbenthall/following{/other_user}","gists_url":"https://api.github.com/users/sbenthall/gists{/gist_id}","starred_url":"https://api.github.com/users/sbenthall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbenthall/subscriptions","organizations_url":"https://api.github.com/users/sbenthall/orgs","repos_url":"https://api.github.com/users/sbenthall/repos","events_url":"https://api.github.com/users/sbenthall/events{/privacy}","received_events_url":"https://api.github.com/users/sbenthall/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sbenthall/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":true,"url":"https://api.github.com/repos/sbenthall/scipy_proceedings","forks_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/sbenthall/scipy_proceedings/releases{/id}","created_at":"2015-06-05T21:26:44Z","updated_at":"2015-06-05T21:26:44Z","pushed_at":"2015-06-29T21:11:21Z","git_url":"git://github.com/sbenthall/scipy_proceedings.git","ssh_url":"git@github.com:sbenthall/scipy_proceedings.git","clone_url":"https://github.com/sbenthall/scipy_proceedings.git","svn_url":"https://github.com/sbenthall/scipy_proceedings","homepage":"","size":2237,"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":"scipy-conference:2015","ref":"2015","sha":"e3df71a5659ce32396b7c520b89109716a3210fa","user":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"repo":{"id":1825629,"name":"scipy_proceedings","full_name":"scipy-conference/scipy_proceedings","owner":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scipy-conference/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":false,"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings","forks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/releases{/id}","created_at":"2011-05-31T10:26:48Z","updated_at":"2015-06-22T07:22:47Z","pushed_at":"2015-06-30T00:48:26Z","git_url":"git://github.com/scipy-conference/scipy_proceedings.git","ssh_url":"git@github.com:scipy-conference/scipy_proceedings.git","clone_url":"https://github.com/scipy-conference/scipy_proceedings.git","svn_url":"https://github.com/scipy-conference/scipy_proceedings","homepage":"","size":155374,"stargazers_count":76,"watchers_count":76,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":142,"mirror_url":null,"open_issues_count":38,"forks":142,"open_issues":38,"watchers":76,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/154"},"issue":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/154"},"comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/154/comments"},"review_comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154/comments"},"review_comment":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/154/commits"},"statuses":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/0dc2d7d04a6f3c880c34bc4f62c3eab762e612d9"}}}}