{"action":"created","comment":{"url":"https://api.github.com/repos/ef-ctx/tranor/pulls/comments/81566201","pull_request_review_id":2517355,"id":81566201,"diff_hunk":"@@ -0,0 +1,636 @@\n+// Copyright 2016 EF CTX. All rights reserved.\n+// Use of this source code is governed by a BSD-style\n+// license that can be found in the LICENSE file.\n+\n+package main\n+\n+import (\n+\t\"bytes\"\n+\t\"encoding/json\"\n+\t\"net/http\"\n+\t\"testing\"\n+\n+\t\"github.com/tsuru/tsuru/cmd\"\n+)\n+\n+func TestProjectConfigSetInfo(t *testing.T) {\n+\tinfo := (&projectConfigSet{}).Info()\n+\tif info == nil {\n+\t\tt.Fatal(\"unexpected <nil> info\")\n+\t}\n+\tif info.Name != \"config-set\" {\n+\t\tt.Errorf(\"wrong name. want %q. got %q\", \"config-set\", info.Name)\n+\t}\n+\tif info.MinArgs != 1 {\n+\t\tt.Errorf(\"wrong min args. want 1. got %d\", info.MinArgs)\n+\t}\n+}\n+\n+func TestProjectConfigSet(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tappNames := []string{\"proj1-dev\", \"proj1-stage\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"POST\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: []byte(\"{}\"),\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigSet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t\t\"-p\", \"--no-restart\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{\n+\t\tStdout: &stdout,\n+\t\tStderr: &stderr,\n+\t\tArgs:   []string{\"USER_NAME=root\", \"USER_PASSWORD=r00t\", `PREFERRED_TEAM=\"some nice team\"`},\n+\t}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\texpectedOutput := `setting config vars in environment \"dev\"... ok\n+setting config vars in environment \"stage\"... ok\n+setting config vars in environment \"prod\"... ok\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%s\\ngot:\\n%s\", expectedOutput, stdout.String())\n+\t}\n+}\n+\n+func TestProjectConfigSetMissingName(t *testing.T) {\n+\tvar c projectConfigSet\n+\terr := c.Flags().Parse(true, []string{\"--no-restart\"})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err == nil {\n+\t\tt.Fatal(\"unexpected <nil> error\")\n+\t}\n+\texpectedMsg := \"please provide the name of the project\"\n+\tif err.Error() != expectedMsg {\n+\t\tt.Errorf(\"wrong error message\\nwant %q\\ngot  %q\", expectedMsg, err.Error())\n+\t}\n+}\n+\n+func TestProjectConfigSetInvalidFormat(t *testing.T) {\n+\tvar c projectConfigSet\n+\terr := c.Flags().Parse(true, []string{\"-n\", \"proj1\"})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr, Args: []string{\"ENV\"}}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err == nil {\n+\t\tt.Fatal(\"unexpected <nil> error\")\n+\t}\n+\texpectedMsg := \"configuration vars must be specified in the form NAME=value\"\n+\tif err.Error() != expectedMsg {\n+\t\tt.Errorf(\"wrong error message\\nwant %q\\ngot  %q\", expectedMsg, err.Error())\n+\t}\n+}\n+\n+func TestProjectConfigSetErrorInOneOfTheApps(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tserver.prepareResponse(preparedResponse{\n+\t\tmethod:  \"POST\",\n+\t\tpath:    \"/apps/proj1-stage/env\",\n+\t\tcode:    http.StatusInternalServerError,\n+\t\tpayload: []byte(\"something went wrong\"),\n+\t})\n+\tappNames := []string{\"proj1-dev\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"POST\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: []byte(\"{}\"),\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigSet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t\t\"-p\", \"--no-restart\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{\n+\t\tStdout: &stdout,\n+\t\tStderr: &stderr,\n+\t\tArgs:   []string{\"USER_NAME=root\", \"USER_PASSWORD=r00t\", `PREFERRED_TEAM=\"some nice team\"`},\n+\t}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err == nil {\n+\t\tt.Fatal(\"got unexpected <nil> error\")\n+\t}\n+\texpectedOutput := `setting config vars in environment \"dev\"... ok\n+setting config vars in environment \"stage\"... failed\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%s\\ngot:\\n%s\", expectedOutput, stdout.String())\n+\t}\n+}\n+\n+func TestProjectConfigSetAppNotFound(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tappNames := []string{\"proj1-dev\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"POST\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: []byte(\"{}\"),\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigSet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t\t\"-p\", \"--no-restart\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{\n+\t\tStdout: &stdout,\n+\t\tStderr: &stderr,\n+\t\tArgs:   []string{\"USER_NAME=root\", \"USER_PASSWORD=r00t\", `PREFERRED_TEAM=\"some nice team\"`},\n+\t}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\texpectedOutput := `setting config vars in environment \"dev\"... ok\n+setting config vars in environment \"stage\"... not found\n+setting config vars in environment \"prod\"... ok\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%s\\ngot:\\n%s\", expectedOutput, stdout.String())\n+\t}\n+}\n+\n+func TestProjectConfigGetInfo(t *testing.T) {\n+\tinfo := (&projectConfigGet{}).Info()\n+\tif info == nil {\n+\t\tt.Fatal(\"unexpected <nil> info\")\n+\t}\n+\tif info.Name != \"config-get\" {\n+\t\tt.Errorf(\"wrong name. want %q. got %q\", \"config-get\", info.Name)\n+\t}\n+}\n+\n+func TestProjectConfigGet(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tappNames := []string{\"proj1-dev\", \"proj1-stage\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\trawPayload := []map[string]interface{}{\n+\t\t\t{\n+\t\t\t\t\"name\":   \"APP_NAME\",\n+\t\t\t\t\"value\":  appName,\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_NAME\",\n+\t\t\t\t\"value\":  \"root\",\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_PASSWORD\",\n+\t\t\t\t\"value\":  \"r00t\",\n+\t\t\t\t\"public\": false,\n+\t\t\t},\n+\t\t}\n+\t\tpayload, _ := json.Marshal(rawPayload)\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"GET\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: payload,\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigGet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\texpectedOutput := `config vars in \"dev\":\n+\n+ APP_NAME=proj1-dev\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+config vars in \"stage\":\n+\n+ APP_NAME=proj1-stage\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+config vars in \"prod\":\n+\n+ APP_NAME=proj1-prod\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%q\\ngot:\\n%q\", expectedOutput, stdout.String())\n+\t}\n+}\n+\n+func TestProjectConfigGetMissingName(t *testing.T) {\n+\tvar c projectConfigGet\n+\terr := c.Flags().Parse(true, []string{\"-e\", \"dev,stage,prod\"})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err == nil {\n+\t\tt.Fatal(\"unexpected <nil> error\")\n+\t}\n+\texpectedMsg := \"please provide the name of the project\"\n+\tif err.Error() != expectedMsg {\n+\t\tt.Errorf(\"wrong error message\\nwant %q\\ngot  %q\", expectedMsg, err.Error())\n+\t}\n+}\n+\n+func TestProjectConfigGetAppNotFound(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tappNames := []string{\"proj1-dev\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\trawPayload := []map[string]interface{}{\n+\t\t\t{\n+\t\t\t\t\"name\":   \"APP_NAME\",\n+\t\t\t\t\"value\":  appName,\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_NAME\",\n+\t\t\t\t\"value\":  \"root\",\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_PASSWORD\",\n+\t\t\t\t\"value\":  \"r00t\",\n+\t\t\t\t\"public\": false,\n+\t\t\t},\n+\t\t}\n+\t\tpayload, _ := json.Marshal(rawPayload)\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"GET\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: payload,\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigGet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\texpectedOutput := `config vars in \"dev\":\n+\n+ APP_NAME=proj1-dev\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+config vars in \"prod\":\n+\n+ APP_NAME=proj1-prod\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%q\\ngot:\\n%q\", expectedOutput, stdout.String())\n+\t}\n+\texpectedStderr := `WARNING: project not found in environment \"stage\"` + \"\\n\"\n+\tif stderr.String() != expectedStderr {\n+\t\tt.Errorf(\"wrong error output\\nwant:\\n%q\\ngot:\\n%q\", expectedStderr, stderr.String())\n+\t}\n+}\n+\n+func TestProjectConfigGetErrorInOneOfTheApps(t *testing.T) {\n+\tserver := newFakeServer(t)\n+\tdefer server.stop()\n+\tserver.prepareResponse(preparedResponse{\n+\t\tmethod:  \"GET\",\n+\t\tpath:    \"/apps/proj1-stage/env\",\n+\t\tcode:    http.StatusInternalServerError,\n+\t\tpayload: []byte(\"something went wrong\"),\n+\t})\n+\tappNames := []string{\"proj1-dev\", \"proj1-prod\"}\n+\tfor _, appName := range appNames {\n+\t\trawPayload := []map[string]interface{}{\n+\t\t\t{\n+\t\t\t\t\"name\":   \"APP_NAME\",\n+\t\t\t\t\"value\":  appName,\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_NAME\",\n+\t\t\t\t\"value\":  \"root\",\n+\t\t\t\t\"public\": true,\n+\t\t\t},\n+\t\t\t{\n+\t\t\t\t\"name\":   \"USER_PASSWORD\",\n+\t\t\t\t\"value\":  \"r00t\",\n+\t\t\t\t\"public\": false,\n+\t\t\t},\n+\t\t}\n+\t\tpayload, _ := json.Marshal(rawPayload)\n+\t\tserver.prepareResponse(preparedResponse{\n+\t\t\tmethod:  \"GET\",\n+\t\t\tpath:    \"/apps/\" + appName + \"/env\",\n+\t\t\tcode:    http.StatusOK,\n+\t\t\tpayload: payload,\n+\t\t})\n+\t}\n+\tcleanup, err := setupFakeTarget(server.url())\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tdefer cleanup()\n+\tvar c projectConfigGet\n+\terr = c.Flags().Parse(true, []string{\n+\t\t\"-n\", \"proj1\",\n+\t\t\"-e\", \"dev,stage,prod\",\n+\t})\n+\tif err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tvar stdout, stderr bytes.Buffer\n+\tctx := cmd.Context{Stdout: &stdout, Stderr: &stderr}\n+\tclient := cmd.NewClient(http.DefaultClient, &ctx, &cmd.Manager{})\n+\terr = c.Run(&ctx, client)\n+\tif err == nil {\n+\t\tt.Fatal(\"unexpected <nil> error\")\n+\t}\n+\texpectedOutput := `config vars in \"dev\":\n+\n+ APP_NAME=proj1-dev\n+ USER_NAME=root\n+ USER_PASSWORD=*** (private config)\n+\n+\n+`\n+\tif stdout.String() != expectedOutput {\n+\t\tt.Errorf(\"wrong output\\nwant:\\n%q\\ngot:\\n%q\", expectedOutput, stdout.String())\n+\t}","path":"config_test.go","position":294,"original_position":456,"commit_id":"a5640adeb1ff18c767fdc4a07b83a479b663225a","original_commit_id":"a5640adeb1ff18c767fdc4a07b83a479b663225a","user":{"login":"aflag","id":33273,"avatar_url":"https://avatars.githubusercontent.com/u/33273?v=3","gravatar_id":"","url":"https://api.github.com/users/aflag","html_url":"https://github.com/aflag","followers_url":"https://api.github.com/users/aflag/followers","following_url":"https://api.github.com/users/aflag/following{/other_user}","gists_url":"https://api.github.com/users/aflag/gists{/gist_id}","starred_url":"https://api.github.com/users/aflag/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aflag/subscriptions","organizations_url":"https://api.github.com/users/aflag/orgs","repos_url":"https://api.github.com/users/aflag/repos","events_url":"https://api.github.com/users/aflag/events{/privacy}","received_events_url":"https://api.github.com/users/aflag/received_events","type":"User","site_admin":false},"body":"isn't anything written to stderr in this case? Why not do something similar to what happens with not found and continue exhibiting configuration for all environments which work and give a summary of errors in the end? I think the way it is could be a bit misleading to the user.","created_at":"2016-10-03T14:51:41Z","updated_at":"2016-10-03T14:54:19Z","html_url":"https://github.com/ef-ctx/tranor/pull/4#discussion_r81566201","pull_request_url":"https://api.github.com/repos/ef-ctx/tranor/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/comments/81566201"},"html":{"href":"https://github.com/ef-ctx/tranor/pull/4#discussion_r81566201"},"pull_request":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/ef-ctx/tranor/pulls/4","id":87656557,"html_url":"https://github.com/ef-ctx/tranor/pull/4","diff_url":"https://github.com/ef-ctx/tranor/pull/4.diff","patch_url":"https://github.com/ef-ctx/tranor/pull/4.patch","issue_url":"https://api.github.com/repos/ef-ctx/tranor/issues/4","number":4,"state":"open","locked":false,"title":"Project config (environment variables) commands","user":{"login":"fsouza","id":108725,"avatar_url":"https://avatars.githubusercontent.com/u/108725?v=3","gravatar_id":"","url":"https://api.github.com/users/fsouza","html_url":"https://github.com/fsouza","followers_url":"https://api.github.com/users/fsouza/followers","following_url":"https://api.github.com/users/fsouza/following{/other_user}","gists_url":"https://api.github.com/users/fsouza/gists{/gist_id}","starred_url":"https://api.github.com/users/fsouza/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fsouza/subscriptions","organizations_url":"https://api.github.com/users/fsouza/orgs","repos_url":"https://api.github.com/users/fsouza/repos","events_url":"https://api.github.com/users/fsouza/events{/privacy}","received_events_url":"https://api.github.com/users/fsouza/received_events","type":"User","site_admin":false},"body":"As I did in #3, I'm including a terminal session as an example:\r\n\r\n```\r\n% tranor config-get -n testchico -e dev,qa,stage,prod\r\nconfig vars in \"dev\":\r\n\r\n LAST_NAME=*** (private config)\r\n TSURU_APPNAME=*** (private config)\r\n TSURU_APPDIR=*** (private config)\r\n TSURU_APP_TOKEN=*** (private config)\r\n\r\n\r\nconfig vars in \"qa\":\r\n\r\n TSURU_APPNAME=*** (private config)\r\n TSURU_APPDIR=*** (private config)\r\n TSURU_APP_TOKEN=*** (private config)\r\n\r\n\r\nconfig vars in \"stage\":\r\n\r\n TSURU_APPNAME=*** (private config)\r\n TSURU_APPDIR=*** (private config)\r\n TSURU_APP_TOKEN=*** (private config)\r\n\r\n\r\nconfig vars in \"prod\":\r\n\r\n TSURU_APPNAME=*** (private config)\r\n TSURU_APPDIR=*** (private config)\r\n TSURU_APP_TOKEN=*** (private config)\r\n% tranor config-set -n testchico -e dev,qa,stage,prod USER_NAME=root\r\nsetting config vars in environment \"dev\"... ok\r\nsetting config vars in environment \"qa\"... ok\r\nsetting config vars in environment \"stage\"... ok\r\nsetting config vars in environment \"prod\"... ok\r\n% tranor config-unset -n testchico -e dev,qa,stage,prod USER_NAME\r\nunsetting config vars from environment \"dev\"... ok\r\nunsetting config vars from environment \"qa\"... ok\r\nunsetting config vars from environment \"stage\"... ok\r\nunsetting config vars from environment \"prod\"... ok\r\n```","created_at":"2016-10-03T02:25:57Z","updated_at":"2016-10-03T14:54:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"846367b4b334857eb3a5425d0343412be75fd05c","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ef-ctx/tranor/pulls/4/commits","review_comments_url":"https://api.github.com/repos/ef-ctx/tranor/pulls/4/comments","review_comment_url":"https://api.github.com/repos/ef-ctx/tranor/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ef-ctx/tranor/issues/4/comments","statuses_url":"https://api.github.com/repos/ef-ctx/tranor/statuses/a5640adeb1ff18c767fdc4a07b83a479b663225a","head":{"label":"ef-ctx:project-config","ref":"project-config","sha":"a5640adeb1ff18c767fdc4a07b83a479b663225a","user":{"login":"ef-ctx","id":5428519,"avatar_url":"https://avatars.githubusercontent.com/u/5428519?v=3","gravatar_id":"","url":"https://api.github.com/users/ef-ctx","html_url":"https://github.com/ef-ctx","followers_url":"https://api.github.com/users/ef-ctx/followers","following_url":"https://api.github.com/users/ef-ctx/following{/other_user}","gists_url":"https://api.github.com/users/ef-ctx/gists{/gist_id}","starred_url":"https://api.github.com/users/ef-ctx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ef-ctx/subscriptions","organizations_url":"https://api.github.com/users/ef-ctx/orgs","repos_url":"https://api.github.com/users/ef-ctx/repos","events_url":"https://api.github.com/users/ef-ctx/events{/privacy}","received_events_url":"https://api.github.com/users/ef-ctx/received_events","type":"Organization","site_admin":false},"repo":{"id":53431215,"name":"tranor","full_name":"ef-ctx/tranor","owner":{"login":"ef-ctx","id":5428519,"avatar_url":"https://avatars.githubusercontent.com/u/5428519?v=3","gravatar_id":"","url":"https://api.github.com/users/ef-ctx","html_url":"https://github.com/ef-ctx","followers_url":"https://api.github.com/users/ef-ctx/followers","following_url":"https://api.github.com/users/ef-ctx/following{/other_user}","gists_url":"https://api.github.com/users/ef-ctx/gists{/gist_id}","starred_url":"https://api.github.com/users/ef-ctx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ef-ctx/subscriptions","organizations_url":"https://api.github.com/users/ef-ctx/orgs","repos_url":"https://api.github.com/users/ef-ctx/repos","events_url":"https://api.github.com/users/ef-ctx/events{/privacy}","received_events_url":"https://api.github.com/users/ef-ctx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ef-ctx/tranor","description":"Tsuru plugin which adds the \"environment\" concept (eg. dev, QA, prod)  to Tsuru PaaS","fork":false,"url":"https://api.github.com/repos/ef-ctx/tranor","forks_url":"https://api.github.com/repos/ef-ctx/tranor/forks","keys_url":"https://api.github.com/repos/ef-ctx/tranor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ef-ctx/tranor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ef-ctx/tranor/teams","hooks_url":"https://api.github.com/repos/ef-ctx/tranor/hooks","issue_events_url":"https://api.github.com/repos/ef-ctx/tranor/issues/events{/number}","events_url":"https://api.github.com/repos/ef-ctx/tranor/events","assignees_url":"https://api.github.com/repos/ef-ctx/tranor/assignees{/user}","branches_url":"https://api.github.com/repos/ef-ctx/tranor/branches{/branch}","tags_url":"https://api.github.com/repos/ef-ctx/tranor/tags","blobs_url":"https://api.github.com/repos/ef-ctx/tranor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ef-ctx/tranor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ef-ctx/tranor/git/refs{/sha}","trees_url":"https://api.github.com/repos/ef-ctx/tranor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ef-ctx/tranor/statuses/{sha}","languages_url":"https://api.github.com/repos/ef-ctx/tranor/languages","stargazers_url":"https://api.github.com/repos/ef-ctx/tranor/stargazers","contributors_url":"https://api.github.com/repos/ef-ctx/tranor/contributors","subscribers_url":"https://api.github.com/repos/ef-ctx/tranor/subscribers","subscription_url":"https://api.github.com/repos/ef-ctx/tranor/subscription","commits_url":"https://api.github.com/repos/ef-ctx/tranor/commits{/sha}","git_commits_url":"https://api.github.com/repos/ef-ctx/tranor/git/commits{/sha}","comments_url":"https://api.github.com/repos/ef-ctx/tranor/comments{/number}","issue_comment_url":"https://api.github.com/repos/ef-ctx/tranor/issues/comments{/number}","contents_url":"https://api.github.com/repos/ef-ctx/tranor/contents/{+path}","compare_url":"https://api.github.com/repos/ef-ctx/tranor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ef-ctx/tranor/merges","archive_url":"https://api.github.com/repos/ef-ctx/tranor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ef-ctx/tranor/downloads","issues_url":"https://api.github.com/repos/ef-ctx/tranor/issues{/number}","pulls_url":"https://api.github.com/repos/ef-ctx/tranor/pulls{/number}","milestones_url":"https://api.github.com/repos/ef-ctx/tranor/milestones{/number}","notifications_url":"https://api.github.com/repos/ef-ctx/tranor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ef-ctx/tranor/labels{/name}","releases_url":"https://api.github.com/repos/ef-ctx/tranor/releases{/id}","deployments_url":"https://api.github.com/repos/ef-ctx/tranor/deployments","created_at":"2016-03-08T17:22:25Z","updated_at":"2016-06-28T10:34:52Z","pushed_at":"2016-10-03T02:25:57Z","git_url":"git://github.com/ef-ctx/tranor.git","ssh_url":"git@github.com:ef-ctx/tranor.git","clone_url":"https://github.com/ef-ctx/tranor.git","svn_url":"https://github.com/ef-ctx/tranor","homepage":null,"size":933,"stargazers_count":2,"watchers_count":2,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":2,"default_branch":"master"}},"base":{"label":"ef-ctx:master","ref":"master","sha":"0a8110b15966b0d3b991136033c3bb0c903e659c","user":{"login":"ef-ctx","id":5428519,"avatar_url":"https://avatars.githubusercontent.com/u/5428519?v=3","gravatar_id":"","url":"https://api.github.com/users/ef-ctx","html_url":"https://github.com/ef-ctx","followers_url":"https://api.github.com/users/ef-ctx/followers","following_url":"https://api.github.com/users/ef-ctx/following{/other_user}","gists_url":"https://api.github.com/users/ef-ctx/gists{/gist_id}","starred_url":"https://api.github.com/users/ef-ctx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ef-ctx/subscriptions","organizations_url":"https://api.github.com/users/ef-ctx/orgs","repos_url":"https://api.github.com/users/ef-ctx/repos","events_url":"https://api.github.com/users/ef-ctx/events{/privacy}","received_events_url":"https://api.github.com/users/ef-ctx/received_events","type":"Organization","site_admin":false},"repo":{"id":53431215,"name":"tranor","full_name":"ef-ctx/tranor","owner":{"login":"ef-ctx","id":5428519,"avatar_url":"https://avatars.githubusercontent.com/u/5428519?v=3","gravatar_id":"","url":"https://api.github.com/users/ef-ctx","html_url":"https://github.com/ef-ctx","followers_url":"https://api.github.com/users/ef-ctx/followers","following_url":"https://api.github.com/users/ef-ctx/following{/other_user}","gists_url":"https://api.github.com/users/ef-ctx/gists{/gist_id}","starred_url":"https://api.github.com/users/ef-ctx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ef-ctx/subscriptions","organizations_url":"https://api.github.com/users/ef-ctx/orgs","repos_url":"https://api.github.com/users/ef-ctx/repos","events_url":"https://api.github.com/users/ef-ctx/events{/privacy}","received_events_url":"https://api.github.com/users/ef-ctx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ef-ctx/tranor","description":"Tsuru plugin which adds the \"environment\" concept (eg. dev, QA, prod)  to Tsuru PaaS","fork":false,"url":"https://api.github.com/repos/ef-ctx/tranor","forks_url":"https://api.github.com/repos/ef-ctx/tranor/forks","keys_url":"https://api.github.com/repos/ef-ctx/tranor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ef-ctx/tranor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ef-ctx/tranor/teams","hooks_url":"https://api.github.com/repos/ef-ctx/tranor/hooks","issue_events_url":"https://api.github.com/repos/ef-ctx/tranor/issues/events{/number}","events_url":"https://api.github.com/repos/ef-ctx/tranor/events","assignees_url":"https://api.github.com/repos/ef-ctx/tranor/assignees{/user}","branches_url":"https://api.github.com/repos/ef-ctx/tranor/branches{/branch}","tags_url":"https://api.github.com/repos/ef-ctx/tranor/tags","blobs_url":"https://api.github.com/repos/ef-ctx/tranor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ef-ctx/tranor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ef-ctx/tranor/git/refs{/sha}","trees_url":"https://api.github.com/repos/ef-ctx/tranor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ef-ctx/tranor/statuses/{sha}","languages_url":"https://api.github.com/repos/ef-ctx/tranor/languages","stargazers_url":"https://api.github.com/repos/ef-ctx/tranor/stargazers","contributors_url":"https://api.github.com/repos/ef-ctx/tranor/contributors","subscribers_url":"https://api.github.com/repos/ef-ctx/tranor/subscribers","subscription_url":"https://api.github.com/repos/ef-ctx/tranor/subscription","commits_url":"https://api.github.com/repos/ef-ctx/tranor/commits{/sha}","git_commits_url":"https://api.github.com/repos/ef-ctx/tranor/git/commits{/sha}","comments_url":"https://api.github.com/repos/ef-ctx/tranor/comments{/number}","issue_comment_url":"https://api.github.com/repos/ef-ctx/tranor/issues/comments{/number}","contents_url":"https://api.github.com/repos/ef-ctx/tranor/contents/{+path}","compare_url":"https://api.github.com/repos/ef-ctx/tranor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ef-ctx/tranor/merges","archive_url":"https://api.github.com/repos/ef-ctx/tranor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ef-ctx/tranor/downloads","issues_url":"https://api.github.com/repos/ef-ctx/tranor/issues{/number}","pulls_url":"https://api.github.com/repos/ef-ctx/tranor/pulls{/number}","milestones_url":"https://api.github.com/repos/ef-ctx/tranor/milestones{/number}","notifications_url":"https://api.github.com/repos/ef-ctx/tranor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ef-ctx/tranor/labels{/name}","releases_url":"https://api.github.com/repos/ef-ctx/tranor/releases{/id}","deployments_url":"https://api.github.com/repos/ef-ctx/tranor/deployments","created_at":"2016-03-08T17:22:25Z","updated_at":"2016-06-28T10:34:52Z","pushed_at":"2016-10-03T02:25:57Z","git_url":"git://github.com/ef-ctx/tranor.git","ssh_url":"git@github.com:ef-ctx/tranor.git","clone_url":"https://github.com/ef-ctx/tranor.git","svn_url":"https://github.com/ef-ctx/tranor","homepage":null,"size":933,"stargazers_count":2,"watchers_count":2,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/4"},"html":{"href":"https://github.com/ef-ctx/tranor/pull/4"},"issue":{"href":"https://api.github.com/repos/ef-ctx/tranor/issues/4"},"comments":{"href":"https://api.github.com/repos/ef-ctx/tranor/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ef-ctx/tranor/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/ef-ctx/tranor/statuses/a5640adeb1ff18c767fdc4a07b83a479b663225a"}}}}
{"actor":{"display_login":"aflag"}}