lex-github 0.2.4 → 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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -3
  3. data/.rubocop.yml +2 -53
  4. data/CHANGELOG.md +55 -0
  5. data/CLAUDE.md +45 -19
  6. data/Gemfile +1 -0
  7. data/README.md +155 -83
  8. data/lex-github.gemspec +2 -0
  9. data/lib/legion/extensions/github/app/actor/token_refresh.rb +68 -0
  10. data/lib/legion/extensions/github/app/actor/webhook_poller.rb +65 -0
  11. data/lib/legion/extensions/github/app/hooks/setup.rb +19 -0
  12. data/lib/legion/extensions/github/app/hooks/webhook.rb +19 -0
  13. data/lib/legion/extensions/github/app/runners/auth.rb +48 -0
  14. data/lib/legion/extensions/github/app/runners/credential_store.rb +46 -0
  15. data/lib/legion/extensions/github/app/runners/installations.rb +56 -0
  16. data/lib/legion/extensions/github/app/runners/manifest.rb +65 -0
  17. data/lib/legion/extensions/github/app/runners/webhooks.rb +118 -0
  18. data/lib/legion/extensions/github/app/transport/exchanges/app.rb +17 -0
  19. data/lib/legion/extensions/github/app/transport/messages/event.rb +18 -0
  20. data/lib/legion/extensions/github/app/transport/queues/auth.rb +18 -0
  21. data/lib/legion/extensions/github/app/transport/queues/webhooks.rb +18 -0
  22. data/lib/legion/extensions/github/cli/app.rb +57 -0
  23. data/lib/legion/extensions/github/cli/auth.rb +99 -0
  24. data/lib/legion/extensions/github/client.rb +24 -0
  25. data/lib/legion/extensions/github/errors.rb +44 -0
  26. data/lib/legion/extensions/github/helpers/browser_auth.rb +106 -0
  27. data/lib/legion/extensions/github/helpers/cache.rb +99 -0
  28. data/lib/legion/extensions/github/helpers/callback_server.rb +89 -0
  29. data/lib/legion/extensions/github/helpers/client.rb +292 -2
  30. data/lib/legion/extensions/github/helpers/scope_registry.rb +91 -0
  31. data/lib/legion/extensions/github/helpers/token_cache.rb +86 -0
  32. data/lib/legion/extensions/github/middleware/credential_fallback.rb +76 -0
  33. data/lib/legion/extensions/github/middleware/rate_limit.rb +40 -0
  34. data/lib/legion/extensions/github/middleware/scope_probe.rb +37 -0
  35. data/lib/legion/extensions/github/oauth/actor/token_refresh.rb +76 -0
  36. data/lib/legion/extensions/github/oauth/hooks/callback.rb +19 -0
  37. data/lib/legion/extensions/github/oauth/runners/auth.rb +111 -0
  38. data/lib/legion/extensions/github/oauth/transport/exchanges/oauth.rb +17 -0
  39. data/lib/legion/extensions/github/oauth/transport/queues/auth.rb +18 -0
  40. data/lib/legion/extensions/github/runners/actions.rb +100 -0
  41. data/lib/legion/extensions/github/runners/branches.rb +8 -6
  42. data/lib/legion/extensions/github/runners/checks.rb +84 -0
  43. data/lib/legion/extensions/github/runners/comments.rb +15 -9
  44. data/lib/legion/extensions/github/runners/commits.rb +13 -8
  45. data/lib/legion/extensions/github/runners/contents.rb +6 -4
  46. data/lib/legion/extensions/github/runners/deployments.rb +76 -0
  47. data/lib/legion/extensions/github/runners/gists.rb +11 -6
  48. data/lib/legion/extensions/github/runners/issues.rb +18 -11
  49. data/lib/legion/extensions/github/runners/labels.rb +18 -11
  50. data/lib/legion/extensions/github/runners/organizations.rb +12 -10
  51. data/lib/legion/extensions/github/runners/pull_requests.rb +26 -16
  52. data/lib/legion/extensions/github/runners/releases.rb +89 -0
  53. data/lib/legion/extensions/github/runners/repositories.rb +19 -12
  54. data/lib/legion/extensions/github/runners/repository_webhooks.rb +76 -0
  55. data/lib/legion/extensions/github/runners/search.rb +13 -10
  56. data/lib/legion/extensions/github/runners/users.rb +14 -10
  57. data/lib/legion/extensions/github/version.rb +1 -1
  58. data/lib/legion/extensions/github.rb +23 -1
  59. metadata +63 -1
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/github/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Github
8
+ module Runners
9
+ module RepositoryWebhooks
10
+ include Legion::Extensions::Github::Helpers::Client
11
+
12
+ def list_webhooks(owner:, repo:, per_page: 30, page: 1, **)
13
+ response = connection(owner: owner, repo: repo, **).get(
14
+ "/repos/#{owner}/#{repo}/hooks", per_page: per_page, page: page
15
+ )
16
+ { result: response.body }
17
+ end
18
+
19
+ def get_webhook(owner:, repo:, hook_id:, **)
20
+ response = connection(owner: owner, repo: repo, **).get(
21
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}"
22
+ )
23
+ { result: response.body }
24
+ end
25
+
26
+ def create_webhook(owner:, repo:, config:, events: ['push'], active: true, **)
27
+ payload = { config: config, events: events, active: active }
28
+ response = connection(owner: owner, repo: repo, **).post(
29
+ "/repos/#{owner}/#{repo}/hooks", payload
30
+ )
31
+ { result: response.body }
32
+ end
33
+
34
+ def update_webhook(owner:, repo:, hook_id:, **opts)
35
+ payload = opts.slice(:config, :events, :active, :add_events, :remove_events)
36
+ response = connection(owner: owner, repo: repo, **opts).patch(
37
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}", payload
38
+ )
39
+ { result: response.body }
40
+ end
41
+
42
+ def delete_webhook(owner:, repo:, hook_id:, **)
43
+ response = connection(owner: owner, repo: repo, **).delete(
44
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}"
45
+ )
46
+ { result: response.status == 204 }
47
+ end
48
+
49
+ def ping_webhook(owner:, repo:, hook_id:, **)
50
+ response = connection(owner: owner, repo: repo, **).post(
51
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}/pings"
52
+ )
53
+ { result: response.status == 204 }
54
+ end
55
+
56
+ def test_webhook(owner:, repo:, hook_id:, **)
57
+ response = connection(owner: owner, repo: repo, **).post(
58
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}/tests"
59
+ )
60
+ { result: response.status == 204 }
61
+ end
62
+
63
+ def list_webhook_deliveries(owner:, repo:, hook_id:, per_page: 30, **)
64
+ response = connection(owner: owner, repo: repo, **).get(
65
+ "/repos/#{owner}/#{repo}/hooks/#{hook_id}/deliveries", per_page: per_page
66
+ )
67
+ { result: response.body }
68
+ end
69
+
70
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
71
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'digest'
3
4
  require 'legion/extensions/github/helpers/client'
5
+ require 'legion/extensions/github/helpers/cache'
4
6
 
5
7
  module Legion
6
8
  module Extensions
@@ -8,33 +10,34 @@ module Legion
8
10
  module Runners
9
11
  module Search
10
12
  include Legion::Extensions::Github::Helpers::Client
13
+ include Legion::Extensions::Github::Helpers::Cache
11
14
 
12
15
  def search_repositories(query:, sort: nil, order: 'desc', per_page: 30, page: 1, **)
13
16
  params = { q: query, sort: sort, order: order, per_page: per_page, page: page }.compact
14
- response = connection(**).get('/search/repositories', params)
15
- { result: response.body }
17
+ cache_key = "github:search:repositories:#{Digest::MD5.hexdigest(params.sort.to_s)}"
18
+ { result: cached_get(cache_key) { connection(**).get('/search/repositories', params).body } }
16
19
  end
17
20
 
18
21
  def search_issues(query:, sort: nil, order: 'desc', per_page: 30, page: 1, **)
19
22
  params = { q: query, sort: sort, order: order, per_page: per_page, page: page }.compact
20
- response = connection(**).get('/search/issues', params)
21
- { result: response.body }
23
+ cache_key = "github:search:issues:#{Digest::MD5.hexdigest(params.sort.to_s)}"
24
+ { result: cached_get(cache_key) { connection(**).get('/search/issues', params).body } }
22
25
  end
23
26
 
24
27
  def search_users(query:, sort: nil, order: 'desc', per_page: 30, page: 1, **)
25
28
  params = { q: query, sort: sort, order: order, per_page: per_page, page: page }.compact
26
- response = connection(**).get('/search/users', params)
27
- { result: response.body }
29
+ cache_key = "github:search:users:#{Digest::MD5.hexdigest(params.sort.to_s)}"
30
+ { result: cached_get(cache_key) { connection(**).get('/search/users', params).body } }
28
31
  end
29
32
 
30
33
  def search_code(query:, sort: nil, order: 'desc', per_page: 30, page: 1, **)
31
34
  params = { q: query, sort: sort, order: order, per_page: per_page, page: page }.compact
32
- response = connection(**).get('/search/code', params)
33
- { result: response.body }
35
+ cache_key = "github:search:code:#{Digest::MD5.hexdigest(params.sort.to_s)}"
36
+ { result: cached_get(cache_key) { connection(**).get('/search/code', params).body } }
34
37
  end
35
38
 
36
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
37
- Legion::Extensions::Helpers.const_defined?(:Lex)
39
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
40
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
38
41
  end
39
42
  end
40
43
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,29 +9,32 @@ module Legion
8
9
  module Runners
9
10
  module Users
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def get_authenticated_user(**)
13
- response = connection(**).get('/user')
14
- { result: response.body }
15
+ cred = resolve_credential
16
+ fp = cred&.dig(:metadata, :credential_fingerprint) || 'anonymous'
17
+ { result: cached_get("github:user:authenticated:#{fp}") { connection(**).get('/user').body } }
15
18
  end
16
19
 
17
20
  def get_user(username:, **)
18
- response = connection(**).get("/users/#{username}")
19
- { result: response.body }
21
+ { result: cached_get("github:user:#{username}") { connection(**).get("/users/#{username}").body } }
20
22
  end
21
23
 
22
24
  def list_followers(username:, per_page: 30, page: 1, **)
23
- response = connection(**).get("/users/#{username}/followers", per_page: per_page, page: page)
24
- { result: response.body }
25
+ { result: cached_get("github:user:#{username}:followers:#{page}:#{per_page}") do
26
+ connection(**).get("/users/#{username}/followers", per_page: per_page, page: page).body
27
+ end }
25
28
  end
26
29
 
27
30
  def list_following(username:, per_page: 30, page: 1, **)
28
- response = connection(**).get("/users/#{username}/following", per_page: per_page, page: page)
29
- { result: response.body }
31
+ { result: cached_get("github:user:#{username}:following:#{page}:#{per_page}") do
32
+ connection(**).get("/users/#{username}/following", per_page: per_page, page: page).body
33
+ end }
30
34
  end
31
35
 
32
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
33
- Legion::Extensions::Helpers.const_defined?(:Lex)
36
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
37
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
34
38
  end
35
39
  end
36
40
  end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Github
6
- VERSION = '0.2.4'
6
+ VERSION = '0.3.0'
7
7
  end
8
8
  end
9
9
  end
@@ -1,7 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/version'
4
+ require 'legion/extensions/github/errors'
5
+ require 'legion/extensions/github/middleware/rate_limit'
6
+ require 'legion/extensions/github/middleware/scope_probe'
7
+ require 'legion/extensions/github/middleware/credential_fallback'
4
8
  require 'legion/extensions/github/helpers/client'
9
+ require 'legion/extensions/github/helpers/cache'
10
+ require 'legion/extensions/github/helpers/token_cache'
11
+ require 'legion/extensions/github/helpers/scope_registry'
12
+ require 'legion/extensions/github/app/runners/auth'
13
+ require 'legion/extensions/github/app/runners/webhooks'
14
+ require 'legion/extensions/github/app/runners/manifest'
15
+ require 'legion/extensions/github/app/runners/installations'
16
+ require 'legion/extensions/github/app/runners/credential_store'
17
+ require 'legion/extensions/github/oauth/runners/auth'
18
+ require 'legion/extensions/github/helpers/callback_server'
19
+ require 'legion/extensions/github/helpers/browser_auth'
20
+ require 'legion/extensions/github/cli/auth'
21
+ require 'legion/extensions/github/cli/app'
5
22
  require 'legion/extensions/github/runners/repositories'
6
23
  require 'legion/extensions/github/runners/issues'
7
24
  require 'legion/extensions/github/runners/pull_requests'
@@ -14,12 +31,17 @@ require 'legion/extensions/github/runners/labels'
14
31
  require 'legion/extensions/github/runners/comments'
15
32
  require 'legion/extensions/github/runners/branches'
16
33
  require 'legion/extensions/github/runners/contents'
34
+ require 'legion/extensions/github/runners/actions'
35
+ require 'legion/extensions/github/runners/checks'
36
+ require 'legion/extensions/github/runners/releases'
37
+ require 'legion/extensions/github/runners/deployments'
38
+ require 'legion/extensions/github/runners/repository_webhooks'
17
39
  require 'legion/extensions/github/client'
18
40
 
19
41
  module Legion
20
42
  module Extensions
21
43
  module Github
22
- extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
44
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core, false
23
45
  end
24
46
  end
25
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-github
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -9,6 +9,20 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0.1'
12
26
  - !ruby/object:Gem::Dependency
13
27
  name: faraday
14
28
  requirement: !ruby/object:Gem::Requirement
@@ -23,6 +37,20 @@ dependencies:
23
37
  - - ">="
24
38
  - !ruby/object:Gem::Version
25
39
  version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: jwt
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.7'
26
54
  - !ruby/object:Gem::Dependency
27
55
  name: legion-cache
28
56
  requirement: !ruby/object:Gem::Requirement
@@ -142,18 +170,52 @@ files:
142
170
  - README.md
143
171
  - lex-github.gemspec
144
172
  - lib/legion/extensions/github.rb
173
+ - lib/legion/extensions/github/app/actor/token_refresh.rb
174
+ - lib/legion/extensions/github/app/actor/webhook_poller.rb
175
+ - lib/legion/extensions/github/app/hooks/setup.rb
176
+ - lib/legion/extensions/github/app/hooks/webhook.rb
177
+ - lib/legion/extensions/github/app/runners/auth.rb
178
+ - lib/legion/extensions/github/app/runners/credential_store.rb
179
+ - lib/legion/extensions/github/app/runners/installations.rb
180
+ - lib/legion/extensions/github/app/runners/manifest.rb
181
+ - lib/legion/extensions/github/app/runners/webhooks.rb
182
+ - lib/legion/extensions/github/app/transport/exchanges/app.rb
183
+ - lib/legion/extensions/github/app/transport/messages/event.rb
184
+ - lib/legion/extensions/github/app/transport/queues/auth.rb
185
+ - lib/legion/extensions/github/app/transport/queues/webhooks.rb
186
+ - lib/legion/extensions/github/cli/app.rb
187
+ - lib/legion/extensions/github/cli/auth.rb
145
188
  - lib/legion/extensions/github/client.rb
189
+ - lib/legion/extensions/github/errors.rb
190
+ - lib/legion/extensions/github/helpers/browser_auth.rb
191
+ - lib/legion/extensions/github/helpers/cache.rb
192
+ - lib/legion/extensions/github/helpers/callback_server.rb
146
193
  - lib/legion/extensions/github/helpers/client.rb
194
+ - lib/legion/extensions/github/helpers/scope_registry.rb
195
+ - lib/legion/extensions/github/helpers/token_cache.rb
196
+ - lib/legion/extensions/github/middleware/credential_fallback.rb
197
+ - lib/legion/extensions/github/middleware/rate_limit.rb
198
+ - lib/legion/extensions/github/middleware/scope_probe.rb
199
+ - lib/legion/extensions/github/oauth/actor/token_refresh.rb
200
+ - lib/legion/extensions/github/oauth/hooks/callback.rb
201
+ - lib/legion/extensions/github/oauth/runners/auth.rb
202
+ - lib/legion/extensions/github/oauth/transport/exchanges/oauth.rb
203
+ - lib/legion/extensions/github/oauth/transport/queues/auth.rb
204
+ - lib/legion/extensions/github/runners/actions.rb
147
205
  - lib/legion/extensions/github/runners/branches.rb
206
+ - lib/legion/extensions/github/runners/checks.rb
148
207
  - lib/legion/extensions/github/runners/comments.rb
149
208
  - lib/legion/extensions/github/runners/commits.rb
150
209
  - lib/legion/extensions/github/runners/contents.rb
210
+ - lib/legion/extensions/github/runners/deployments.rb
151
211
  - lib/legion/extensions/github/runners/gists.rb
152
212
  - lib/legion/extensions/github/runners/issues.rb
153
213
  - lib/legion/extensions/github/runners/labels.rb
154
214
  - lib/legion/extensions/github/runners/organizations.rb
155
215
  - lib/legion/extensions/github/runners/pull_requests.rb
216
+ - lib/legion/extensions/github/runners/releases.rb
156
217
  - lib/legion/extensions/github/runners/repositories.rb
218
+ - lib/legion/extensions/github/runners/repository_webhooks.rb
157
219
  - lib/legion/extensions/github/runners/search.rb
158
220
  - lib/legion/extensions/github/runners/users.rb
159
221
  - lib/legion/extensions/github/version.rb