Class: Fbe::Graph

Inherits:
Object
  • Object
show all
Defined in:
lib/fbe/github_graph.rb

Overview

A client to GitHub GraphQL.

Author

Yegor Bugayenko (yegor256@gmail.com)

Copyright

Copyright © 2024-2025 Zerocracy

License

MIT

Defined Under Namespace

Classes: Fake, HTTP

Instance Method Summary collapse

Constructor Details

#initialize(token:, host: 'api.github.com') ⇒ Graph

Returns a new instance of Graph.

[View source]

32
33
34
35
36
37
# File 'lib/fbe/github_graph.rb', line 32

def initialize(token:, host: 'api.github.com')
  @token = token
  http = HTTP.new(token, host)
  @client = GraphQL::Client.new(schema: GraphQL::Client.load_schema(http), execute: http)
  @client.allow_dynamic_queries = true
end

Instance Method Details

#query(query_string) ⇒ Object

[View source]

39
40
41
42
# File 'lib/fbe/github_graph.rb', line 39

def query(query_string)
  result = @client.query(@client.parse(query_string))
  result.data
end

#resolved_conversations(owner, name, number) ⇒ Object

[View source]

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/fbe/github_graph.rb', line 44

def resolved_conversations(owner, name, number)
  result = query(
    <<~GRAPHQL
      {
        repository(owner: "#{owner}", name: "#{name}") {
          pullRequest(number: #{number}) {
            reviewThreads(first: 100) {
              nodes {
                id
                isResolved
                comments(first: 100) {
                  nodes {
                    id
                    body
                    author {
                      login
                    }
                    createdAt
                  }
                }
              }
            }
          }
        }
      }
    GRAPHQL
  )
  result&.to_h&.dig('repository', 'pullRequest', 'reviewThreads', 'nodes')&.select do |thread|
    thread['isResolved']
  end || []
end

#total_commits(owner, name, branch) ⇒ Object

[View source]

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/fbe/github_graph.rb', line 76

def total_commits(owner, name, branch)
  result = query(
    <<~GRAPHQL
      {
        repository(owner: "#{owner}", name: "#{name}") {
          ref(qualifiedName: "#{branch}") {
            target {
              ... on Commit {
                history {
                  totalCount
                }
              }
            }
          }
        }
      }
    GRAPHQL
  )
  result.repository.ref.target.history.total_count
end

#total_issues_and_pulls(owner, name) ⇒ Object

[View source]

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/fbe/github_graph.rb', line 97

def total_issues_and_pulls(owner, name)
  result = query(
    <<~GRAPHQL
      {
        repository(owner: "#{owner}", name: "#{name}") {
          issues {
            totalCount
          }
          pullRequests {
            totalCount
          }
        }
      }
    GRAPHQL
  ).to_h
  {
    'issues' => result.dig('repository', 'issues', 'totalCount') || 0,
    'pulls' => result.dig('repository', 'pullRequests', 'totalCount') || 0
  }
end