• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jackfirth / resyntax / #236

05 Nov 2025 05:27PM UTC coverage: 93.371% (+0.2%) from 93.123%
#236

Pull #730

cover

Copilot
Fix formatting in github-test.rkt to match project conventions

Co-authored-by: jackfirth <8175575+jackfirth@users.noreply.github.com>
Pull Request #730: Add test coverage for github.rkt module

6 of 15 new or added lines in 1 file covered. (40.0%)

11 existing lines in 1 file now uncovered.

14861 of 15916 relevant lines covered (93.37%)

0.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.2
/private/github.rkt
1
#lang racket/base
1✔
2

3

4
(require racket/contract/base)
1✔
5

6

7
(provide
1✔
8
 (contract-out
1✔
9
  [github-review-request? (-> any/c boolean?)]
1✔
10
  [github-review-request
1✔
11
   (-> #:owner-repo string?
1✔
12
       #:pull-number exact-nonnegative-integer?
1✔
13
       #:body string?
1✔
14
       #:event string?
1✔
15
       #:comments list?
1✔
16
       github-review-request?)]
1✔
17
  [github-review-request-jsexpr (-> github-review-request? jsexpr?)]
1✔
18
  [github-review-comment? (-> any/c boolean?)]
1✔
19
  [github-review-comment
1✔
20
   (-> #:path string?
1✔
21
       #:body string?
1✔
22
       #:start-line exact-nonnegative-integer?
1✔
23
       #:end-line exact-nonnegative-integer?
1✔
24
       #:start-side string?
1✔
25
       #:end-side string?
1✔
26
       github-review-comment?)]
1✔
27
  [github-review-comment-jsexpr (-> github-review-comment? jsexpr?)]
1✔
28
  [git-ref->pr-number (-> string? exact-nonnegative-integer?)]
1✔
29
  [github-review-body (-> boolean? exact-nonnegative-integer? string?)]
1✔
30
  [refactoring-results->github-review
1✔
31
   (-> (sequence/c refactoring-result?) #:file-count exact-nonnegative-integer?
1✔
32
       github-review-request?)]))
1✔
33

34

35
(require json
1✔
36
         racket/list
1✔
37
         racket/match
1✔
38
         racket/pretty
1✔
39
         racket/sequence
1✔
40
         racket/string
1✔
41
         rebellion/collection/list
1✔
42
         rebellion/streaming/transducer
1✔
43
         rebellion/type/record
1✔
44
         resyntax/private/line-replacement
1✔
45
         resyntax/private/refactoring-result
1✔
46
         resyntax/private/run-command
1✔
47
         resyntax/private/source
1✔
48
         resyntax/private/string-indent
1✔
49
         resyntax/private/syntax-replacement)
1✔
50

51

52
;@----------------------------------------------------------------------------------------------------
53

54

55
(define-record-type github-review-request
1✔
56
  (owner-repo pull-number body event comments))
1✔
57

58

59
(define (github-review-request-jsexpr req)
1✔
60
  (match-define
1✔
61
    (github-review-request
1✔
62
     #:owner-repo owner-repo #:pull-number pull-number #:body body #:event event #:comments comments)
1✔
63
    req)
1✔
64
  (match-define (list owner repo) (string-split owner-repo "/"))
1✔
65
  (hash 'owner owner
1✔
66
        'repo repo
1✔
67
        'body body
1✔
68
        'event event
1✔
69
        'comments (map github-review-comment-jsexpr comments)
1✔
70
        'pull_number pull-number))
1✔
71

72

73
(define-record-type github-review-comment
1✔
74
  (path body start-line end-line start-side end-side))
1✔
75

76

77
(define (github-review-comment-jsexpr comment)
1✔
78
  (match-define
1✔
79
    (github-review-comment #:path path
1✔
80
                           #:body body
1✔
81
                           #:start-line start-line
1✔
82
                           #:end-line end-line
1✔
83
                           #:start-side start-side
1✔
84
                           #:end-side end-side)
1✔
85
    comment)
1✔
86
  (if (= start-line end-line)
1✔
87
      (hash 'path path
1✔
88
            'body body
1✔
89
            'line end-line
1✔
90
            'side end-side)
1✔
91
      (hash 'path path
1✔
92
            'body body
1✔
93
            'start_line start-line
1✔
94
            'line end-line
1✔
95
            'start_side start-side
1✔
96
            'side end-side)))
1✔
97

98

99
(define (git-path path)
1✔
100
  (string-split (run-command "git" "ls-tree" "-r" "-z" "--name-only" "HEAD" path) "\0"))
×
101

102

103
(define git-pr-ref-regexp #rx"^refs/pull/([0-9]+)/merge$")
1✔
104

105

106
(define (git-ref->pr-number ref)
1✔
107
  (match ref
1✔
108
    [(regexp git-pr-ref-regexp (list _ num))
1✔
109
     (string->number num)]
1✔
110
    [_
1✔
111
     (error (format "ref ~a doesn't represent a pull request" ref))]))
1✔
112

113

114
(define (refactoring-result->github-review-comment result)
1✔
115
  (define path
×
116
    (file-source-path (syntax-replacement-source (refactoring-result-syntax-replacement result))))
×
UNCOV
117
  (define replacement (refactoring-result-line-replacement result))
×
118
  (define body
×
119
    (format #<<EOS
×
UNCOV
120
**`~a`:** ~a
×
121

122
```suggestion
×
123
~a
×
124
```
×
125

126
<details>
×
127
<summary>Debugging details</summary>
×
128

129
<details>
×
130
  <summary>Textual replacement</summary>
×
131

132
  ```scheme
×
133
~a
×
134
  ```
×
135
</details>
×
136

137
<details>
×
138
  <summary>Syntactic replacement</summary>
×
139

UNCOV
140
  ```scheme
×
UNCOV
141
~a
×
UNCOV
142
  ```
×
UNCOV
143
</details>
×
UNCOV
144
</details>
×
UNCOV
145
EOS
×
UNCOV
146
            (refactoring-result-rule-name result)
×
147
            (refactoring-result-message result)
×
148
            (line-replacement-new-text replacement)
×
149
            (string-indent (pretty-format replacement) #:amount 2)
×
UNCOV
150
            (string-indent (pretty-format (refactoring-result-syntax-replacement result))
×
UNCOV
151
                           #:amount 2)))
×
152
  (github-review-comment
×
153
   #:path (first (git-path path))
×
154
   #:body body
×
155
   #:start-line (line-replacement-start-line replacement)
×
156
   #:end-line (line-replacement-original-end-line replacement)
×
157
   #:start-side "RIGHT"
×
158
   #:end-side "RIGHT"))
×
159

160

161
(define branch-ref (getenv "GITHUB_REF"))
1✔
162
(define github-repository (getenv "GITHUB_REPOSITORY"))
1✔
163

164

165
(define (github-review-body comments? file-count)
1✔
166
  (format "[Resyntax](https://docs.racket-lang.org/resyntax/) analyzed ~a in this pull request and ~a"
1✔
167
          (if (= file-count 1) "1 file" (format "~a files" file-count))
1✔
168
          (if comments? "has added suggestions." "found no issues.")))
1✔
169

170

NEW
171
(define (refactoring-results->github-review results #:file-count file-count)
×
NEW
172
  (define comments
×
NEW
173
    (transduce results (mapping refactoring-result->github-review-comment) #:into into-list))
×
NEW
174
  (github-review-request
×
NEW
175
   #:owner-repo github-repository
×
NEW
176
   #:pull-number (git-ref->pr-number branch-ref)
×
NEW
177
   #:body (github-review-body (not (null? comments)) file-count)
×
NEW
178
   #:event (if (empty? comments) "APPROVE" "COMMENT")
×
NEW
179
   #:comments comments))
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc