{"action":"created","comment":{"url":"https://api.github.com/repos/bblfsh/documentation/pulls/comments/182027360","pull_request_review_id":112718555,"id":182027360,"diff_hunk":"@@ -0,0 +1,549 @@\n+# Transformation DSL\n+\n+Transformation DSL is a library that provides functions for transforming\n+AST between different representations and shapes (native, UAST, custom).\n+\n+Transformations that use DSL usually consist of two steps: source transform\n+and target transform. This pair is called \"mapping\" in SDK.\n+\n+```golang\n+Map(\"test\",\n+\n+    // source tree\n+    Obj{\n+        \"type\": String(\"Ident\"),\n+        \"name\": Var(\"x\"),\n+    },\n+\n+    // target tree (destination)\n+    Obj{\n+        \"type\": String(\"go:Ident\"),\n+        \"token\": Var(\"x\"),\n+    },\n+)\n+```\n+\n+Each part consists of multiple simple operations that are combined together\n+to describe a final transformation (tree shape).\n+\n+```golang\n+// AST node should be an object (a map)\n+Obj{\n+\n+    // should have a \"type\" property set to \"Ident\" string\n+    \"type\": String(\"Ident\"),\n+\n+    // should have a \"name\" with any value\n+    \"name\": Var(\"x\"),\n+},\n+```\n+\n+## Operations\n+\n+Operations may run in two modes: `Check` and `Construct`.\n+\n+First mode checks if a specific AST node matches operation constraints.\n+If it does, an operation may store additional information to the state\n+associated with this AST node (more on this below).\n+\n+```golang\n+Obj{\n+    \"type\": String(\"Ident\"),\n+\n+    // store field value to a state variable \"x\"\n+    \"name\": Var(\"x\"),\n+},\n+```\n+\n+`Construct` mode uses the state associated with AST node to reconstruct\n+original node.\n+\n+These two modes are executed in one by one to transform an AST:\n+\n+```golang\n+// create a new state for this AST node\n+s := NewState()\n+\n+// verify that an AST tree matches all constraints of this transform\n+if ok, _ := op.Check(s, ast); ok {\n+    // construct a new AST using stored state (will match original AST)\n+    newAST, _ := op.Construct(s, nil)\n+}\n+\n+s.Reset()\n+\n+// check/apply next transform\n+```\n+\n+### Examples\n+\n+Let's consider few examples. We will use a transformation defined above.\n+\n+```json\n+[\n+    {\"type\":\"Ident\", \"name\": null, \"offset\": 5}\n+]\n+```\n+\n+By running a `Check` directly on this AST will fail, since the root is\n+an array, while an operation requires it to be an object (`Obj` operation).\n+Operations always match only the root node without recursively traversing\n+to children. `Mapping` on the other hand, runs operations for all nodes\n+recursively.\n+\n+Let's assume we run an operation for an element of that array.\n+\n+```json\n+{\"type\":\"Ident\", \"name\": null, \"offset\": 5}\n+```\n+\n+First operation (`Obj`) will succeed and proceed to checking fields.\n+\n+```golang\n+\"type\": String(\"Ident\"),\n+```\n+\n+This field check will succeed, since the node contains \"type\" field and\n+it indeed contains an \"Ident\" string.\n+\n+```golang\n+\"name\": Var(\"x\"),\n+```\n+\n+The \"name\" field exists in the object, and `null` value will be stored\n+as a state variable \"x\". Note that DSL makes a distinction between nil\n+fields and fields that does not exist. Variables can store any node\n+type, even if the value is null, thus it will be stored in node state:\n+\n+```json\n+{\n+    \"x\": null\n+}\n+```\n+\n+These are the only constraints that were defined for this transform, but\n+we still have an \"offset\" field left. At this point `Check` will fail\n+because \"offset\" field was not handled by a transform. This usually means\n+that AST shape was changed unexpectedly, or developer forgot to describe\n+this field. Both cases indicate an error that must be addressed\n+(see Completeness section for more details).\n+\n+But we can define our transform as partial and it will automatically\n+store all unhandled field to node state, which is useful if e want to\n+change only specific fields:\n+\n+```golang\n+Part(\"other\", Obj{ ... })\n+```\n+\n+In this case, `Check` will succeed and produce the following node state:\n+\n+```json\n+{\n+    \"x\": null,\n+    \"other\": {\"offset\": 5}\n+}\n+```\n+\n+Now, we will reconstruct an AST tree by using `Construct` method and\n+the state for this node that we just received:\n+\n+```\n+newAST, _ := op.Construct(s, nil)\n+```\n+\n+In this case process runs in reverse - each operation uses state to\n+reconstruct AST nodes based on defined constraints.\n+\n+First, an `Obj` operation will construct an empty AST node:\n+\n+```json\n+{}\n+```\n+\n+Then, it will start to populate fields:\n+\n+```golang\n+\"type\": String(\"Ident\"),\n+```\n+\n+For this field, everything is strictly defined and no state is required\n+to reconstruct the field - it will simply assign a \"type\" to \"Ident\".\n+\n+```json\n+{\n+    \"type\": \"Ident\"\n+}\n+```\n+\n+For the \"name\" field the state is required to reconstruct it:\n+\n+```golang\n+\"name\": Var(\"x\"),\n+```\n+\n+At this point, state variable \"x\" will be used to reconstruct the field\n+value (assign it to null).\n+\n+Remember that variables can store any node type: it might have been\n+a string, an array or another AST node.\n+\n+```json\n+{\n+    \"type\": \"Ident\",\n+    \"name\": null\n+}\n+```\n+\n+Since there is no more constraints defined, `Part` transform will use\n+it's state stored in \"other\" variable to populate all unhandled fields:\n+\n+```json\n+{\n+    \"type\": \"Ident\",\n+    \"name\": null,\n+    \"offset\": 5\n+}\n+```\n+\n+As you can see, an operation can be used to describe a tree shape and\n+reconstruct it back, assuming that all placeholder variables used in\n+an operation are defined in node state.\n+\n+### Mappings\n+\n+Since mapping defines two operations (source and target), we can change\n+our code to use one operation for checking the tree and building\n+the state and a different operation for constructing it:\n+\n+```golang\n+A := Part(\"other\", Obj{\n+    \"type\": String(\"Ident\"),\n+    \"name\": Var(\"x\"),\n+})\n+\n+B := Part(\"other\", Obj{\n+    \"type\": String(\"go:Ident\"),\n+    \"token\": Var(\"x\"),\n+})\n+\n+s := NewState()\n+\n+// verify an AST with operation A, populate state\n+if ok, _ := A.Check(s, ast); ok {\n+    // construct a new AST using the state and operation B\n+    newAST, _ := B.Construct(s, nil)\n+}\n+```\n+\n+As long as all variable defined in A exactly match all variables defined\n+in B, `Check`-`Construct` routine will work the same way as described\n+in example section above.\n+\n+Since state only stores placeholder values, while operation defines the\n+shape of the tree, any complex shape transformation can be defined:\n+\n+```golang\n+Obj{\n+    \"type\": String(\"Binary\"),\n+    \"op\": Var(\"op\"),\n+    \"vals\": Arr( Var(\"left\"), Var(\"right\") ),\n+}\n+\n+// state: {\"op\": ..., \"left\": ..., \"right\": ...}\n+\n+Obj{\n+    \"type\": String(\"Binary\"),\n+    \"op\": Obj{\n+        \"type\": String(\"Operation\"),\n+        \"token\": Var(\"op\")\n+    },\n+    \"left\": Var(\"left\"),\n+    \"right\": Var(\"right\"),\n+}\n+```\n+\n+This example will transform this AST (matches the first transform):\n+\n+```json\n+{\n+    \"type\": \"Binary\",\n+    \"op\": \"+\",\n+    \"vals\": [\n+        {\"type\":\"Ident\", \"name\": \"v\"},\n+        5\n+    ]\n+}\n+```\n+\n+Into a new AST (defined by the second transform):\n+\n+```json\n+{\n+    \"type\": \"Binary\",\n+    \"op\": {\n+        \"type\": \"Operation\",\n+        \"token\": \"+\"\n+    },\n+    \"left\": {\"type\":\"Ident\", \"name\": \"v\"},\n+    \"right\": 5\n+}\n+```\n+\n+\n+## Restrictions\n+\n+DSL also enforces few restrictions on transformations and operations.\n+\n+### Completeness\n+\n+All operations should either:\n+\n+* Reject the tree if it does not match one of constraints.\n+\n+* Describe the whole tree, and save unknown/placeholder nodes to the state.\n+\n+This rule ensures that if an operation matches the tree, it would be able\n+to replicate it from a state associated with the node, since all fields\n+are covered by it.\n+\n+This property allows to test each transformation by executing\n+`Check`-`Construct` routine, or detect if a mapping defined by a driver\n+developer ignores certain AST fields that are seen in the wild\n+(will result in an error).\n+\n+### Reversibility\n+\n+Since all operations are required to implement both `Check` and `Construct`\n+they can be used interchangeably as either source and/or target transforms.\n+\n+In simple case it means that transform A can produce the state S for AST\n+node T (with `Check`), and then reconstruct an original node T (with `Construct`)\n+by only using the state S.\n+\n+```\n+S := A.Check(T); A.Construct(S) == T\n+```\n+\n+In a more complete example, it's possible for transform A to check\n+the tree T, produce the state S and for transform B to use this state\n+to construct a new tree T'. At the same time the opposite is true:\n+transform B can be used to produce state S from T' for A to reconstruct\n+original tree T.\n+\n+```\n+// forward transform\n+S  := A.Check(T)\n+T' := B.Construct(S)\n+\n+// reverse transform\n+S' := B.Check(T')\n+S == S'\n+T == A.Construct(S')\n+```\n+\n+## List of operations\n+\n+### Values\n+\n+#### Any value\n+\n+In case any value can match the transformation, it should be stored into\n+a named variable: `Var(\"x\")`. Any name can be used for the variable as\n+long as it is unique in this transformation.\n+\n+When writing mappings, variable with the same name should exist in the\n+second transformation.\n+\n+#### Equal\n+\n+To check value for exact match, `Is(v)` operation is used.\n+\n+SDK defines helpers for common types: `String(v)`, `Int(v)`, etc.\n+\n+Null values can be checked with `Is(nil)`.\n+\n+#### Equal or nil\n+\n+To check any node for nil or specific rule `Opt` is used:\n+\n+```\n+Opt(\"is_nil\", Is(42))\n+```\n+\n+`Opt` needs a named variable to store it's state (\"is_nil\" in this case).\n+\n+#### Value in\n+\n+To check that value equal any value in the list, two operations should be\n+executed:\n+\n+1) Check that value is in the list.\n+\n+2) Store the value into a variable.\n+\n+To express this, `Check` helper can be used:\n+\n+```golang\n+Check(\n+    // condition\n+    In(\n+        uast.String(\"A\"),\n+        uast.String(\"B\"),\n+    ),\n+\n+    // action\n+    Var(\"x\"),\n+)\n+```\n+\n+#### Not equal, not in, etc\n+\n+To check value is not equal `Check` can be combined with `Not`:\n+\n+```golang\n+Check(\n+    // condition\n+    Not(String(\"A\")),\n+\n+    // store the value\n+    Var(\"x\"),\n+)\n+```\n+\n+Note that value can still be of any type and type constraint of `String`\n+will not affect the variable.\n+\n+The same way a value can be checked for \"not in\" constraint:\n+\n+```golang\n+Check(\n+    Not(In(\n+            uast.String(\"A\"),\n+            uast.String(\"B\"),\n+    )),\n+    // store the value\n+    Var(\"x\"),\n+)\n+```\n+\n+### Objects\n+\n+#### Empty object\n+\n+To represent an empty object, `Obj{}` can be used.\n+\n+#### Object or nil\n+\n+To check any node for nil or specific rule `Opt` is used:\n+\n+```\n+Opt(\"is_nil\", Obj{ ... })\n+```\n+\n+`Opt` needs a named variable to store it's state (\"is_nil\" in this case).\n+\n+#### All fields must exist\n+\n+For object that always have a specific set of fields, `Obj` operation\n+can be used:\n+\n+```golang\n+Obj{\n+    \"type\": String(\"Ident\"),\n+    \"name\": Var(\"name\"),\n+}\n+```\n+\n+Since this operation is represented by a map, order of operations is not\n+preserved. Operations will be executed in order of field name sorting.\n+This might affect operations that requres a variable to be defined, such\n+as `Lookup` and `If`. To control execution order, use `Fields`.","path":"driver/transform-dsl.md","position":461,"original_position":461,"commit_id":"8ad32e023b8943832c6c505803b2c170fb936eae","original_commit_id":"8ad32e023b8943832c6c505803b2c170fb936eae","user":{"login":"juanjux","id":277378,"avatar_url":"https://avatars2.githubusercontent.com/u/277378?v=4","gravatar_id":"","url":"https://api.github.com/users/juanjux","html_url":"https://github.com/juanjux","followers_url":"https://api.github.com/users/juanjux/followers","following_url":"https://api.github.com/users/juanjux/following{/other_user}","gists_url":"https://api.github.com/users/juanjux/gists{/gist_id}","starred_url":"https://api.github.com/users/juanjux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juanjux/subscriptions","organizations_url":"https://api.github.com/users/juanjux/orgs","repos_url":"https://api.github.com/users/juanjux/repos","events_url":"https://api.github.com/users/juanjux/events{/privacy}","received_events_url":"https://api.github.com/users/juanjux/received_events","type":"User","site_admin":false},"body":"**the** execution order","created_at":"2018-04-17T10:36:37Z","updated_at":"2018-04-17T10:50:56Z","html_url":"https://github.com/bblfsh/documentation/pull/156#discussion_r182027360","pull_request_url":"https://api.github.com/repos/bblfsh/documentation/pulls/156","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/comments/182027360"},"html":{"href":"https://github.com/bblfsh/documentation/pull/156#discussion_r182027360"},"pull_request":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/156"}}},"pull_request":{"url":"https://api.github.com/repos/bblfsh/documentation/pulls/156","id":181569626,"html_url":"https://github.com/bblfsh/documentation/pull/156","diff_url":"https://github.com/bblfsh/documentation/pull/156.diff","patch_url":"https://github.com/bblfsh/documentation/pull/156.patch","issue_url":"https://api.github.com/repos/bblfsh/documentation/issues/156","number":156,"state":"open","locked":false,"title":"Update docs for BIP-5","user":{"login":"dennwc","id":676724,"avatar_url":"https://avatars3.githubusercontent.com/u/676724?v=4","gravatar_id":"","url":"https://api.github.com/users/dennwc","html_url":"https://github.com/dennwc","followers_url":"https://api.github.com/users/dennwc/followers","following_url":"https://api.github.com/users/dennwc/following{/other_user}","gists_url":"https://api.github.com/users/dennwc/gists{/gist_id}","starred_url":"https://api.github.com/users/dennwc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dennwc/subscriptions","organizations_url":"https://api.github.com/users/dennwc/orgs","repos_url":"https://api.github.com/users/dennwc/repos","events_url":"https://api.github.com/users/dennwc/events{/privacy}","received_events_url":"https://api.github.com/users/dennwc/received_events","type":"User","site_admin":false},"body":"* update BIP-5 description to more closely match final implementation (naming and syntax details)\r\n\r\n* add a guide for transformation DSL\r\n\r\nWork in progress.","created_at":"2018-04-13T18:55:47Z","updated_at":"2018-04-17T10:50:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f4ea51682fdb69166e181811d83b01407e241af3","assignee":{"login":"dennwc","id":676724,"avatar_url":"https://avatars3.githubusercontent.com/u/676724?v=4","gravatar_id":"","url":"https://api.github.com/users/dennwc","html_url":"https://github.com/dennwc","followers_url":"https://api.github.com/users/dennwc/followers","following_url":"https://api.github.com/users/dennwc/following{/other_user}","gists_url":"https://api.github.com/users/dennwc/gists{/gist_id}","starred_url":"https://api.github.com/users/dennwc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dennwc/subscriptions","organizations_url":"https://api.github.com/users/dennwc/orgs","repos_url":"https://api.github.com/users/dennwc/repos","events_url":"https://api.github.com/users/dennwc/events{/privacy}","received_events_url":"https://api.github.com/users/dennwc/received_events","type":"User","site_admin":false},"assignees":[{"login":"dennwc","id":676724,"avatar_url":"https://avatars3.githubusercontent.com/u/676724?v=4","gravatar_id":"","url":"https://api.github.com/users/dennwc","html_url":"https://github.com/dennwc","followers_url":"https://api.github.com/users/dennwc/followers","following_url":"https://api.github.com/users/dennwc/following{/other_user}","gists_url":"https://api.github.com/users/dennwc/gists{/gist_id}","starred_url":"https://api.github.com/users/dennwc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dennwc/subscriptions","organizations_url":"https://api.github.com/users/dennwc/orgs","repos_url":"https://api.github.com/users/dennwc/repos","events_url":"https://api.github.com/users/dennwc/events{/privacy}","received_events_url":"https://api.github.com/users/dennwc/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"mcuadros","id":1573114,"avatar_url":"https://avatars0.githubusercontent.com/u/1573114?v=4","gravatar_id":"","url":"https://api.github.com/users/mcuadros","html_url":"https://github.com/mcuadros","followers_url":"https://api.github.com/users/mcuadros/followers","following_url":"https://api.github.com/users/mcuadros/following{/other_user}","gists_url":"https://api.github.com/users/mcuadros/gists{/gist_id}","starred_url":"https://api.github.com/users/mcuadros/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcuadros/subscriptions","organizations_url":"https://api.github.com/users/mcuadros/orgs","repos_url":"https://api.github.com/users/mcuadros/repos","events_url":"https://api.github.com/users/mcuadros/events{/privacy}","received_events_url":"https://api.github.com/users/mcuadros/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":548852828,"url":"https://api.github.com/repos/bblfsh/documentation/labels/enhancement","name":"enhancement","color":"84b6eb","default":true}],"milestone":null,"commits_url":"https://api.github.com/repos/bblfsh/documentation/pulls/156/commits","review_comments_url":"https://api.github.com/repos/bblfsh/documentation/pulls/156/comments","review_comment_url":"https://api.github.com/repos/bblfsh/documentation/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bblfsh/documentation/issues/156/comments","statuses_url":"https://api.github.com/repos/bblfsh/documentation/statuses/8ad32e023b8943832c6c505803b2c170fb936eae","head":{"label":"dennwc:bip-5","ref":"bip-5","sha":"8ad32e023b8943832c6c505803b2c170fb936eae","user":{"login":"dennwc","id":676724,"avatar_url":"https://avatars3.githubusercontent.com/u/676724?v=4","gravatar_id":"","url":"https://api.github.com/users/dennwc","html_url":"https://github.com/dennwc","followers_url":"https://api.github.com/users/dennwc/followers","following_url":"https://api.github.com/users/dennwc/following{/other_user}","gists_url":"https://api.github.com/users/dennwc/gists{/gist_id}","starred_url":"https://api.github.com/users/dennwc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dennwc/subscriptions","organizations_url":"https://api.github.com/users/dennwc/orgs","repos_url":"https://api.github.com/users/dennwc/repos","events_url":"https://api.github.com/users/dennwc/events{/privacy}","received_events_url":"https://api.github.com/users/dennwc/received_events","type":"User","site_admin":false},"repo":{"id":124921001,"name":"documentation","full_name":"dennwc/documentation","owner":{"login":"dennwc","id":676724,"avatar_url":"https://avatars3.githubusercontent.com/u/676724?v=4","gravatar_id":"","url":"https://api.github.com/users/dennwc","html_url":"https://github.com/dennwc","followers_url":"https://api.github.com/users/dennwc/followers","following_url":"https://api.github.com/users/dennwc/following{/other_user}","gists_url":"https://api.github.com/users/dennwc/gists{/gist_id}","starred_url":"https://api.github.com/users/dennwc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dennwc/subscriptions","organizations_url":"https://api.github.com/users/dennwc/orgs","repos_url":"https://api.github.com/users/dennwc/repos","events_url":"https://api.github.com/users/dennwc/events{/privacy}","received_events_url":"https://api.github.com/users/dennwc/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dennwc/documentation","description":"Babelfish documentation (gitbook sources)","fork":true,"url":"https://api.github.com/repos/dennwc/documentation","forks_url":"https://api.github.com/repos/dennwc/documentation/forks","keys_url":"https://api.github.com/repos/dennwc/documentation/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dennwc/documentation/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dennwc/documentation/teams","hooks_url":"https://api.github.com/repos/dennwc/documentation/hooks","issue_events_url":"https://api.github.com/repos/dennwc/documentation/issues/events{/number}","events_url":"https://api.github.com/repos/dennwc/documentation/events","assignees_url":"https://api.github.com/repos/dennwc/documentation/assignees{/user}","branches_url":"https://api.github.com/repos/dennwc/documentation/branches{/branch}","tags_url":"https://api.github.com/repos/dennwc/documentation/tags","blobs_url":"https://api.github.com/repos/dennwc/documentation/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dennwc/documentation/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dennwc/documentation/git/refs{/sha}","trees_url":"https://api.github.com/repos/dennwc/documentation/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dennwc/documentation/statuses/{sha}","languages_url":"https://api.github.com/repos/dennwc/documentation/languages","stargazers_url":"https://api.github.com/repos/dennwc/documentation/stargazers","contributors_url":"https://api.github.com/repos/dennwc/documentation/contributors","subscribers_url":"https://api.github.com/repos/dennwc/documentation/subscribers","subscription_url":"https://api.github.com/repos/dennwc/documentation/subscription","commits_url":"https://api.github.com/repos/dennwc/documentation/commits{/sha}","git_commits_url":"https://api.github.com/repos/dennwc/documentation/git/commits{/sha}","comments_url":"https://api.github.com/repos/dennwc/documentation/comments{/number}","issue_comment_url":"https://api.github.com/repos/dennwc/documentation/issues/comments{/number}","contents_url":"https://api.github.com/repos/dennwc/documentation/contents/{+path}","compare_url":"https://api.github.com/repos/dennwc/documentation/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dennwc/documentation/merges","archive_url":"https://api.github.com/repos/dennwc/documentation/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dennwc/documentation/downloads","issues_url":"https://api.github.com/repos/dennwc/documentation/issues{/number}","pulls_url":"https://api.github.com/repos/dennwc/documentation/pulls{/number}","milestones_url":"https://api.github.com/repos/dennwc/documentation/milestones{/number}","notifications_url":"https://api.github.com/repos/dennwc/documentation/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dennwc/documentation/labels{/name}","releases_url":"https://api.github.com/repos/dennwc/documentation/releases{/id}","deployments_url":"https://api.github.com/repos/dennwc/documentation/deployments","created_at":"2018-03-12T16:47:47Z","updated_at":"2018-03-12T16:47:49Z","pushed_at":"2018-04-13T18:52:37Z","git_url":"git://github.com/dennwc/documentation.git","ssh_url":"git@github.com:dennwc/documentation.git","clone_url":"https://github.com/dennwc/documentation.git","svn_url":"https://github.com/dennwc/documentation","homepage":"https://doc.bblf.sh","size":270,"stargazers_count":0,"watchers_count":0,"language":"Go","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":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bblfsh:master","ref":"master","sha":"d72622a554d322bb2d296ad66148bd4634ffb2b6","user":{"login":"bblfsh","id":25795418,"avatar_url":"https://avatars0.githubusercontent.com/u/25795418?v=4","gravatar_id":"","url":"https://api.github.com/users/bblfsh","html_url":"https://github.com/bblfsh","followers_url":"https://api.github.com/users/bblfsh/followers","following_url":"https://api.github.com/users/bblfsh/following{/other_user}","gists_url":"https://api.github.com/users/bblfsh/gists{/gist_id}","starred_url":"https://api.github.com/users/bblfsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bblfsh/subscriptions","organizations_url":"https://api.github.com/users/bblfsh/orgs","repos_url":"https://api.github.com/users/bblfsh/repos","events_url":"https://api.github.com/users/bblfsh/events{/privacy}","received_events_url":"https://api.github.com/users/bblfsh/received_events","type":"Organization","site_admin":false},"repo":{"id":83300077,"name":"documentation","full_name":"bblfsh/documentation","owner":{"login":"bblfsh","id":25795418,"avatar_url":"https://avatars0.githubusercontent.com/u/25795418?v=4","gravatar_id":"","url":"https://api.github.com/users/bblfsh","html_url":"https://github.com/bblfsh","followers_url":"https://api.github.com/users/bblfsh/followers","following_url":"https://api.github.com/users/bblfsh/following{/other_user}","gists_url":"https://api.github.com/users/bblfsh/gists{/gist_id}","starred_url":"https://api.github.com/users/bblfsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bblfsh/subscriptions","organizations_url":"https://api.github.com/users/bblfsh/orgs","repos_url":"https://api.github.com/users/bblfsh/repos","events_url":"https://api.github.com/users/bblfsh/events{/privacy}","received_events_url":"https://api.github.com/users/bblfsh/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bblfsh/documentation","description":"Babelfish documentation (gitbook sources)","fork":false,"url":"https://api.github.com/repos/bblfsh/documentation","forks_url":"https://api.github.com/repos/bblfsh/documentation/forks","keys_url":"https://api.github.com/repos/bblfsh/documentation/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bblfsh/documentation/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bblfsh/documentation/teams","hooks_url":"https://api.github.com/repos/bblfsh/documentation/hooks","issue_events_url":"https://api.github.com/repos/bblfsh/documentation/issues/events{/number}","events_url":"https://api.github.com/repos/bblfsh/documentation/events","assignees_url":"https://api.github.com/repos/bblfsh/documentation/assignees{/user}","branches_url":"https://api.github.com/repos/bblfsh/documentation/branches{/branch}","tags_url":"https://api.github.com/repos/bblfsh/documentation/tags","blobs_url":"https://api.github.com/repos/bblfsh/documentation/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bblfsh/documentation/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bblfsh/documentation/git/refs{/sha}","trees_url":"https://api.github.com/repos/bblfsh/documentation/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bblfsh/documentation/statuses/{sha}","languages_url":"https://api.github.com/repos/bblfsh/documentation/languages","stargazers_url":"https://api.github.com/repos/bblfsh/documentation/stargazers","contributors_url":"https://api.github.com/repos/bblfsh/documentation/contributors","subscribers_url":"https://api.github.com/repos/bblfsh/documentation/subscribers","subscription_url":"https://api.github.com/repos/bblfsh/documentation/subscription","commits_url":"https://api.github.com/repos/bblfsh/documentation/commits{/sha}","git_commits_url":"https://api.github.com/repos/bblfsh/documentation/git/commits{/sha}","comments_url":"https://api.github.com/repos/bblfsh/documentation/comments{/number}","issue_comment_url":"https://api.github.com/repos/bblfsh/documentation/issues/comments{/number}","contents_url":"https://api.github.com/repos/bblfsh/documentation/contents/{+path}","compare_url":"https://api.github.com/repos/bblfsh/documentation/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bblfsh/documentation/merges","archive_url":"https://api.github.com/repos/bblfsh/documentation/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bblfsh/documentation/downloads","issues_url":"https://api.github.com/repos/bblfsh/documentation/issues{/number}","pulls_url":"https://api.github.com/repos/bblfsh/documentation/pulls{/number}","milestones_url":"https://api.github.com/repos/bblfsh/documentation/milestones{/number}","notifications_url":"https://api.github.com/repos/bblfsh/documentation/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bblfsh/documentation/labels{/name}","releases_url":"https://api.github.com/repos/bblfsh/documentation/releases{/id}","deployments_url":"https://api.github.com/repos/bblfsh/documentation/deployments","created_at":"2017-02-27T10:54:12Z","updated_at":"2018-04-15T17:28:24Z","pushed_at":"2018-04-13T18:55:48Z","git_url":"git://github.com/bblfsh/documentation.git","ssh_url":"git@github.com:bblfsh/documentation.git","clone_url":"https://github.com/bblfsh/documentation.git","svn_url":"https://github.com/bblfsh/documentation","homepage":"https://doc.bblf.sh","size":259,"stargazers_count":17,"watchers_count":17,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":15,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":15,"open_issues":4,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/156"},"html":{"href":"https://github.com/bblfsh/documentation/pull/156"},"issue":{"href":"https://api.github.com/repos/bblfsh/documentation/issues/156"},"comments":{"href":"https://api.github.com/repos/bblfsh/documentation/issues/156/comments"},"review_comments":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/156/comments"},"review_comment":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bblfsh/documentation/pulls/156/commits"},"statuses":{"href":"https://api.github.com/repos/bblfsh/documentation/statuses/8ad32e023b8943832c6c505803b2c170fb936eae"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"juanjux"}}