fbe 0.12.0 → 0.14.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
2
  SHA256:
3
- metadata.gz: 9ed20ed25d37fbb0a555303dad81f2ac461a59e17b073af0be21775475d92fc8
4
- data.tar.gz: 7621cf7d678261979e315b9222843ebaf6f1cdd29e339ddac776393514fefd73
3
+ metadata.gz: 3014cee4d698164150c3588438c2c6e5b5b52619adafe6c6a16511ac14cfbe3d
4
+ data.tar.gz: aae4764232e4bfddc86b40385fdca9feab141bcf64790d3df3366f99e403fe34
5
5
  SHA512:
6
- metadata.gz: 4ba5749440eb961591dcc10e8c3457b9b926e55152313670b6e3e220a54e2422b684a9a5f7ede3f873ee38244d7759f0a18f95ae97430296fa328922996e42a6
7
- data.tar.gz: '08461885b503285fec347a052e9c321535415bb218cd88d6b476b4ec40a9fb44934fddbd276a0c5d4f4bb145db94a71ffedead986787d250ad07dcd0af34b886'
6
+ metadata.gz: 133bf5f80ec894aa9c1a67d291e504745a307cc80a9765078670df59dff58658544e84a765060fb0b0e423b94abaf77bda45c72a7594dbb31c655c0211f7974d
7
+ data.tar.gz: cb4b5ff642038f99264c0df676e251fff87fe23a1fb47e1cfb661a3f308bede8ea4f9c5376d34ecad169a1f28a8a26eee81cc40c84b767415496c477dd4dcfa3
@@ -0,0 +1,6 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ [default.extend-identifiers]
5
+ 51aee236ba884 = "51aee236ba884"
6
+ cb9b62eb1979589daa18142008 = "cb9b62eb1979589daa18142008"
@@ -17,3 +17,5 @@ jobs:
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
  - uses: crate-ci/typos@v1.32.0
20
+ with:
21
+ config: .github/.typos.toml
@@ -151,6 +151,87 @@ class Fbe::Graph
151
151
  }
152
152
  end
153
153
 
154
+ # Get info about issue type event
155
+ #
156
+ # @param [String] node_id ID of the event object
157
+ # @return [Hash] A hash with issue type event
158
+ def issue_type_event(node_id)
159
+ result = query(
160
+ <<~GRAPHQL
161
+ {
162
+ node(id: "#{node_id}") {
163
+ __typename
164
+ ... on IssueTypeAddedEvent {
165
+ id
166
+ createdAt
167
+ issueType { ...IssueTypeFragment }
168
+ actor { ...ActorFragment }
169
+ }
170
+ ... on IssueTypeChangedEvent {
171
+ id
172
+ createdAt
173
+ issueType { ...IssueTypeFragment }
174
+ prevIssueType { ...IssueTypeFragment }
175
+ actor { ...ActorFragment }
176
+ }
177
+ ... on IssueTypeRemovedEvent {
178
+ id
179
+ createdAt
180
+ issueType { ...IssueTypeFragment }
181
+ actor { ...ActorFragment }
182
+ }
183
+ }
184
+ }
185
+ fragment ActorFragment on Actor {
186
+ __typename
187
+ login
188
+ ... on User { databaseId name email }
189
+ ... on Bot { databaseId }
190
+ ... on EnterpriseUserAccount { user { databaseId name email } }
191
+ ... on Mannequin { claimant { databaseId name email } }
192
+ }
193
+ fragment IssueTypeFragment on IssueType {
194
+ id
195
+ name
196
+ description
197
+ }
198
+ GRAPHQL
199
+ ).to_h
200
+ return unless result['node']
201
+ type = result.dig('node', '__typename')
202
+ prev_issue_type =
203
+ if type == 'IssueTypeChangedEvent'
204
+ {
205
+ 'id' => result.dig('node', 'prevIssueType', 'id'),
206
+ 'name' => result.dig('node', 'prevIssueType', 'name'),
207
+ 'description' => result.dig('node', 'prevIssueType', 'description')
208
+ }
209
+ end
210
+ {
211
+ 'type' => type,
212
+ 'created_at' => Time.parse(result.dig('node', 'createdAt')),
213
+ 'issue_type' => {
214
+ 'id' => result.dig('node', 'issueType', 'id'),
215
+ 'name' => result.dig('node', 'issueType', 'name'),
216
+ 'description' => result.dig('node', 'issueType', 'description')
217
+ },
218
+ 'prev_issue_type' => prev_issue_type,
219
+ 'actor' => {
220
+ 'login' => result.dig('node', 'actor', 'login'),
221
+ 'type' => result.dig('node', 'actor', '__typename'),
222
+ 'id' => result.dig('node', 'actor', 'databaseId') ||
223
+ result.dig('node', 'actor', 'user', 'databaseId') ||
224
+ result.dig('node', 'actor', 'claimant', 'databaseId'),
225
+ 'name' => result.dig('node', 'actor', 'name') ||
226
+ result.dig('node', 'actor', 'user', 'name') ||
227
+ result.dig('node', 'actor', 'claimant', 'name'),
228
+ 'email' => result.dig('node', 'actor', 'email') ||
229
+ result.dig('node', 'actor', 'user', 'email') ||
230
+ result.dig('node', 'actor', 'claimant', 'email')
231
+ }
232
+ }
233
+ end
234
+
154
235
  private
155
236
 
156
237
  # Creates or returns a cached GraphQL client instance.
@@ -216,6 +297,69 @@ class Fbe::Graph
216
297
  1484
217
298
  end
218
299
 
300
+ def issue_type_event(node_id)
301
+ case node_id
302
+ when 'ITAE_examplevq862Ga8lzwAAAAQZanzv'
303
+ {
304
+ 'type' => 'IssueTypeAddedEvent',
305
+ 'created_at' => Time.parse('2025-05-11 18:17:16 UTC'),
306
+ 'issue_type' => {
307
+ 'id' => 'IT_exampleQls4BmRE0',
308
+ 'name' => 'Bug',
309
+ 'description' => 'An unexpected problem or behavior'
310
+ },
311
+ 'prev_issue_type' => nil,
312
+ 'actor' => {
313
+ 'login' => 'yegor256',
314
+ 'type' => 'User',
315
+ 'id' => 526_301,
316
+ 'name' => 'Yegor',
317
+ 'email' => 'example@gmail.com'
318
+ }
319
+ }
320
+ when 'ITCE_examplevq862Ga8lzwAAAAQZbq9S'
321
+ {
322
+ 'type' => 'IssueTypeChangedEvent',
323
+ 'created_at' => Time.parse('2025-05-11 20:23:13 UTC'),
324
+ 'issue_type' => {
325
+ 'id' => 'IT_kwDODJdQls4BmREz',
326
+ 'name' => 'Task',
327
+ 'description' => 'A specific piece of work'
328
+ },
329
+ 'prev_issue_type' => {
330
+ 'id' => 'IT_kwDODJdQls4BmRE0',
331
+ 'name' => 'Bug',
332
+ 'description' => 'An unexpected problem or behavior'
333
+ },
334
+ 'actor' => {
335
+ 'login' => 'yegor256',
336
+ 'type' => 'User',
337
+ 'id' => 526_301,
338
+ 'name' => 'Yegor',
339
+ 'email' => 'example@gmail.com'
340
+ }
341
+ }
342
+ when 'ITRE_examplevq862Ga8lzwAAAAQcqceV'
343
+ {
344
+ 'type' => 'IssueTypeRemovedEvent',
345
+ 'created_at' => Time.parse('2025-05-11 22:09:42 UTC'),
346
+ 'issue_type' => {
347
+ 'id' => 'IT_kwDODJdQls4BmRE1',
348
+ 'name' => 'Feature',
349
+ 'description' => 'A request, idea, or new functionality'
350
+ },
351
+ 'prev_issue_type' => nil,
352
+ 'actor' => {
353
+ 'login' => 'yegor256',
354
+ 'type' => 'User',
355
+ 'id' => 526_301,
356
+ 'name' => 'Yegor',
357
+ 'email' => 'example@gmail.com'
358
+ }
359
+ }
360
+ end
361
+ end
362
+
219
363
  private
220
364
 
221
365
  def conversation(id)
data/lib/fbe/octo.rb CHANGED
@@ -341,6 +341,18 @@ class Fbe::FakeOctokit
341
341
  true
342
342
  end
343
343
 
344
+ # Accepts a repository invitation.
345
+ #
346
+ # @param [Integer] id The invitation ID
347
+ # @return [Boolean] Returns true when successful (204 No Content in actual API)
348
+ # @example
349
+ # fake_client = Fbe::FakeOctokit.new
350
+ # fake_client.accept_repository_invitation(1) #=> true
351
+ def accept_repository_invitation(id)
352
+ raise Octokit::NotFound if id == 404_000
353
+ true
354
+ end
355
+
344
356
  # Gives a star to a repository.
345
357
  #
346
358
  # @param [String] _repo The repository name (e.g., 'user/repo')
@@ -820,6 +832,32 @@ class Fbe::FakeOctokit
820
832
  name: 'bug'
821
833
  },
822
834
  created_at: random_time
835
+ },
836
+ {
837
+ node_id: 'ITAE_examplevq862Ga8lzwAAAAQZanzv',
838
+ event: 'issue_type_added',
839
+ actor: {
840
+ id: 526_301,
841
+ login: 'yegor256'
842
+ },
843
+ repository: {
844
+ id: name_to_number('yegor256/judges'),
845
+ full_name: 'yegor256/judges'
846
+ },
847
+ created_at: random_time
848
+ },
849
+ {
850
+ node_id: 'ITCE_examplevq862Ga8lzwAAAAQZbq9S',
851
+ event: 'issue_type_changed',
852
+ actor: {
853
+ id: 526_301,
854
+ login: 'yegor256'
855
+ },
856
+ repository: {
857
+ id: name_to_number('yegor256/judges'),
858
+ full_name: 'yegor256/judges'
859
+ },
860
+ created_at: random_time
823
861
  }
824
862
  ]
825
863
  end
data/lib/fbe.rb CHANGED
@@ -10,5 +10,5 @@
10
10
  # License:: MIT
11
11
  module Fbe
12
12
  # Current version of the gem (changed by +.rultor.yml+ on every release)
13
- VERSION = '0.12.0' unless const_defined?(:VERSION)
13
+ VERSION = '0.14.0' unless const_defined?(:VERSION)
14
14
  end
@@ -139,4 +139,31 @@ class TestGitHubGraph < Fbe::Test
139
139
  graph = Fbe.github_graph(options: Judges::Options.new('testing' => true), loog: Loog::NULL, global: {})
140
140
  assert_equal(1484, graph.total_commits('zerocracy', 'fbe', 'master'))
141
141
  end
142
+
143
+ def test_fake_issue_type_event
144
+ WebMock.disable_net_connect!
145
+ graph = Fbe.github_graph(options: Judges::Options.new('testing' => true), loog: Loog::NULL, global: {})
146
+ assert_nil(graph.issue_type_event('wrong_id'))
147
+ add_type_event = graph.issue_type_event('ITAE_examplevq862Ga8lzwAAAAQZanzv')
148
+ assert_equal('IssueTypeAddedEvent', add_type_event['type'])
149
+ assert_equal(Time.parse('2025-05-11 18:17:16 UTC'), add_type_event['created_at'])
150
+ assert_equal('Bug', add_type_event.dig('issue_type', 'name'))
151
+ assert_nil(add_type_event['prev_issue_type'])
152
+ assert_equal(526_301, add_type_event.dig('actor', 'id'))
153
+ assert_equal('yegor256', add_type_event.dig('actor', 'login'))
154
+ change_type_event = graph.issue_type_event('ITCE_examplevq862Ga8lzwAAAAQZbq9S')
155
+ assert_equal('IssueTypeChangedEvent', change_type_event['type'])
156
+ assert_equal(Time.parse('2025-05-11 20:23:13 UTC'), change_type_event['created_at'])
157
+ assert_equal('Task', change_type_event.dig('issue_type', 'name'))
158
+ assert_equal('Bug', change_type_event.dig('prev_issue_type', 'name'))
159
+ assert_equal(526_301, change_type_event.dig('actor', 'id'))
160
+ assert_equal('yegor256', change_type_event.dig('actor', 'login'))
161
+ remove_type_event = graph.issue_type_event('ITRE_examplevq862Ga8lzwAAAAQcqceV')
162
+ assert_equal('IssueTypeRemovedEvent', remove_type_event['type'])
163
+ assert_equal(Time.parse('2025-05-11 22:09:42 UTC'), remove_type_event['created_at'])
164
+ assert_equal('Feature', remove_type_event.dig('issue_type', 'name'))
165
+ assert_nil(remove_type_event['prev_issue_type'])
166
+ assert_equal(526_301, remove_type_event.dig('actor', 'id'))
167
+ assert_equal('yegor256', remove_type_event.dig('actor', 'login'))
168
+ end
142
169
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fbe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -258,6 +258,7 @@ extra_rdoc_files:
258
258
  files:
259
259
  - ".0pdd.yml"
260
260
  - ".gitattributes"
261
+ - ".github/.typos.toml"
261
262
  - ".github/workflows/actionlint.yml"
262
263
  - ".github/workflows/codecov.yml"
263
264
  - ".github/workflows/copyrights.yml"