{"action":"created","comment":{"url":"https://api.github.com/repos/juttle/juttle/pulls/comments/48561948","id":48561948,"diff_hunk":"@@ -2,27 +2,532 @@\n title: Juttle Tutorial | Juttle Language Reference\n ---\n \n-## Juttle Tutorial\n+# Juttle Tutorial\n+\n+[TOC]\n \n :warning: XXX/dmehra this is unfinished\n \n-If you're here, you're probably just starting out with Juttle.\n+Juttle examples here assume that you have the `juttle` binary available, having done\n+\n+```\n+npm install -g juttle\n+```\n+\n+and that you have placed the dataset in `/tmp/data.json` location.\n+\n+For examples that generate visualizations in the browser, you need to have the outrigger package installed:\n+\n+```\n+npm install -g outrigger\n+```\n+\n+and the outriggerd daemon running.\n+\n+To run a given example via outrigger client, save the Juttle code to a file, then execute:\n+\n+```\n+outrigger-client browser --path '/tmp/example.juttle'\n+```\n+\n+To run a given example via Juttle CLI (this only works for examples that don't attempt to output to charts), you can reference the saved file:\n+\n+```\n+juttle '/tmp/example.juttle'\n+```\n+\n+or simply launch the `juttle` shell, enter `<` for multiline mode, then paste the code followed by `.` on its own line, enter to execute.\n+\n+We encourage you to run the provided examples and further experiment by modifying their Juttle code, but also provide screenshots of the expected output for cheaters.\n+\n+## Dataset\n+\n+This tutorial uses a subset of real data from the\n+[Github Archive](https://www.githubarchive.org/). A small dataset of the same format is provided [here](../examples/datasets/github_data.json) and all Juttle programs in this tutorial will work with it, but for more interesting data, download the 30MB version from [here](XXX where to host). Rather than describing the dataset any further, we will use Juttle to explore it.\n+\n+## Reading the data\n+\n+The `read` source is used to feed the data into the Juttle flowgraph. We will start with `read file` (where \"file\" is an adapter to the local filesystem); another option would be to `read http` to access the file remotely via http-accessible endpoint, but we recommend against that for the 30MB dataset to save time and bandwidth.\n+\n+To see what the data looks like, let's read it in and display only the first few points:\n+\n+```juttle\n+read file -file '/tmp/data.json'\n+| head 5\n+| view table\n+```\n+\n+The `view table` sink is the default one, and can be omitted. Let's look at the last few points:\n+\n+```juttle\n+read file -file '/tmp/data.json'\n+| tail 5\n+```\n+\n+The rest of the examples will only specify the sink if other than table view is desired.\n+\n+As we start analyzing the data, you will see that doing certain operations on a large file can get slow. At that point we will reload the data into ElasticSearch and use `read elastic` adapter in the Juttle programs, to take advantage of ES optimizations.\n+\n+We will also try enriching the data with metadata from a CSV [file](../examples/datasets/github_metadata.csv), but not right away.\n+\n+## Exploring the data\n+\n+First, let's look at a few events using the `read file` source. We already used `head` and `tail` processors to limit the data we output, now we will try filtering by timestamp. Juttle defaults to looking for the timestamp in the field `time` unless `-timeField <fieldname>` option is used.\n+\n+XXX/dmehra this is currently unsupported:\n+\n+```\n+read file -file '/tmp/data.json' -from :2015-07-01: -to :2015-07-02:\n+```\n+\n+what works now is:\n+\n+```juttle\n+read file -file '/tmp/data.json'\n+| filter time >= :2015-07-01:\n+```\n+\n+After running this program, we have our data (well, some of it) displayed in\n+a table. Notice that each GitHub event has a timestamp, an event type, a repository name,\n+and the login of the \"actor\" whose action triggered an event.\n+\n+## How many points? (Our first reduce)\n+\n+Let's answer a few basic questions about the data we are looking at. As a first\n+step, we might want to know how many data points there are; the size of the data often informs how one would wish to analyze it. To do this, we'll use the \n+[`reduce`](../processors/reduce.md) processor that enables aggregations and grouping in Juttle.\n+\n+Let's look at aggregations first, and start by using the [`count()`](../reducers/count.md) reducer (aggregation functions are called \"reducers\" in Juttle), which simply counts the number of points that flow through it.\n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce total_points = count()\n+```\n+\n+You will have noticed that `reduce` trims off the rest of the data, leaving only the newly computed fields (`total_points` above). If you still have need for the original data for further processing, that can be done by splitting the flowgraph into `reduce` on one branch, and other logic on another branch; that is outside the scope of this tutorial. \n+\n+Juttle comes with a number of built-in reducers to compute statistics such as\n+counts, cardinality, averages, and derivatives. If you need a computation that isn't provided, you can define your own reducer.\n+\n+## Which fields? Which values? (More reduce magic)\n+\n+When working with a new dataset, one commonly wants to know how big the data is, and how it's structured in terms of fields and values. We know the total number of points in our data set, and we have an idea of what fields are in the points from doing `read ... | head` to look at a few points. However, those points may not have represented full variety of the data set; there may be other points in the middle of the dataset with additional fields that we didn't catch with `head` and `tail`.\n+\n+There is a Juttle trick to see which fields are present in the data; the processing will not be optimized, so do this only over small data sets (by specifying a narrow time range, for example).\n+\n+```\n+read file -file '/tmp/data.json' -from :2015-07-01: -to :2015-07-02:\n+| split\n+| reduce by name\n+| reduce fields = pluck(name)\n+```\n+\n+The program uses the [`split`](../processors/split.md) to transpose the data points such that each field/value tuple becomes a separate point with `name` set to the field's name, then applies `reduce by name` to output a unique set of field names. The output has field names alone, as an array, thanks to the [`pluck`](../reducers/pluck.md) reducer.\n+\n+```raw\n+┌──────────────────────────────────────────────────────┐\n+│ fields                                               │\n+├──────────────────────────────────────────────────────┤\n+│ type,actor_login,repo_name,n_commits                 │\n+└──────────────────────────────────────────────────────┘\n+```\n+\n+To see the set of unique values for a given field, use `reduce by` field name, shown here for field `type`. As you may not know in advance how many unique values there will be, it is advisable to first run the program with `reduce count()` tacked on, and once you know that the output is reasonably small, view the values themselves.\n+\n+```\n+read file -file '/tmp/data.json' -from :2015-07-01: -to :2015-07-02:\n+| reduce by type\n+| reduce count()\n+```\n+\n+As there are mere 10 types, it's fine to output them in a table:\n+\n+```\n+read file -file '/tmp/data.json' -from :2015-07-01: -to :2015-07-02:\n+| reduce by type\n+```\n+\n+Since we didn't use `pluck` to make an array, the output will be multiple data points, one for each type (only showing a couple here):\n+\n+```\n+┌─────────────────┐\n+│ type            │\n+├─────────────────┤\n+│ ForkEvent       │\n+├─────────────────┤\n+...\n+├─────────────────┤\n+│ CreateEvent     │\n+└─────────────────┘\n+```\n+\n+Now we have a good idea of what individual data points look like in terms of fields and their values, but don't yet grok the size and shape of the data: how many data points there are, what is the distribution of values in a given time interval, and over time. This is where Juttle shines.\n+\n+## How many repos? (Different reducers)\n+\n+Recall that there is a field called \"repo_name\" in the data. It might be useful to know how many unique repository names we have. To do this, we'll\n+use the [`count_unique(..)`](../reducers/count_unique.md) reducer.\n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce repos = count_unique('repo_name')\n+```\n+\n+This reducer takes a parameter, which is a _field name_ specifying which field of the incoming points we want to compute the cardinality of.\n+\n+We can also use `reduce` with multiple reduce expressions. For example, we can\n+count the total number of points, the number of unique repository names, and the\n+number of unique actors (in the \"actor_login\" field) like this:\n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce total = count(), \n+    actors = count_unique('actor_login'), \n+    repos = count_unique('repo_name')\n+```\n+\n+## Enriching the data (Put vs reduce)\n+\n+Let's say we wanted to know the number of actors participating in an average GitHub repository. The program above gives us the counts of actors and repos, so finding the average is simple math. However, it will not work to add \"avg_actors = actors / repos\" to the `reduce` expression, since this computation is not a reducer; and in general, this is not the logic you seek.\n+\n+If your intention is to add the computed field to each data point, thereby enriching and widening the dataset rather than reducing it, then it's not `reduce` you should be using but [`put`](../processors/put.md) processor.\n+\n+Let's compute the average actors per repo with an appended `put`.\n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce total = count(), \n+    actors = count_unique('actor_login'), \n+    repos = count_unique('repo_name')\n+| put avg_actors = actors / repos\n+```\n+\n+In this program, `reduce` already turned our whole data set into a single data point, so `put` appended the new field to that one point. If there were many data points, `put` would have added the field to each one. We will try that out in the next section.\n+\n+## How many actors per repo? (Reduce with by-grouping)\n+\n+Unsurprisingly, our sample data set has many more actors than repositories. Maybe we'd like to know how many unique actors there are _per repository_. Easy! We just need to add a `by` clause to our reduce expression, indicating that we want to group data points by repository and carry out the `count_unique` operation individually for each group:\n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce actors = count_unique('actor_login') by repo_name\n+```\n+\n+If you want to see the top 10 repositories by number of participating actors, append the [`sort`](../processors/sort.md) processor with -desc order, then limit to first 10 points with the [`head`](../processors/head.md) processor. \n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce actors = count_unique('actor_login') by repo_name\n+| sort actors -desc\n+| head 10\n+```\n+\n+Now for these most active repositories by participant count, let's see how many events per actor tend to occur. \n+\n+```\n+read file -file '/tmp/data.json'\n+| reduce events = count(), actors = count_unique('actor_login') by repo_name\n+| sort actors -desc\n+| head 10\n+| put activity_per_actor = Math.round(events/actors) by repo_name\n+```\n+\n+This example clearly shows that `put` adds the newly computed field to each data point. Also, here we are using `put` with by-grouping (to be fair, the program above would run identically even with plain `put`, but it helps express the intention of the code).","path":"docs/concepts/juttle_tutorial.md","position":236,"original_position":236,"commit_id":"1a2ebfe873033f47cbb4538db289562bbbce142f","original_commit_id":"1a2ebfe873033f47cbb4538db289562bbbce142f","user":{"login":"dmehra","id":5817365,"avatar_url":"https://avatars.githubusercontent.com/u/5817365?v=3","gravatar_id":"","url":"https://api.github.com/users/dmehra","html_url":"https://github.com/dmehra","followers_url":"https://api.github.com/users/dmehra/followers","following_url":"https://api.github.com/users/dmehra/following{/other_user}","gists_url":"https://api.github.com/users/dmehra/gists{/gist_id}","starred_url":"https://api.github.com/users/dmehra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmehra/subscriptions","organizations_url":"https://api.github.com/users/dmehra/orgs","repos_url":"https://api.github.com/users/dmehra/repos","events_url":"https://api.github.com/users/dmehra/events{/privacy}","received_events_url":"https://api.github.com/users/dmehra/received_events","type":"User","site_admin":false},"body":"Will fix.","created_at":"2015-12-29T19:04:43Z","updated_at":"2015-12-29T19:04:43Z","html_url":"https://github.com/juttle/juttle/pull/15#discussion_r48561948","pull_request_url":"https://api.github.com/repos/juttle/juttle/pulls/15","_links":{"self":{"href":"https://api.github.com/repos/juttle/juttle/pulls/comments/48561948"},"html":{"href":"https://github.com/juttle/juttle/pull/15#discussion_r48561948"},"pull_request":{"href":"https://api.github.com/repos/juttle/juttle/pulls/15"}}},"pull_request":{"url":"https://api.github.com/repos/juttle/juttle/pulls/15","id":54312154,"html_url":"https://github.com/juttle/juttle/pull/15","diff_url":"https://github.com/juttle/juttle/pull/15.diff","patch_url":"https://github.com/juttle/juttle/pull/15.patch","issue_url":"https://api.github.com/repos/juttle/juttle/issues/15","number":15,"state":"open","locked":false,"title":"First draft of the juttle tutorial with github data","user":{"login":"dmehra","id":5817365,"avatar_url":"https://avatars.githubusercontent.com/u/5817365?v=3","gravatar_id":"","url":"https://api.github.com/users/dmehra","html_url":"https://github.com/dmehra","followers_url":"https://api.github.com/users/dmehra/followers","following_url":"https://api.github.com/users/dmehra/following{/other_user}","gists_url":"https://api.github.com/users/dmehra/gists{/gist_id}","starred_url":"https://api.github.com/users/dmehra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmehra/subscriptions","organizations_url":"https://api.github.com/users/dmehra/orgs","repos_url":"https://api.github.com/users/dmehra/repos","events_url":"https://api.github.com/users/dmehra/events{/privacy}","received_events_url":"https://api.github.com/users/dmehra/received_events","type":"User","site_admin":false},"body":"@demmer this is still raw, want high level review. Missing:\r\n- join section that enriches the data with metadata\r\n- at some point, switch to use elastic for the data with big data set (ingest with `read file | write elastic` ?)\r\n- haven't validated all the juttles that run in outrigger\r\n\r\nIgnore exact wording, not ready for review of that level yet. Mainly want review of \"does this tutorial cover the right bits of juttle\". Most of it came from the old tutorial, with some mods.","created_at":"2015-12-21T22:43:58Z","updated_at":"2015-12-29T19:04:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0b5dcb3b7da830ebf628c3c97a196ccbf62e9fc2","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/juttle/juttle/pulls/15/commits","review_comments_url":"https://api.github.com/repos/juttle/juttle/pulls/15/comments","review_comment_url":"https://api.github.com/repos/juttle/juttle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/juttle/juttle/issues/15/comments","statuses_url":"https://api.github.com/repos/juttle/juttle/statuses/1a2ebfe873033f47cbb4538db289562bbbce142f","head":{"label":"juttle:juttle-tutorial","ref":"juttle-tutorial","sha":"1a2ebfe873033f47cbb4538db289562bbbce142f","user":{"login":"juttle","id":8988633,"avatar_url":"https://avatars.githubusercontent.com/u/8988633?v=3","gravatar_id":"","url":"https://api.github.com/users/juttle","html_url":"https://github.com/juttle","followers_url":"https://api.github.com/users/juttle/followers","following_url":"https://api.github.com/users/juttle/following{/other_user}","gists_url":"https://api.github.com/users/juttle/gists{/gist_id}","starred_url":"https://api.github.com/users/juttle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juttle/subscriptions","organizations_url":"https://api.github.com/users/juttle/orgs","repos_url":"https://api.github.com/users/juttle/repos","events_url":"https://api.github.com/users/juttle/events{/privacy}","received_events_url":"https://api.github.com/users/juttle/received_events","type":"Organization","site_admin":false},"repo":{"id":48260003,"name":"juttle","full_name":"juttle/juttle","owner":{"login":"juttle","id":8988633,"avatar_url":"https://avatars.githubusercontent.com/u/8988633?v=3","gravatar_id":"","url":"https://api.github.com/users/juttle","html_url":"https://github.com/juttle","followers_url":"https://api.github.com/users/juttle/followers","following_url":"https://api.github.com/users/juttle/following{/other_user}","gists_url":"https://api.github.com/users/juttle/gists{/gist_id}","starred_url":"https://api.github.com/users/juttle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juttle/subscriptions","organizations_url":"https://api.github.com/users/juttle/orgs","repos_url":"https://api.github.com/users/juttle/repos","events_url":"https://api.github.com/users/juttle/events{/privacy}","received_events_url":"https://api.github.com/users/juttle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/juttle/juttle","description":"Juttle dataflow programming langauge","fork":false,"url":"https://api.github.com/repos/juttle/juttle","forks_url":"https://api.github.com/repos/juttle/juttle/forks","keys_url":"https://api.github.com/repos/juttle/juttle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/juttle/juttle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/juttle/juttle/teams","hooks_url":"https://api.github.com/repos/juttle/juttle/hooks","issue_events_url":"https://api.github.com/repos/juttle/juttle/issues/events{/number}","events_url":"https://api.github.com/repos/juttle/juttle/events","assignees_url":"https://api.github.com/repos/juttle/juttle/assignees{/user}","branches_url":"https://api.github.com/repos/juttle/juttle/branches{/branch}","tags_url":"https://api.github.com/repos/juttle/juttle/tags","blobs_url":"https://api.github.com/repos/juttle/juttle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/juttle/juttle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/juttle/juttle/git/refs{/sha}","trees_url":"https://api.github.com/repos/juttle/juttle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/juttle/juttle/statuses/{sha}","languages_url":"https://api.github.com/repos/juttle/juttle/languages","stargazers_url":"https://api.github.com/repos/juttle/juttle/stargazers","contributors_url":"https://api.github.com/repos/juttle/juttle/contributors","subscribers_url":"https://api.github.com/repos/juttle/juttle/subscribers","subscription_url":"https://api.github.com/repos/juttle/juttle/subscription","commits_url":"https://api.github.com/repos/juttle/juttle/commits{/sha}","git_commits_url":"https://api.github.com/repos/juttle/juttle/git/commits{/sha}","comments_url":"https://api.github.com/repos/juttle/juttle/comments{/number}","issue_comment_url":"https://api.github.com/repos/juttle/juttle/issues/comments{/number}","contents_url":"https://api.github.com/repos/juttle/juttle/contents/{+path}","compare_url":"https://api.github.com/repos/juttle/juttle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/juttle/juttle/merges","archive_url":"https://api.github.com/repos/juttle/juttle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/juttle/juttle/downloads","issues_url":"https://api.github.com/repos/juttle/juttle/issues{/number}","pulls_url":"https://api.github.com/repos/juttle/juttle/pulls{/number}","milestones_url":"https://api.github.com/repos/juttle/juttle/milestones{/number}","notifications_url":"https://api.github.com/repos/juttle/juttle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/juttle/juttle/labels{/name}","releases_url":"https://api.github.com/repos/juttle/juttle/releases{/id}","created_at":"2015-12-18T22:50:40Z","updated_at":"2015-12-23T12:39:31Z","pushed_at":"2015-12-29T17:53:39Z","git_url":"git://github.com/juttle/juttle.git","ssh_url":"git@github.com:juttle/juttle.git","clone_url":"https://github.com/juttle/juttle.git","svn_url":"https://github.com/juttle/juttle","homepage":null,"size":2382,"stargazers_count":14,"watchers_count":14,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":54,"forks":3,"open_issues":54,"watchers":14,"default_branch":"master"}},"base":{"label":"juttle:master","ref":"master","sha":"a9251840a6a120e18b1d50ce77576c7f6cbbcf4d","user":{"login":"juttle","id":8988633,"avatar_url":"https://avatars.githubusercontent.com/u/8988633?v=3","gravatar_id":"","url":"https://api.github.com/users/juttle","html_url":"https://github.com/juttle","followers_url":"https://api.github.com/users/juttle/followers","following_url":"https://api.github.com/users/juttle/following{/other_user}","gists_url":"https://api.github.com/users/juttle/gists{/gist_id}","starred_url":"https://api.github.com/users/juttle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juttle/subscriptions","organizations_url":"https://api.github.com/users/juttle/orgs","repos_url":"https://api.github.com/users/juttle/repos","events_url":"https://api.github.com/users/juttle/events{/privacy}","received_events_url":"https://api.github.com/users/juttle/received_events","type":"Organization","site_admin":false},"repo":{"id":48260003,"name":"juttle","full_name":"juttle/juttle","owner":{"login":"juttle","id":8988633,"avatar_url":"https://avatars.githubusercontent.com/u/8988633?v=3","gravatar_id":"","url":"https://api.github.com/users/juttle","html_url":"https://github.com/juttle","followers_url":"https://api.github.com/users/juttle/followers","following_url":"https://api.github.com/users/juttle/following{/other_user}","gists_url":"https://api.github.com/users/juttle/gists{/gist_id}","starred_url":"https://api.github.com/users/juttle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juttle/subscriptions","organizations_url":"https://api.github.com/users/juttle/orgs","repos_url":"https://api.github.com/users/juttle/repos","events_url":"https://api.github.com/users/juttle/events{/privacy}","received_events_url":"https://api.github.com/users/juttle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/juttle/juttle","description":"Juttle dataflow programming langauge","fork":false,"url":"https://api.github.com/repos/juttle/juttle","forks_url":"https://api.github.com/repos/juttle/juttle/forks","keys_url":"https://api.github.com/repos/juttle/juttle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/juttle/juttle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/juttle/juttle/teams","hooks_url":"https://api.github.com/repos/juttle/juttle/hooks","issue_events_url":"https://api.github.com/repos/juttle/juttle/issues/events{/number}","events_url":"https://api.github.com/repos/juttle/juttle/events","assignees_url":"https://api.github.com/repos/juttle/juttle/assignees{/user}","branches_url":"https://api.github.com/repos/juttle/juttle/branches{/branch}","tags_url":"https://api.github.com/repos/juttle/juttle/tags","blobs_url":"https://api.github.com/repos/juttle/juttle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/juttle/juttle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/juttle/juttle/git/refs{/sha}","trees_url":"https://api.github.com/repos/juttle/juttle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/juttle/juttle/statuses/{sha}","languages_url":"https://api.github.com/repos/juttle/juttle/languages","stargazers_url":"https://api.github.com/repos/juttle/juttle/stargazers","contributors_url":"https://api.github.com/repos/juttle/juttle/contributors","subscribers_url":"https://api.github.com/repos/juttle/juttle/subscribers","subscription_url":"https://api.github.com/repos/juttle/juttle/subscription","commits_url":"https://api.github.com/repos/juttle/juttle/commits{/sha}","git_commits_url":"https://api.github.com/repos/juttle/juttle/git/commits{/sha}","comments_url":"https://api.github.com/repos/juttle/juttle/comments{/number}","issue_comment_url":"https://api.github.com/repos/juttle/juttle/issues/comments{/number}","contents_url":"https://api.github.com/repos/juttle/juttle/contents/{+path}","compare_url":"https://api.github.com/repos/juttle/juttle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/juttle/juttle/merges","archive_url":"https://api.github.com/repos/juttle/juttle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/juttle/juttle/downloads","issues_url":"https://api.github.com/repos/juttle/juttle/issues{/number}","pulls_url":"https://api.github.com/repos/juttle/juttle/pulls{/number}","milestones_url":"https://api.github.com/repos/juttle/juttle/milestones{/number}","notifications_url":"https://api.github.com/repos/juttle/juttle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/juttle/juttle/labels{/name}","releases_url":"https://api.github.com/repos/juttle/juttle/releases{/id}","created_at":"2015-12-18T22:50:40Z","updated_at":"2015-12-23T12:39:31Z","pushed_at":"2015-12-29T17:53:39Z","git_url":"git://github.com/juttle/juttle.git","ssh_url":"git@github.com:juttle/juttle.git","clone_url":"https://github.com/juttle/juttle.git","svn_url":"https://github.com/juttle/juttle","homepage":null,"size":2382,"stargazers_count":14,"watchers_count":14,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":54,"forks":3,"open_issues":54,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/juttle/juttle/pulls/15"},"html":{"href":"https://github.com/juttle/juttle/pull/15"},"issue":{"href":"https://api.github.com/repos/juttle/juttle/issues/15"},"comments":{"href":"https://api.github.com/repos/juttle/juttle/issues/15/comments"},"review_comments":{"href":"https://api.github.com/repos/juttle/juttle/pulls/15/comments"},"review_comment":{"href":"https://api.github.com/repos/juttle/juttle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/juttle/juttle/pulls/15/commits"},"statuses":{"href":"https://api.github.com/repos/juttle/juttle/statuses/1a2ebfe873033f47cbb4538db289562bbbce142f"}}}}