ellen-github 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9daee4e66e51d6e4a8f8e7faba35609ca088e7ea
4
- data.tar.gz: f6dc855d733ecaba80492406a3ef3c23ecd260ed
3
+ metadata.gz: 840f7c706f1f5332b87c3e9e0ab87df61dab4a41
4
+ data.tar.gz: 5d9a376a02e562220123eec71a7f38c9179ed5de
5
5
  SHA512:
6
- metadata.gz: 1e23e91b34ae15f824f162ceadc9e8633adb3d621ca86c1c553c6476094bcb70e879f685e277a98eb5393582bd1bd0022956ccb588ecb1296d09b0fb58688cbc
7
- data.tar.gz: 8f47fb7aee9b2990a732fa2f1088cb12a7c3105d6e75ed3355e7b212614837843e2c41856a7905517348d009ea4e9ce0107bbaa823d5c9957b7e8a3b3f0c5584
6
+ metadata.gz: 23048c0c8fb1fcf8f3839aaf8e52d6be836dd1f05a4417af37e41ffaa49cc8a43ed69c1bbea4ef3f2d9f8c6fa6673674e71e438be7452758999a7ac9673aa13b
7
+ data.tar.gz: 9617bcf4c983e776b4fe17d7d1a457ae7268540ca4dcdafc5fd5f2d53fe4724587b6f021e37dc16a282917ec1b07564ac8e3fb5969590d308f4eade08fac2db5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.0.4
2
+ * Add close command
3
+
1
4
  ## 0.0.3
2
5
  * Support Ellen v0.2.0
3
6
 
data/README.md CHANGED
@@ -9,6 +9,10 @@ gem "ellen-github"
9
9
 
10
10
  ## Usage
11
11
  ```
12
+ @ellen close issue <username>/<repository>#<number> - Close an Issue
12
13
  @ellen create issue "<title>" on <username>/<repository> - Create a new Issue
13
14
  @ellen remember my github token <token> - Remember sender's GitHub access token
14
15
  ```
16
+
17
+ ## Image
18
+ ![](https://raw.githubusercontent.com/r7kamura/ellen-github/master/images/screenshot.png)
Binary file
data/lib/ellen/github.rb CHANGED
@@ -1,5 +1,8 @@
1
+ require "octokit"
2
+
1
3
  require "ellen"
2
4
  require "ellen/github/actions/base"
5
+ require "ellen/github/actions/close_issue"
3
6
  require "ellen/github/actions/create_issue"
4
7
  require "ellen/github/actions/remember"
5
8
  require "ellen/github/version"
@@ -21,6 +21,26 @@ module Ellen
21
21
  def sender_name
22
22
  message.from
23
23
  end
24
+
25
+ def require_access_token
26
+ message.reply("I don't know your github access token")
27
+ end
28
+
29
+ def has_access_token?
30
+ !!access_token
31
+ end
32
+
33
+ def access_token
34
+ @access_token ||= access_tokens[sender_name]
35
+ end
36
+
37
+ def client
38
+ Octokit::Client.new(access_token: access_token)
39
+ end
40
+
41
+ def repository
42
+ message[:repo]
43
+ end
24
44
  end
25
45
  end
26
46
  end
@@ -0,0 +1,52 @@
1
+ module Ellen
2
+ module Github
3
+ module Actions
4
+ class CloseIssue < Base
5
+ def call
6
+ case
7
+ when !has_access_token?
8
+ require_access_token
9
+ when has_closed_issue_number?
10
+ reply_already_closed
11
+ else
12
+ close
13
+ end
14
+ rescue Octokit::Unauthorized
15
+ message.reply("Failed in authentication (401)")
16
+ rescue Octokit::NotFound
17
+ message.reply("Could not find that issue")
18
+ rescue => exception
19
+ raise exception
20
+ message.reply("Failed by #{exception.class}")
21
+ end
22
+
23
+ private
24
+
25
+ def close
26
+ request
27
+ message.reply("Closed #{issue.html_url}")
28
+ end
29
+
30
+ def request
31
+ client.close_issue(repository, issue_number)
32
+ end
33
+
34
+ def has_closed_issue_number?
35
+ issue.state == "closed"
36
+ end
37
+
38
+ def reply_already_closed
39
+ message.reply("Already closed #{issue.html_url}")
40
+ end
41
+
42
+ def issue
43
+ @issue ||= client.issue(repository, issue_number)
44
+ end
45
+
46
+ def issue_number
47
+ message[:number]
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -14,14 +14,6 @@ module Ellen
14
14
 
15
15
  private
16
16
 
17
- def require_access_token
18
- message.reply("I don't know your github access token")
19
- end
20
-
21
- def created
22
- message.reply("Created a new Issue")
23
- end
24
-
25
17
  def create
26
18
  message.reply("Created #{issue.html_url}")
27
19
  rescue Octokit::Unauthorized
@@ -36,22 +28,6 @@ module Ellen
36
28
  client.create_issue(repository, title, body)
37
29
  end
38
30
 
39
- def has_access_token?
40
- !!access_token
41
- end
42
-
43
- def access_token
44
- @access_token ||= access_tokens[sender_name]
45
- end
46
-
47
- def client
48
- Octokit::Client.new(access_token: access_token)
49
- end
50
-
51
- def repository
52
- message[:repo]
53
- end
54
-
55
31
  def title
56
32
  message[:title]
57
33
  end
@@ -1,5 +1,5 @@
1
1
  module Ellen
2
2
  module Github
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -1,14 +1,32 @@
1
1
  module Ellen
2
2
  module Handlers
3
3
  class Github < Base
4
- on(/create issue "(?<title>.+)" on (?<repo>.+)\z/, name: "create_issue", description: "Create a new issue")
4
+ on(
5
+ /create issue "(?<title>.+)" on (?<repo>.+)\z/,
6
+ name: "create_issue",
7
+ description: "Create a new issue",
8
+ )
5
9
 
6
- on(/remember my github token (?<token>.+)\z/, name: "remember", description: "Remember sender's GitHub access token")
10
+ on(
11
+ /remember my github token (?<token>.+)\z/,
12
+ name: "remember",
13
+ description: "Remember sender's GitHub access token",
14
+ )
15
+
16
+ on(
17
+ /close issue (?<repo>.+)#(?<number>\d+)\z/,
18
+ name: "close_issue",
19
+ description: "Close an issue",
20
+ )
7
21
 
8
22
  def create_issue(message)
9
23
  Ellen::Github::Actions::CreateIssue.new(message).call
10
24
  end
11
25
 
26
+ def close_issue(message)
27
+ Ellen::Github::Actions::CloseIssue.new(message).call
28
+ end
29
+
12
30
  def remember(message)
13
31
  Ellen::Github::Actions::Remember.new(message).call
14
32
  end
@@ -2,10 +2,18 @@ require "spec_helper"
2
2
  require "json"
3
3
 
4
4
  describe Ellen::Handlers::Github do
5
+ before do
6
+ access_tokens.merge!(sender => stored_access_token)
7
+ end
8
+
5
9
  let(:robot) do
6
10
  Ellen::Robot.new
7
11
  end
8
12
 
13
+ let(:stored_access_token) do
14
+ github_access_token
15
+ end
16
+
9
17
  let(:github_access_token) do
10
18
  "dummy"
11
19
  end
@@ -18,13 +26,38 @@ describe Ellen::Handlers::Github do
18
26
  "#general"
19
27
  end
20
28
 
29
+ let(:user) do
30
+ "alice"
31
+ end
32
+
33
+ let(:repository) do
34
+ "test"
35
+ end
36
+
21
37
  let(:access_tokens) do
22
38
  robot.brain.data[Ellen::Github::Actions::Base::NAMESPACE] ||= {}
23
39
  end
24
40
 
41
+ let(:call) do
42
+ robot.receive(body: body, from: sender, to: channel)
43
+ end
44
+
45
+ shared_examples_for "requires access token without access token" do
46
+ context "without access token" do
47
+ let(:stored_access_token) do
48
+ nil
49
+ end
50
+
51
+ it "requires access token" do
52
+ Ellen.logger.should_receive(:info).with("I don't know your github access token")
53
+ call
54
+ a_request(:any, //).should_not have_been_made
55
+ end
56
+ end
57
+ end
58
+
25
59
  describe "#create_issue" do
26
60
  before do
27
- Ellen.logger.stub(:info)
28
61
  stub_request(:post, "https://api.github.com/repos/#{user}/#{repository}/issues").
29
62
  with(
30
63
  body: {
@@ -38,14 +71,6 @@ describe Ellen::Handlers::Github do
38
71
  )
39
72
  end
40
73
 
41
- let(:user) do
42
- "alice"
43
- end
44
-
45
- let(:repository) do
46
- "test"
47
- end
48
-
49
74
  let(:title) do
50
75
  "This is a test issue"
51
76
  end
@@ -54,29 +79,72 @@ describe Ellen::Handlers::Github do
54
79
  %<ellen create issue "#{title}" on #{user}/#{repository}>
55
80
  end
56
81
 
57
- context "when access token for the sender is remembered" do
58
- before do
59
- access_tokens.merge!(sender => github_access_token)
60
- end
82
+ include_examples "requires access token without access token"
61
83
 
84
+ context "with access token" do
62
85
  it "creates a new issue with given title on given repository" do
63
- robot.receive(
64
- body: body,
65
- from: sender,
66
- to: channel,
67
- )
86
+ call
68
87
  a_request(:any, //).should have_been_made
69
88
  end
70
89
  end
90
+ end
71
91
 
72
- context "when access token for the sender is not remembered" do
73
- it "does not create a new issue" do
74
- robot.receive(
75
- body: body,
76
- from: sender,
77
- to: channel,
92
+ describe "#close_issue" do
93
+ before do
94
+ stub_request(:get, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}").
95
+ with(
96
+ headers: {
97
+ Authorization: "token #{github_access_token}"
98
+ },
99
+ ).
100
+ to_return(
101
+ body: {
102
+ state: issue_status,
103
+ html_url: html_url,
104
+ }.to_json,
105
+ headers: {
106
+ "Content-Type" => "application/json",
107
+ },
78
108
  )
79
- a_request(:any, //).should_not have_been_made
109
+ stub_request(:patch, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}").
110
+ with(
111
+ body: {
112
+ state: "closed",
113
+ }.to_json,
114
+ headers: {
115
+ Authorization: "token #{github_access_token}"
116
+ },
117
+ )
118
+ end
119
+
120
+ let(:html_url) do
121
+ "http://example.com/#{user}/#{repository}/issues/#{issue_number}"
122
+ end
123
+
124
+ let(:issue_status) do
125
+ "open"
126
+ end
127
+
128
+ let(:body) do
129
+ "@ellen close issue #{user}/#{repository}##{issue_number}"
130
+ end
131
+
132
+ let(:issue_number) do
133
+ 1
134
+ end
135
+
136
+ include_examples "requires access token without access token"
137
+
138
+ context "with closed issue" do
139
+ it "replies so" do
140
+ Ellen.logger.should_receive(:info).with("Closed #{html_url}")
141
+ call
142
+ end
143
+ end
144
+
145
+ context "with access token" do
146
+ it "closes specified issue" do
147
+ call
80
148
  end
81
149
  end
82
150
  end
@@ -88,11 +156,7 @@ describe Ellen::Handlers::Github do
88
156
 
89
157
  it "remembers sender's access token in its brain" do
90
158
  Ellen.logger.should_receive(:info).with("Remembered #{sender}'s github access token")
91
- robot.receive(
92
- body: body,
93
- from: sender,
94
- to: channel,
95
- )
159
+ call
96
160
  access_tokens[sender].should == github_access_token
97
161
  end
98
162
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ellen-github
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
@@ -122,8 +122,10 @@ files:
122
122
  - README.md
123
123
  - Rakefile
124
124
  - ellen-github.gemspec
125
+ - images/screenshot.png
125
126
  - lib/ellen/github.rb
126
127
  - lib/ellen/github/actions/base.rb
128
+ - lib/ellen/github/actions/close_issue.rb
127
129
  - lib/ellen/github/actions/create_issue.rb
128
130
  - lib/ellen/github/actions/remember.rb
129
131
  - lib/ellen/github/version.rb