ruboty-qiita-github 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ccd1e67858c99f728082ca9ae1123db3df278d74
4
- data.tar.gz: a4d3b11e16ec956f31fa41f3d10d951cb05171cc
2
+ SHA256:
3
+ metadata.gz: caf076de8647564c4cf76b70a6e79068e26a1cf64a9d317c0ff2954db458aca6
4
+ data.tar.gz: 13e155d2450644cd6277502e9b8024e4a0521573cc21655a22ad289b60575071
5
5
  SHA512:
6
- metadata.gz: bb457fc3e32317405ed93e780f58b5536bde20d161008dc575b194e9338932b95ddf4332c42eb6a7366d4972348f0e53e009e5394133476b520eb4d43f522261
7
- data.tar.gz: 19fafbc34effc2a1ea82cbe6ba8cdfd3a6aecc0776676b17c4e39bb8dd2982d641827bce4eadfc8f88a5c9268fb8c8205103bd157890a314bc589ece4108dff2
6
+ metadata.gz: dacf9494aa6a174e25a6ce677016d8d38462a23b92b7636f92aa8b5a6763fb6cd9729de624e7234a0c1b7969534d6c0e49c5c04b5bbda8c821658b4e6e5014a5
7
+ data.tar.gz: 74ea9024b5403dbba94ab085145b50dfadf4a439800884c6539cfc33e2f7d7afadf84c8d5787316917f2d9ff72d59c600dc568b52101858bb1d15cbfe77438ba
@@ -0,0 +1,11 @@
1
+ version: 2
2
+
3
+ updates:
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ - package-ecosystem: "bundler"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -0,0 +1,37 @@
1
+ name: Test
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - master
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ rspec:
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: ["2.7", "3.0", "3.1"]
19
+ runs-on: "ubuntu-latest"
20
+ continue-on-error: false
21
+ steps:
22
+ - uses: actions/checkout@v3
23
+ - uses: ruby/setup-ruby@v1
24
+ with:
25
+ ruby-version: ${{ matrix.ruby }}
26
+ bundler-cache: true
27
+ - run: bundle exec rspec
28
+
29
+ rubocop:
30
+ runs-on: "ubuntu-latest"
31
+ steps:
32
+ - uses: actions/checkout@v3
33
+ - uses: ruby/setup-ruby@v1
34
+ with:
35
+ ruby-version: "3.1"
36
+ bundler-cache: true
37
+ - run: bundle exec rubocop
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ tmp
20
20
  *.o
21
21
  *.a
22
22
  mkmf.log
23
+ vendor/bundle/
data/.rubocop.yml ADDED
@@ -0,0 +1,9 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-performance
5
+ - rubocop-rspec
6
+ - rubocop-rake
7
+
8
+ AllCops:
9
+ NewCops: enable
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,84 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config --exclude-limit 99999`
3
+ # on 2022-10-12 04:57:08 UTC using RuboCop version 1.36.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'ruboty-github.gemspec'
15
+
16
+ # Offense count: 1
17
+ Lint/UnreachableCode:
18
+ Exclude:
19
+ - 'lib/ruboty/github/actions/close_issue.rb'
20
+
21
+ # Offense count: 1
22
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods, CountRepeatedAttributes.
23
+ Metrics/AbcSize:
24
+ Max: 24
25
+
26
+ # Offense count: 2
27
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
28
+ Metrics/MethodLength:
29
+ Max: 14
30
+
31
+ # Offense count: 2
32
+ # Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
33
+ # NamePrefix: is_, has_, have_
34
+ # ForbiddenPrefixes: is_, has_, have_
35
+ # AllowedMethods: is_a?
36
+ # MethodDefinitionMacros: define_method, define_singleton_method
37
+ Naming/PredicateName:
38
+ Exclude:
39
+ - 'spec/**/*'
40
+ - 'lib/ruboty/github/actions/base.rb'
41
+ - 'lib/ruboty/github/actions/close_issue.rb'
42
+
43
+ # Offense count: 3
44
+ # Configuration parameters: .
45
+ # SupportedStyles: have_received, receive
46
+ RSpec/MessageSpies:
47
+ EnforcedStyle: receive
48
+
49
+ # Offense count: 2
50
+ RSpec/MultipleExpectations:
51
+ Max: 2
52
+
53
+ # Offense count: 11
54
+ # Configuration parameters: AllowSubject.
55
+ RSpec/MultipleMemoizedHelpers:
56
+ Max: 13
57
+
58
+ # Offense count: 1
59
+ RSpec/NoExpectationExample:
60
+ Exclude:
61
+ - 'spec/ruboty/handlers/github_spec.rb'
62
+
63
+ # Offense count: 9
64
+ # Configuration parameters: AllowedConstants.
65
+ Style/Documentation:
66
+ Exclude:
67
+ - 'spec/**/*'
68
+ - 'test/**/*'
69
+ - 'lib/ruboty/github/actions/base.rb'
70
+ - 'lib/ruboty/github/actions/close_issue.rb'
71
+ - 'lib/ruboty/github/actions/create_deploy_pull_request.rb'
72
+ - 'lib/ruboty/github/actions/create_issue.rb'
73
+ - 'lib/ruboty/github/actions/create_pull_request.rb'
74
+ - 'lib/ruboty/github/actions/merge_pull_request.rb'
75
+ - 'lib/ruboty/github/actions/remember.rb'
76
+ - 'lib/ruboty/github/actions/search_issues.rb'
77
+ - 'lib/ruboty/handlers/github.rb'
78
+
79
+ # Offense count: 1
80
+ # This cop supports safe autocorrection (--autocorrect).
81
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
82
+ # URISchemes: http, https
83
+ Layout/LineLength:
84
+ Max: 148
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## Unreleased
2
+
3
+ ## 0.3.0
4
+ - Fix a bug that deploy pr messages trigger other actions also
5
+ - Warn when deployment pull request includes database migration
6
+ - Refactor CreateDeployPullRequest
7
+ - Add `search issues` command
8
+ - Support test on GitHub Actions
9
+ - Add rubocop, rubocop-rake, rubocop-performance, rubocop-rspec gems
10
+ - Use rubocop autocorrect and modify the code
11
+ - Added "search issues" description and status badge to README.md
12
+
1
13
  ## 0.2.3
2
14
  - Fix typo
3
15
 
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in ruboty-github.gemspec
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # Ruboty::Github
2
+ [![Gem Version](https://badge.fury.io/rb/ruboty-qiita-github.svg)](https://badge.fury.io/rb/ruboty-qiita-github) [![Test](https://github.com/increments/ruboty-qiita-github/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/increments/ruboty-qiita-github/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/764bf9dc5796f0d3bef3/maintainability)](https://codeclimate.com/github/increments/ruboty-qiita-github/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/764bf9dc5796f0d3bef3/test_coverage)](https://codeclimate.com/github/increments/ruboty-qiita-github/test_coverage)
3
+
2
4
  Manage GitHub via Ruboty.
3
5
  This gem adds `deploy pull request` command to original ruboty-github plugin.
4
6
 
@@ -16,6 +18,7 @@ gem "ruboty-github"
16
18
  @ruboty pull request "<title>" from <from> to <to> - Create a new Pull Request
17
19
  @ruboty deploy pull request "<title>" from <from> to <to> - Create a new Pull Request for Deploy
18
20
  @ruboty remember my github token <token> - Remember sender's GitHub access token
21
+ @ruboty search issues "<query>" - Search an Issues/Pull Requests
19
22
  ```
20
23
 
21
24
  ## ENV
data/Rakefile CHANGED
@@ -1,2 +1,3 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'bundler/gem_tasks'
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
4
6
  class Base
5
- NAMESPACE = "github"
7
+ NAMESPACE = 'github'
6
8
 
7
9
  attr_reader :message
8
10
 
@@ -17,7 +19,7 @@ module Ruboty
17
19
  end
18
20
 
19
21
  def body
20
- message[:description] || ""
22
+ message[:description] || ''
21
23
  end
22
24
 
23
25
  def sender_name
@@ -45,14 +47,14 @@ module Ruboty
45
47
  end
46
48
 
47
49
  def client_options
48
- client_options_with_nil_value.reject {|key, value| value.nil? }
50
+ client_options_with_nil_value.compact
49
51
  end
50
52
 
51
53
  def client_options_with_nil_value
52
54
  {
53
55
  access_token: access_token,
54
56
  api_endpoint: api_endpoint,
55
- web_endpoint: web_endpoint,
57
+ web_endpoint: web_endpoint
56
58
  }
57
59
  end
58
60
 
@@ -66,11 +68,10 @@ module Ruboty
66
68
 
67
69
  # @note GITHUB_HOST will be deprecated on the next major version
68
70
  def github_base_url
69
- case
70
- when ENV["GITHUB_BASE_URL"]
71
- ENV["GITHUB_BASE_URL"]
72
- when ENV["GITHUB_HOST"]
73
- "https://#{ENV['GITHUB_HOST']}"
71
+ if ENV.fetch('GITHUB_BASE_URL', nil)
72
+ ENV.fetch('GITHUB_BASE_URL', nil)
73
+ elsif ENV.fetch('GITHUB_HOST', nil)
74
+ "https://#{ENV.fetch('GITHUB_HOST', nil)}"
74
75
  end
75
76
  end
76
77
  end
@@ -1,23 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
4
6
  class CloseIssue < Base
5
7
  def call
6
- case
7
- when !has_access_token?
8
+ if !has_access_token?
8
9
  require_access_token
9
- when has_closed_issue_number?
10
+ elsif has_closed_issue_number?
10
11
  reply_already_closed
11
12
  else
12
13
  close
13
14
  end
14
15
  rescue Octokit::Unauthorized
15
- message.reply("Failed in authentication (401)")
16
+ message.reply('Failed in authentication (401)')
16
17
  rescue Octokit::NotFound
17
- message.reply("Could not find that issue")
18
- rescue => exception
19
- raise exception
20
- message.reply("Failed by #{exception.class}")
18
+ message.reply('Could not find that issue')
19
+ rescue StandardError => e
20
+ raise e
21
+ message.reply("Failed by #{e.class}")
21
22
  end
22
23
 
23
24
  private
@@ -32,7 +33,7 @@ module Ruboty
32
33
  end
33
34
 
34
35
  def has_closed_issue_number?
35
- issue.state == "closed"
36
+ issue.state == 'closed'
36
37
  end
37
38
 
38
39
  def reply_already_closed
@@ -1,40 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
4
6
  class CreateDeployPullRequest < CreatePullRequest
5
7
  private
6
8
 
9
+ def create
10
+ super
11
+
12
+ message.reply('@here :warning: This deployment includes some database migrations') if database_schema_changed?
13
+ end
14
+
7
15
  # e.g. master
8
16
  def to_branch
9
- to.split(":").last
17
+ to.split(':').last
10
18
  end
11
19
 
12
20
  def body
13
- body = "## Pull Requests to deploy\n\n"
14
- pull_requests_to_deploy(repository, to_branch, from_branch).each do |pr|
15
- body = body + [
16
- "-",
17
- "[##{pr[:number]}](#{pr[:html_url]}):",
18
- pr[:title],
19
- "by",
20
- "@#{pr[:user][:login]}\n",
21
- ].join(' ')
22
- end
23
- body
21
+ lines = included_pull_requests.map do |pr|
22
+ "- [##{pr[:number]}](#{pr[:html_url]}): #{pr[:title]} by @#{pr[:user][:login]}"
23
+ end
24
+ lines.unshift('## Pull Requests to deploy', '')
25
+ lines.join("\n")
24
26
  end
25
27
 
26
- def pull_requests_to_deploy(repository, to_branch, from_branch)
27
- numbers = compare(repository, to_branch, from_branch).commits.map do |commit|
28
+ def included_pull_requests
29
+ numbers = comparison.commits.map do |commit|
28
30
  /^Merge pull request #(\d+) from/ =~ commit[:commit][:message]
29
- $1
31
+ ::Regexp.last_match(1)
30
32
  end
31
- numbers.compact.map { |n| client.pull_request(repository, n.to_i) }
33
+ numbers.compact.map { |number| client.pull_request(repository, number.to_i) }
34
+ end
35
+
36
+ def database_schema_changed?
37
+ comparison.files.any? { |file| file.filename == 'db/schema.rb' }
32
38
  end
33
39
 
34
- def compare(repository, to_branch, from_branch)
35
- start = client.branch(repository, to_branch)[:commit][:sha]
36
- endd = client.branch(repository, from_branch)[:commit][:sha]
37
- client.compare(repository, start, endd)
40
+ def comparison
41
+ @comparison ||= begin
42
+ start = client.branch(repository, to_branch)[:commit][:sha]
43
+ endd = client.branch(repository, from_branch)[:commit][:sha]
44
+ client.compare(repository, start, endd)
45
+ end
38
46
  end
39
47
  end
40
48
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
@@ -15,11 +17,11 @@ module Ruboty
15
17
  def create
16
18
  message.reply("Created #{issue.html_url}")
17
19
  rescue Octokit::Unauthorized
18
- message.reply("Failed in authentication (401)")
20
+ message.reply('Failed in authentication (401)')
19
21
  rescue Octokit::NotFound
20
- message.reply("Could not find that repository")
21
- rescue => exception
22
- message.reply("Failed by #{exception.class}")
22
+ message.reply('Could not find that repository')
23
+ rescue StandardError => e
24
+ message.reply("Failed by #{e.class}")
23
25
  end
24
26
 
25
27
  def issue
@@ -1,25 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
4
6
  class CreatePullRequest < Base
5
7
  def call
6
8
  if has_access_token?
7
- create
9
+ create_with_error_handling
8
10
  else
9
11
  require_access_token
10
12
  end
13
+ # Action handlers should return truthy value to tell ruboty that the given message has been handled.
14
+ # Otherwise, ruboty tries to execute other handlers.
15
+ true
11
16
  end
12
17
 
13
18
  private
14
19
 
15
- def create
16
- message.reply("Created #{pull_request.html_url}")
20
+ def create_with_error_handling
21
+ create
17
22
  rescue Octokit::Unauthorized
18
- message.reply("Failed in authentication (401)")
23
+ message.reply('Failed in authentication (401)')
19
24
  rescue Octokit::NotFound
20
- message.reply("Could not find that repository")
21
- rescue => exception
22
- message.reply("Failed by #{exception.class} #{exception}")
25
+ message.reply('Could not find that repository')
26
+ rescue StandardError => e
27
+ message.reply("Failed by #{e.class} #{e}")
28
+ end
29
+
30
+ def create
31
+ message.reply("Created #{pull_request.html_url}")
23
32
  end
24
33
 
25
34
  def pull_request
@@ -37,12 +46,12 @@ module Ruboty
37
46
 
38
47
  # e.g. alice
39
48
  def from_user
40
- from.split("/").first
49
+ from.split('/').first
41
50
  end
42
51
 
43
52
  # e.g. test
44
53
  def from_branch
45
- from.split(":").last
54
+ from.split(':').last
46
55
  end
47
56
 
48
57
  # e.g. bob/foo:master
@@ -52,7 +61,7 @@ module Ruboty
52
61
 
53
62
  # e.g. bob/foo
54
63
  def repository
55
- to.split(":").first
64
+ to.split(':').first
56
65
  end
57
66
 
58
67
  # e.g. alice:test
@@ -62,7 +71,7 @@ module Ruboty
62
71
 
63
72
  # e.g. master
64
73
  def base
65
- to.split(":").last
74
+ to.split(':').last
66
75
  end
67
76
  end
68
77
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
5
  module Actions
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruboty
4
+ module Github
5
+ module Actions
6
+ class SearchIssues < Base
7
+ def call
8
+ if has_access_token?
9
+ search
10
+ else
11
+ require_access_token
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def search
18
+ results = search_issues.items.each_with_object(["Searched: '#{query}'"]) do |item, object|
19
+ repository_url = item[:repository_url].delete_prefix('https://api.github.com/repos/')
20
+
21
+ object << "[#{repository_url}##{item[:number]}] #{item[:title]} (#{item[:user][:login]})\n#{item[:html_url]}"
22
+ end
23
+
24
+ message.reply(results.join("\n"))
25
+ rescue Octokit::Unauthorized
26
+ message.reply('Failed in authentication (401)')
27
+ rescue Octokit::NotFound
28
+ message.reply('Could not find that repository')
29
+ rescue StandardError => e
30
+ message.reply("Failed by #{e.class}")
31
+ end
32
+
33
+ def query
34
+ message[:query]
35
+ end
36
+
37
+ def search_issues
38
+ client.search_issues(query)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Github
3
- VERSION = "0.2.3"
5
+ VERSION = '0.3.0'
4
6
  end
5
7
  end
data/lib/ruboty/github.rb CHANGED
@@ -1,13 +1,16 @@
1
- require "active_support/core_ext/string/strip"
2
- require "octokit"
1
+ # frozen_string_literal: true
3
2
 
4
- require "ruboty"
5
- require "ruboty/github/actions/base"
6
- require "ruboty/github/actions/close_issue"
7
- require "ruboty/github/actions/create_issue"
8
- require "ruboty/github/actions/create_pull_request"
9
- require "ruboty/github/actions/create_deploy_pull_request"
10
- require "ruboty/github/actions/merge_pull_request"
11
- require "ruboty/github/actions/remember"
12
- require "ruboty/github/version"
13
- require "ruboty/handlers/github"
3
+ require 'active_support/core_ext/string/strip'
4
+ require 'octokit'
5
+
6
+ require 'ruboty'
7
+ require 'ruboty/github/actions/base'
8
+ require 'ruboty/github/actions/close_issue'
9
+ require 'ruboty/github/actions/create_issue'
10
+ require 'ruboty/github/actions/create_pull_request'
11
+ require 'ruboty/github/actions/create_deploy_pull_request'
12
+ require 'ruboty/github/actions/merge_pull_request'
13
+ require 'ruboty/github/actions/remember'
14
+ require 'ruboty/github/actions/search_issues'
15
+ require 'ruboty/github/version'
16
+ require 'ruboty/handlers/github'
@@ -1,50 +1,62 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruboty
2
4
  module Handlers
3
5
  class Github < Base
4
- ISSUE_PATTERN = %r<(?:https?://[^/]+/)?(?<repo>.+)(?:#|/pull/|/issues/)(?<number>\d+) ?>
6
+ ISSUE_PATTERN = %r{(?:https?://[^/]+/)?(?<repo>.+)(?:#|/pull/|/issues/)(?<number>\d+) ?}.freeze
5
7
 
6
- env :GITHUB_BASE_URL, "Pass GitHub URL if needed (e.g. https://github.example.com)", optional: true
8
+ env :GITHUB_BASE_URL, 'Pass GitHub URL if needed (e.g. https://github.example.com)', optional: true
7
9
 
8
10
  on(
9
11
  /create issue "(?<title>.+)" on (?<repo>.+)(?:\n(?<description>[\s\S]+))?\z/,
10
- name: "create_issue",
11
- description: "Create a new issue",
12
+ name: 'create_issue',
13
+ description: 'Create a new issue'
14
+ )
15
+
16
+ on(
17
+ /search issues "(?<query>.+)"/,
18
+ name: 'search_issues',
19
+ description: 'Search an issue'
12
20
  )
13
21
 
14
22
  on(
15
23
  /remember my github token (?<token>.+)\z/,
16
- name: "remember",
17
- description: "Remember sender's GitHub access token",
24
+ name: 'remember',
25
+ description: "Remember sender's GitHub access token"
18
26
  )
19
27
 
20
28
  on(
21
- /close(?: issue)? #{ISSUE_PATTERN}\z/,
22
- name: "close_issue",
23
- description: "Close an issue",
29
+ /close(?: issue)? #{ISSUE_PATTERN}\z/o,
30
+ name: 'close_issue',
31
+ description: 'Close an issue'
24
32
  )
25
33
 
26
34
  on(
27
35
  /pull request "(?<title>.+)" from (?<from>.+) to (?<to>.+)(?:\n(?<description>[\s\S]+))?\z/,
28
- name: "create_pull_request",
29
- description: "Create a pull request",
36
+ name: 'create_pull_request',
37
+ description: 'Create a pull request'
30
38
  )
31
39
 
32
40
  on(
33
41
  /deploy pull request "(?<title>.+)" from (?<from>.+) to (?<to>.+)(?:\n(?<description>[\s\S]+))?\z/,
34
- name: "create_deploy_pull_request",
35
- description: "Create a pull request to deploy",
42
+ name: 'create_deploy_pull_request',
43
+ description: 'Create a pull request to deploy'
36
44
  )
37
45
 
38
46
  on(
39
- /merge #{ISSUE_PATTERN}\z/,
40
- name: "merge_pull_request",
41
- description: "Merge pull request",
47
+ /merge #{ISSUE_PATTERN}\z/o,
48
+ name: 'merge_pull_request',
49
+ description: 'Merge pull request'
42
50
  )
43
51
 
44
52
  def create_issue(message)
45
53
  Ruboty::Github::Actions::CreateIssue.new(message).call
46
54
  end
47
55
 
56
+ def search_issues(message)
57
+ Ruboty::Github::Actions::SearchIssues.new(message).call
58
+ end
59
+
48
60
  def close_issue(message)
49
61
  Ruboty::Github::Actions::CloseIssue.new(message).call
50
62
  end
@@ -1,27 +1,33 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'ruboty/github/version'
4
6
 
5
7
  Gem::Specification.new do |spec|
6
- spec.name = "ruboty-qiita-github"
8
+ spec.name = 'ruboty-qiita-github'
7
9
  spec.version = Ruboty::Github::VERSION
8
- spec.authors = ["Ryo Nakamura", "Seigo Uchida"]
9
- spec.email = ["r7kamura@gmail.com", "spesnova@gmail.com"]
10
- spec.summary = "Manage GitHub via Ruboty."
11
- spec.homepage = "https://github.com/increments/ruboty-qiita-github"
12
- spec.license = "MIT"
10
+ spec.authors = ['Ryo Nakamura', 'Seigo Uchida']
11
+ spec.email = ['r7kamura@gmail.com', 'spesnova@gmail.com']
12
+ spec.summary = 'Manage GitHub via Ruboty.'
13
+ spec.homepage = 'https://github.com/increments/ruboty-qiita-github'
14
+ spec.license = 'MIT'
13
15
 
14
16
  spec.files = `git ls-files -z`.split("\x0")
15
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
- spec.require_paths = ["lib"]
18
+ spec.require_paths = ['lib']
18
19
 
19
- spec.add_dependency "activesupport"
20
- spec.add_dependency "ruboty"
21
- spec.add_dependency "octokit"
22
- spec.add_development_dependency "bundler", "~> 1.6"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec", "2.14.1"
25
- spec.add_development_dependency "simplecov"
26
- spec.add_development_dependency "webmock"
20
+ spec.add_dependency 'activesupport'
21
+ spec.add_dependency 'octokit'
22
+ spec.add_dependency 'ruboty'
23
+ spec.add_development_dependency 'bundler'
24
+ spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'rubocop'
27
+ spec.add_development_dependency 'rubocop-performance'
28
+ spec.add_development_dependency 'rubocop-rake'
29
+ spec.add_development_dependency 'rubocop-rspec'
30
+ spec.add_development_dependency 'simplecov'
31
+ spec.add_development_dependency 'webmock'
32
+ spec.metadata['rubygems_mfa_required'] = 'true'
27
33
  end
@@ -1,5 +1,7 @@
1
- require "spec_helper"
2
- require "json"
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'json'
3
5
 
4
6
  describe Ruboty::Handlers::Github do
5
7
  before do
@@ -15,23 +17,23 @@ describe Ruboty::Handlers::Github do
15
17
  end
16
18
 
17
19
  let(:github_access_token) do
18
- "dummy"
20
+ 'dummy'
19
21
  end
20
22
 
21
23
  let(:sender) do
22
- "bob"
24
+ 'bob'
23
25
  end
24
26
 
25
27
  let(:channel) do
26
- "#general"
28
+ '#general'
27
29
  end
28
30
 
29
31
  let(:user) do
30
- "alice"
32
+ 'alice'
31
33
  end
32
34
 
33
35
  let(:repository) do
34
- "test"
36
+ 'test'
35
37
  end
36
38
 
37
39
  let(:access_tokens) do
@@ -42,78 +44,112 @@ describe Ruboty::Handlers::Github do
42
44
  robot.receive(body: body, from: sender, to: channel)
43
45
  end
44
46
 
45
- shared_examples_for "requires access token without access token" do
46
- context "without access token" do
47
+ shared_examples_for 'requires access token without access token' do
48
+ context 'without access token' do
47
49
  let(:stored_access_token) do
48
50
  nil
49
51
  end
50
52
 
51
- it "requires access token" do
52
- Ruboty.logger.should_receive(:info).with("I don't know your github access token")
53
+ it 'requires access token' do
54
+ expect(robot).to receive(:say).with(hash_including(body: "I don't know your github access token"))
53
55
  call
54
- a_request(:any, //).should_not have_been_made
56
+ expect(a_request(:any, //)).not_to have_been_made
55
57
  end
56
58
  end
57
59
  end
58
60
 
59
- describe "#create_issue" do
61
+ describe '#create_issue' do
60
62
  before do
61
- stub_request(:post, "https://api.github.com/repos/#{user}/#{repository}/issues").
62
- with(
63
+ stub_request(:post, "https://api.github.com/repos/#{user}/#{repository}/issues")
64
+ .with(
63
65
  body: {
64
66
  labels: [],
65
67
  title: title,
66
- body: "",
68
+ body: ''
67
69
  }.to_json,
68
70
  headers: {
69
71
  Authorization: "token #{github_access_token}"
70
- },
72
+ }
71
73
  )
72
74
  end
73
75
 
74
76
  let(:title) do
75
- "This is a test issue"
77
+ 'This is a test issue'
76
78
  end
77
79
 
78
80
  let(:body) do
79
- %<ruboty create issue "#{title}" on #{user}/#{repository}>
81
+ %(ruboty create issue "#{title}" on #{user}/#{repository})
80
82
  end
81
83
 
82
- include_examples "requires access token without access token"
84
+ include_examples 'requires access token without access token'
83
85
 
84
- context "with access token" do
85
- it "creates a new issue with given title on given repository" do
86
+ context 'with access token' do
87
+ it 'creates a new issue with given title on given repository' do
86
88
  call
87
- a_request(:any, //).should have_been_made
89
+ expect(a_request(:any, //)).to have_been_made
88
90
  end
89
91
  end
90
92
  end
91
93
 
92
- describe "#close_issue" do
94
+ describe '#search_issues' do
93
95
  before do
94
- stub_request(:get, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}").
95
- with(
96
+ stub_request(:get, "https://api.github.com/search/issues?q=#{query}")
97
+ .with(
96
98
  headers: {
97
99
  Authorization: "token #{github_access_token}"
98
- },
99
- ).
100
- to_return(
100
+ }
101
+ )
102
+ .to_return(
103
+ body: '',
104
+ headers: {
105
+ 'Content-Type' => 'application/json'
106
+ }
107
+ )
108
+ end
109
+
110
+ let(:query) do
111
+ 'org:increments is:open is:public is:pr'
112
+ end
113
+
114
+ let(:body) do
115
+ %(ruboty search issues "#{query}")
116
+ end
117
+
118
+ include_examples 'requires access token without access token'
119
+
120
+ context 'with access token' do
121
+ it 'search an issue with given query' do
122
+ call
123
+ expect(a_request(:any, //)).to have_been_made
124
+ end
125
+ end
126
+ end
127
+
128
+ describe '#close_issue' do
129
+ before do
130
+ stub_request(:get, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}")
131
+ .with(
132
+ headers: {
133
+ Authorization: "token #{github_access_token}"
134
+ }
135
+ )
136
+ .to_return(
101
137
  body: {
102
138
  state: issue_status,
103
- html_url: html_url,
139
+ html_url: html_url
104
140
  }.to_json,
105
141
  headers: {
106
- "Content-Type" => "application/json",
107
- },
142
+ 'Content-Type' => 'application/json'
143
+ }
108
144
  )
109
- stub_request(:patch, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}").
110
- with(
145
+ stub_request(:patch, "https://api.github.com/repos/#{user}/#{repository}/issues/#{issue_number}")
146
+ .with(
111
147
  body: {
112
- state: "closed",
148
+ state: 'closed'
113
149
  }.to_json,
114
150
  headers: {
115
151
  Authorization: "token #{github_access_token}"
116
- },
152
+ }
117
153
  )
118
154
  end
119
155
 
@@ -122,7 +158,7 @@ describe Ruboty::Handlers::Github do
122
158
  end
123
159
 
124
160
  let(:issue_status) do
125
- "open"
161
+ 'open'
126
162
  end
127
163
 
128
164
  let(:body) do
@@ -133,31 +169,31 @@ describe Ruboty::Handlers::Github do
133
169
  1
134
170
  end
135
171
 
136
- include_examples "requires access token without access token"
172
+ include_examples 'requires access token without access token'
137
173
 
138
- context "with closed issue" do
139
- it "replies so" do
140
- Ruboty.logger.should_receive(:info).with("Closed #{html_url}")
174
+ context 'with closed issue' do
175
+ it 'replies so' do
176
+ expect(robot).to receive(:say).with(hash_including(body: "Closed #{html_url}"))
141
177
  call
142
178
  end
143
179
  end
144
180
 
145
- context "with access token" do
146
- it "closes specified issue" do
181
+ context 'with access token' do
182
+ it 'closes specified issue' do
147
183
  call
148
184
  end
149
185
  end
150
186
  end
151
187
 
152
- describe "#remember" do
188
+ describe '#remember' do
153
189
  let(:body) do
154
190
  "@ruboty remember my github token #{github_access_token}"
155
191
  end
156
192
 
157
193
  it "remembers sender's access token in its brain" do
158
- Ruboty.logger.should_receive(:info).with("Remembered #{sender}'s github access token")
194
+ expect(robot).to receive(:say).with(hash_including(body: "Remembered #{sender}'s github access token"))
159
195
  call
160
- access_tokens[sender].should == github_access_token
196
+ expect(access_tokens[sender]).to eq(github_access_token)
161
197
  end
162
198
  end
163
199
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,12 @@
1
- require "simplecov"
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
2
4
  SimpleCov.start
3
5
 
4
- require "ruboty/github"
5
- require "webmock/rspec"
6
+ require 'ruboty/github'
7
+ require 'webmock/rspec'
6
8
 
7
9
  RSpec.configure do |config|
8
- config.treat_symbols_as_metadata_keys_with_true_values = true
9
10
  config.run_all_when_everything_filtered = true
10
11
  config.filter_run :focus
11
12
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboty-qiita-github
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  - Seigo Uchida
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-01-06 00:00:00.000000000 Z
12
+ date: 2022-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -26,7 +26,7 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: ruboty
29
+ name: octokit
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
@@ -40,7 +40,7 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: octokit
43
+ name: ruboty
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ">="
@@ -57,16 +57,16 @@ dependencies:
57
57
  name: bundler
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - "~>"
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: '1.6'
62
+ version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "~>"
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '1.6'
69
+ version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rake
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -85,16 +85,72 @@ dependencies:
85
85
  name: rspec
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '='
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop-performance
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
89
117
  - !ruby/object:Gem::Version
90
- version: 2.14.1
118
+ version: '0'
91
119
  type: :development
92
120
  prerelease: false
93
121
  version_requirements: !ruby/object:Gem::Requirement
94
122
  requirements:
95
- - - '='
123
+ - - ">="
96
124
  - !ruby/object:Gem::Version
97
- version: 2.14.1
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rubocop-rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop-rspec
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
98
154
  - !ruby/object:Gem::Dependency
99
155
  name: simplecov
100
156
  requirement: !ruby/object:Gem::Requirement
@@ -123,7 +179,7 @@ dependencies:
123
179
  - - ">="
124
180
  - !ruby/object:Gem::Version
125
181
  version: '0'
126
- description:
182
+ description:
127
183
  email:
128
184
  - r7kamura@gmail.com
129
185
  - spesnova@gmail.com
@@ -131,7 +187,11 @@ executables: []
131
187
  extensions: []
132
188
  extra_rdoc_files: []
133
189
  files:
190
+ - ".github/dependabot.yml"
191
+ - ".github/workflows/test.yml"
134
192
  - ".gitignore"
193
+ - ".rubocop.yml"
194
+ - ".rubocop_todo.yml"
135
195
  - CHANGELOG.md
136
196
  - Gemfile
137
197
  - LICENSE.txt
@@ -146,6 +206,7 @@ files:
146
206
  - lib/ruboty/github/actions/create_pull_request.rb
147
207
  - lib/ruboty/github/actions/merge_pull_request.rb
148
208
  - lib/ruboty/github/actions/remember.rb
209
+ - lib/ruboty/github/actions/search_issues.rb
149
210
  - lib/ruboty/github/version.rb
150
211
  - lib/ruboty/handlers/github.rb
151
212
  - ruboty-github.gemspec
@@ -154,8 +215,9 @@ files:
154
215
  homepage: https://github.com/increments/ruboty-qiita-github
155
216
  licenses:
156
217
  - MIT
157
- metadata: {}
158
- post_install_message:
218
+ metadata:
219
+ rubygems_mfa_required: 'true'
220
+ post_install_message:
159
221
  rdoc_options: []
160
222
  require_paths:
161
223
  - lib
@@ -170,12 +232,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
232
  - !ruby/object:Gem::Version
171
233
  version: '0'
172
234
  requirements: []
173
- rubyforge_project:
174
- rubygems_version: 2.4.5
175
- signing_key:
235
+ rubygems_version: 3.1.4
236
+ signing_key:
176
237
  specification_version: 4
177
238
  summary: Manage GitHub via Ruboty.
178
- test_files:
179
- - spec/ruboty/handlers/github_spec.rb
180
- - spec/spec_helper.rb
181
- has_rdoc:
239
+ test_files: []