Class: Ocak::IssueFetcher

Inherits:
Object
  • Object
show all
Defined in:
lib/ocak/issue_fetcher.rb

Instance Method Summary collapse

Constructor Details

#initialize(config:, logger: nil) ⇒ IssueFetcher

Returns a new instance of IssueFetcher.



8
9
10
11
# File 'lib/ocak/issue_fetcher.rb', line 8

def initialize(config:, logger: nil)
  @config = config
  @logger = logger
end

Instance Method Details

#add_label(issue_number, label) ⇒ Object



33
34
35
# File 'lib/ocak/issue_fetcher.rb', line 33

def add_label(issue_number, label)
  run_gh('issue', 'edit', issue_number.to_s, '--add-label', label)
end

#comment(issue_number, body) ⇒ Object



46
47
48
# File 'lib/ocak/issue_fetcher.rb', line 46

def comment(issue_number, body)
  run_gh('issue', 'comment', issue_number.to_s, '--body', body)
end

#fetch_readyObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/ocak/issue_fetcher.rb', line 13

def fetch_ready
  stdout, _, status = Open3.capture3(
    'gh', 'issue', 'list',
    '--label', @config.label_ready,
    '--state', 'open',
    '--json', 'number,title,body,labels,author',
    '--limit', '50',
    chdir: @config.project_dir
  )
  return [] unless status.success?

  issues = JSON.parse(stdout)
  issues.reject! { |i| in_progress?(i) }
  issues.select! { |i| authorized_issue?(i) }
  issues
rescue JSON::ParserError => e
  @logger&.warn("Failed to parse issue list JSON: #{e.message}")
  []
end

#remove_label(issue_number, label) ⇒ Object



37
38
39
# File 'lib/ocak/issue_fetcher.rb', line 37

def remove_label(issue_number, label)
  run_gh('issue', 'edit', issue_number.to_s, '--remove-label', label)
end

#transition(issue_number, from:, to:) ⇒ Object



41
42
43
44
# File 'lib/ocak/issue_fetcher.rb', line 41

def transition(issue_number, from:, to:)
  remove_label(issue_number, from) if from
  add_label(issue_number, to)
end

#view(issue_number, fields: 'number,title,body,labels') ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/ocak/issue_fetcher.rb', line 50

def view(issue_number, fields: 'number,title,body,labels')
  stdout, _, status = Open3.capture3(
    'gh', 'issue', 'view', issue_number.to_s,
    '--json', fields,
    chdir: @config.project_dir
  )
  return nil unless status.success?

  JSON.parse(stdout)
rescue JSON::ParserError => e
  @logger&.warn("Failed to parse issue view JSON: #{e.message}")
  nil
end