ghub 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/LICENSE.adoc +134 -0
  4. data/README.adoc +198 -0
  5. data/ghub.gemspec +37 -0
  6. data/lib/ghub/api/client.rb +49 -0
  7. data/lib/ghub/api/page.rb +59 -0
  8. data/lib/ghub/client.rb +34 -0
  9. data/lib/ghub/configuration/content.rb +8 -0
  10. data/lib/ghub/configuration/loader.rb +30 -0
  11. data/lib/ghub/container.rb +15 -0
  12. data/lib/ghub/endpoints/branches/protection/actions/show.rb +31 -0
  13. data/lib/ghub/endpoints/branches/protection/actions/update.rb +38 -0
  14. data/lib/ghub/endpoints/branches/protection/container.rb +35 -0
  15. data/lib/ghub/endpoints/branches/protection/import.rb +13 -0
  16. data/lib/ghub/endpoints/branches/protection/models/show.rb +48 -0
  17. data/lib/ghub/endpoints/branches/protection/requests/update.rb +52 -0
  18. data/lib/ghub/endpoints/branches/protection/responses/show.rb +27 -0
  19. data/lib/ghub/endpoints/branches/protection/root.rb +26 -0
  20. data/lib/ghub/endpoints/branches/signature/container.rb +26 -0
  21. data/lib/ghub/endpoints/branches/signature/import.rb +13 -0
  22. data/lib/ghub/endpoints/branches/signature/root.rb +48 -0
  23. data/lib/ghub/endpoints/container.rb +19 -0
  24. data/lib/ghub/endpoints/import.rb +9 -0
  25. data/lib/ghub/endpoints/organizations/members/actions/index.rb +32 -0
  26. data/lib/ghub/endpoints/organizations/members/container.rb +30 -0
  27. data/lib/ghub/endpoints/organizations/members/import.rb +13 -0
  28. data/lib/ghub/endpoints/organizations/members/responses/index.rb +14 -0
  29. data/lib/ghub/endpoints/organizations/members/root.rb +16 -0
  30. data/lib/ghub/endpoints/pulls/actions/index.rb +28 -0
  31. data/lib/ghub/endpoints/pulls/actions/show.rb +26 -0
  32. data/lib/ghub/endpoints/pulls/container.rb +30 -0
  33. data/lib/ghub/endpoints/pulls/import.rb +11 -0
  34. data/lib/ghub/endpoints/pulls/models/show.rb +81 -0
  35. data/lib/ghub/endpoints/pulls/responses/index.rb +12 -0
  36. data/lib/ghub/endpoints/pulls/responses/show.rb +62 -0
  37. data/lib/ghub/endpoints/pulls/root.rb +16 -0
  38. data/lib/ghub/endpoints/repositories/actions/create.rb +37 -0
  39. data/lib/ghub/endpoints/repositories/actions/index.rb +36 -0
  40. data/lib/ghub/endpoints/repositories/actions/patch.rb +37 -0
  41. data/lib/ghub/endpoints/repositories/actions/show.rb +32 -0
  42. data/lib/ghub/endpoints/repositories/container.rb +39 -0
  43. data/lib/ghub/endpoints/repositories/import.rb +11 -0
  44. data/lib/ghub/endpoints/repositories/path.rb +54 -0
  45. data/lib/ghub/endpoints/repositories/requests/create.rb +32 -0
  46. data/lib/ghub/endpoints/repositories/requests/patch.rb +38 -0
  47. data/lib/ghub/endpoints/repositories/responses/index.rb +12 -0
  48. data/lib/ghub/endpoints/repositories/responses/show.rb +97 -0
  49. data/lib/ghub/endpoints/repositories/root.rb +28 -0
  50. data/lib/ghub/endpoints/users/actions/index.rb +28 -0
  51. data/lib/ghub/endpoints/users/actions/show.rb +24 -0
  52. data/lib/ghub/endpoints/users/container.rb +31 -0
  53. data/lib/ghub/endpoints/users/import.rb +11 -0
  54. data/lib/ghub/endpoints/users/models/index.rb +39 -0
  55. data/lib/ghub/endpoints/users/models/show.rb +53 -0
  56. data/lib/ghub/endpoints/users/responses/index.rb +33 -0
  57. data/lib/ghub/endpoints/users/responses/show.rb +45 -0
  58. data/lib/ghub/endpoints/users/root.rb +16 -0
  59. data/lib/ghub/import.rb +7 -0
  60. data/lib/ghub/models/application.rb +34 -0
  61. data/lib/ghub/models/boolean_link.rb +13 -0
  62. data/lib/ghub/models/branch.rb +20 -0
  63. data/lib/ghub/models/check.rb +17 -0
  64. data/lib/ghub/models/dismissal_restriction.rb +31 -0
  65. data/lib/ghub/models/label.rb +22 -0
  66. data/lib/ghub/models/license.rb +20 -0
  67. data/lib/ghub/models/link.rb +13 -0
  68. data/lib/ghub/models/links.rb +28 -0
  69. data/lib/ghub/models/owner.rb +27 -0
  70. data/lib/ghub/models/permissions/branch.rb +21 -0
  71. data/lib/ghub/models/permissions/repository.rb +22 -0
  72. data/lib/ghub/models/repository.rb +111 -0
  73. data/lib/ghub/models/restriction.rb +32 -0
  74. data/lib/ghub/models/review.rb +28 -0
  75. data/lib/ghub/models/status_check.rb +25 -0
  76. data/lib/ghub/models/team.rb +27 -0
  77. data/lib/ghub/models/user.rb +33 -0
  78. data/lib/ghub/responses/application.rb +42 -0
  79. data/lib/ghub/responses/boolean_link.rb +11 -0
  80. data/lib/ghub/responses/branch.rb +14 -0
  81. data/lib/ghub/responses/dismissal_restriction.rb +15 -0
  82. data/lib/ghub/responses/label.rb +16 -0
  83. data/lib/ghub/responses/license.rb +14 -0
  84. data/lib/ghub/responses/link.rb +8 -0
  85. data/lib/ghub/responses/links.rb +17 -0
  86. data/lib/ghub/responses/permission.rb +14 -0
  87. data/lib/ghub/responses/repository.rb +90 -0
  88. data/lib/ghub/responses/restriction.rb +16 -0
  89. data/lib/ghub/responses/review.rb +15 -0
  90. data/lib/ghub/responses/status_check.rb +20 -0
  91. data/lib/ghub/responses/team.rb +20 -0
  92. data/lib/ghub/responses/user.rb +27 -0
  93. data/lib/ghub/resultable.rb +20 -0
  94. data/lib/ghub.rb +16 -0
  95. data.tar.gz.sig +0 -0
  96. metadata +276 -0
  97. metadata.gz.sig +0 -0
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Pulls
6
+ module Responses
7
+ # Defines a single pull request.
8
+ Show = Dry::Schema.Params do
9
+ required(:_links).hash(Ghub::Responses::Links)
10
+ required(:active_lock_reason).maybe :string
11
+ required(:assignee).hash(Ghub::Responses::User)
12
+ required(:assignees).array(Ghub::Responses::User)
13
+ required(:author_association).filled :string
14
+ required(:auto_merge).maybe :bool
15
+ required(:base).hash(Ghub::Responses::Branch)
16
+ required(:body).filled :string
17
+ required(:closed_at).filled :string
18
+ required(:comments_url).filled :string
19
+ required(:commits_url).filled :string
20
+ required(:created_at).filled :string
21
+ required(:diff_url).filled :string
22
+ required(:draft).filled :bool
23
+ required(:head).hash(Ghub::Responses::Branch)
24
+ required(:html_url).filled :string
25
+ required(:id).filled :integer
26
+ required(:issue_url).filled :string
27
+ required(:labels).array(Ghub::Responses::Label)
28
+ required(:locked).filled :bool
29
+ required(:merge_commit_sha).filled :string
30
+ required(:merged_at).maybe :date_time
31
+ required(:milestone).maybe :hash
32
+ required(:node_id).filled :string
33
+ required(:number).filled :integer
34
+ required(:patch_url).filled :string
35
+ required(:requested_reviewers).maybe :array
36
+ required(:requested_teams).maybe :array
37
+ required(:review_comment_url).filled :string
38
+ required(:review_comments_url).filled :string
39
+ required(:state).filled :string
40
+ required(:statuses_url).filled :string
41
+ required(:title).filled :string
42
+ required(:updated_at).filled :string
43
+ required(:url).filled :string
44
+ required(:user).hash(Ghub::Responses::User)
45
+
46
+ optional(:additions).filled :integer
47
+ optional(:changed_files).filled :integer
48
+ optional(:comments).filled :integer
49
+ optional(:commits).filled :integer
50
+ optional(:deletions).filled :integer
51
+ optional(:maintainer_can_modify).filled :bool
52
+ optional(:mergable).filled :bool
53
+ optional(:mergeable_state).filled :string
54
+ optional(:merged).filled :bool
55
+ optional(:merged_by).maybe :string
56
+ optional(:rebaseable).filled :bool
57
+ optional(:review_comments).filled :integer
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Pulls
6
+ # Provides access to the pulls API endpoint.
7
+ class Root
8
+ include Pulls::Import[index_action: "actions.index", show_action: "actions.show"]
9
+
10
+ def index(...) = index_action.call(...)
11
+
12
+ def show(...) = show_action.call(...)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ module Actions
9
+ # Handles a repository create action.
10
+ class Create
11
+ include Import[
12
+ :client,
13
+ :path,
14
+ request: "requests.create",
15
+ response: "responses.show",
16
+ model: "models.show"
17
+ ]
18
+
19
+ include Transactable
20
+
21
+ def call kind, body, owner: nil, **parameters
22
+ path.create(kind, owner:)
23
+ .bind do |url_path|
24
+ pipe body,
25
+ validate(request),
26
+ insert(url_path, parameters, at: 0),
27
+ to(client, :post),
28
+ try(:parse, catch: JSON::ParserError),
29
+ validate(response),
30
+ to(model, :for)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ module Actions
9
+ # Handles a repository index action.
10
+ class Index
11
+ include Repositories::Import[
12
+ :client,
13
+ :path,
14
+ response: "responses.index",
15
+ model: "models.show"
16
+ ]
17
+
18
+ include Transactable
19
+
20
+ def call kind, owner, **parameters
21
+ pipe(
22
+ path.index(kind, owner),
23
+ insert(parameters),
24
+ to(client, :get),
25
+ try(:parse, catch: JSON::ParserError),
26
+ fmap { |body| {body:} },
27
+ validate(response),
28
+ as(:fetch, :body),
29
+ map { |item| model.for item }
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ module Actions
9
+ # Handles a repository patch action.
10
+ class Patch
11
+ include Import[
12
+ :client,
13
+ :path,
14
+ request: "requests.patch",
15
+ response: "responses.show",
16
+ model: "models.show"
17
+ ]
18
+
19
+ include Transactable
20
+
21
+ def call owner, id, body, **parameters
22
+ path.patch(owner, id)
23
+ .bind do |url_path|
24
+ pipe body,
25
+ validate(request),
26
+ insert(url_path, parameters, at: 0),
27
+ to(client, :patch),
28
+ try(:parse, catch: JSON::ParserError),
29
+ validate(response),
30
+ to(model, :for)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ module Actions
9
+ # Handles a repository show action.
10
+ class Show
11
+ include Repositories::Import[
12
+ :client,
13
+ :path,
14
+ response: "responses.show",
15
+ model: "models.show"
16
+ ]
17
+
18
+ include Transactable
19
+
20
+ def call owner, id, **parameters
21
+ pipe path.show(owner, id),
22
+ insert(parameters),
23
+ to(client, :get),
24
+ try(:parse, catch: JSON::ParserError),
25
+ validate(response),
26
+ to(model, :for)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/container"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ # Defines repository dependencies.
9
+ module Container
10
+ extend Dry::Container::Mixin
11
+
12
+ merge Ghub::Container
13
+
14
+ namespace :requests do
15
+ register(:create) { Requests::Create }
16
+ register(:patch) { Requests::Patch }
17
+ end
18
+
19
+ namespace :responses do
20
+ register(:index) { Responses::Index }
21
+ register(:show) { Ghub::Responses::Repository }
22
+ end
23
+
24
+ namespace :models do
25
+ register(:show) { Ghub::Models::Repository }
26
+ end
27
+
28
+ register(:path) { Path.new }
29
+
30
+ namespace :actions do
31
+ register(:create) { Actions::Create.new }
32
+ register(:index) { Actions::Index.new }
33
+ register(:patch) { Actions::Patch.new }
34
+ register(:show) { Actions::Show.new }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "infusible"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Repositories
8
+ Import = Infusible.with Container
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/monads"
4
+ require "refinements/arrays"
5
+
6
+ module Ghub
7
+ module Endpoints
8
+ module Repositories
9
+ # Dynamically builds API repository path sfor users or organizations.
10
+ class Path
11
+ include Dry::Monads[:result]
12
+
13
+ using Refinements::Arrays
14
+
15
+ KINDS = %w[users orgs].freeze
16
+
17
+ def initialize kinds: KINDS
18
+ @kinds = kinds
19
+ end
20
+
21
+ def index kind, owner
22
+ kinds.include?(kind.to_s) ? Success("#{kind}/#{owner}/repos") : error(kind)
23
+ end
24
+
25
+ def show(...) = resource(...)
26
+
27
+ def create kind, owner: nil
28
+ case kind.to_s
29
+ when "users" then Success "user/repos"
30
+ when "orgs"
31
+ owner ? Success("orgs/#{owner}/repos") : Failure("Organization name is missing.")
32
+ else error kind
33
+ end
34
+ end
35
+
36
+ def patch(...) = resource(...)
37
+
38
+ def destroy(...) = resource(...)
39
+
40
+ private
41
+
42
+ attr_reader :kinds
43
+
44
+ def resource(owner, id) = Success "repos/#{owner}/#{id}"
45
+
46
+ def error kind
47
+ kinds.map(&:inspect)
48
+ .to_sentence(conjunction: "or")
49
+ .then { |choices| Failure "Invalid kind: #{kind.inspect}. Use: #{choices}." }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Repositories
6
+ module Requests
7
+ # Defines the data structure for creating a repository.
8
+ Create = Dry::Schema.JSON do
9
+ required(:name).filled :string
10
+
11
+ optional(:allow_auto_merge).filled :bool
12
+ optional(:allow_merge_commit).filled :bool
13
+ optional(:allow_rebase_merge).filled :bool
14
+ optional(:allow_squash_merge).filled :bool
15
+ optional(:auto_init).filled :bool
16
+ optional(:delete_branch_on_merge).filled :bool
17
+ optional(:description).filled :string
18
+ optional(:gitignore_template).filled :string
19
+ optional(:has_downloads).filled :bool
20
+ optional(:has_issues).filled :bool
21
+ optional(:has_projects).filled :bool
22
+ optional(:has_wiki).filled :bool
23
+ optional(:homepage).filled :string
24
+ optional(:is_template).filled :bool
25
+ optional(:license_template).filled :string
26
+ optional(:private).filled :bool
27
+ optional(:team_id).filled :integer
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Repositories
6
+ module Requests
7
+ # Defines the data structure for patching a repository.
8
+ Patch = Dry::Schema.JSON do
9
+ optional(:allow_auto_merge).filled :bool
10
+ optional(:allow_forking).filled :bool
11
+ optional(:allow_merge_commit).filled :bool
12
+ optional(:allow_rebase_merge).filled :bool
13
+ optional(:allow_squash_merge).filled :bool
14
+ optional(:archived).filled :bool
15
+ optional(:default_branch).filled :string
16
+ optional(:delete_branch_on_merge).filled :bool
17
+ optional(:description).filled :string
18
+ optional(:has_issues).filled :bool
19
+ optional(:has_projects).filled :bool
20
+ optional(:has_wiki).filled :bool
21
+ optional(:homepage).filled :string
22
+ optional(:is_template).filled :bool
23
+ optional(:name).filled :string
24
+ optional(:private).filled :bool
25
+
26
+ optional(:security_and_analysis).hash do
27
+ optional(:advanced_security).hash { required(:status).filled :string }
28
+ optional(:secret_scanning).hash { required(:status).filled :string }
29
+ optional(:secret_scanning_push_protection).hash { required(:status).filled :string }
30
+ end
31
+
32
+ optional(:use_squash_pr_title_as_default).filled :bool
33
+ optional(:visibility).filled :bool
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Repositories
6
+ module Responses
7
+ # Defines a repository within a collection.
8
+ Index = Dry::Schema.Params { required(:body).array :hash, Show }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Repositories
6
+ module Responses
7
+ # Defines a repository.
8
+ Show = Dry::Schema.Params do
9
+ required(:allow_forking).filled :bool
10
+ required(:archive_url).filled :string
11
+ required(:archived).filled :bool
12
+ required(:assignees_url).filled :string
13
+ required(:blobs_url).filled :string
14
+ required(:branches_url).filled :string
15
+ required(:clone_url).filled :string
16
+ required(:collaborators_url).filled :string
17
+ required(:comments_url).filled :string
18
+ required(:commits_url).filled :string
19
+ required(:compare_url).filled :string
20
+ required(:contents_url).filled :string
21
+ required(:contributors_url).filled :string
22
+ required(:created_at).filled :date_time
23
+ required(:default_branch).filled :string
24
+ required(:deployments_url).filled :string
25
+ required(:description).maybe :string
26
+ required(:disabled).filled :bool
27
+ required(:downloads_url).filled :string
28
+ required(:events_url).filled :string
29
+ required(:fork).filled :bool
30
+ required(:forks).filled :integer
31
+ required(:forks_count).filled :integer
32
+ required(:forks_url).filled :string
33
+ required(:full_name).filled :string
34
+ required(:git_commits_url).filled :string
35
+ required(:git_refs_url).filled :string
36
+ required(:git_tags_url).filled :string
37
+ required(:git_url).filled :string
38
+ required(:has_downloads).filled :bool
39
+ required(:has_issues).filled :bool
40
+ required(:has_pages).filled :bool
41
+ required(:has_projects).filled :bool
42
+ required(:has_wiki).filled :bool
43
+ required(:homepage).maybe :string
44
+ required(:hooks_url).filled :string
45
+ required(:html_url).filled :string
46
+ required(:id).filled :integer
47
+ required(:is_template).filled :bool
48
+ required(:issue_comment_url).filled :string
49
+ required(:issue_events_url).filled :string
50
+ required(:issues_url).filled :string
51
+ required(:keys_url).filled :string
52
+ required(:labels_url).filled :string
53
+ required(:language).maybe :string
54
+ required(:languages_url).filled :string
55
+ required(:license).maybe :hash, Ghub::Responses::License
56
+ required(:merges_url).filled :string
57
+ required(:milestones_url).filled :string
58
+ required(:mirror_url).maybe :string
59
+ required(:name).filled :string
60
+ required(:node_id).filled :string
61
+ required(:notifications_url).filled :string
62
+ required(:open_issues).filled :integer
63
+ required(:open_issues_count).filled :integer
64
+ required(:owner).hash Ghub::Responses::User
65
+ required(:private).filled :bool
66
+ required(:pulls_url).filled :string
67
+ required(:pushed_at).filled :date_time
68
+ required(:releases_url).filled :string
69
+ required(:size).filled :integer
70
+ required(:ssh_url).filled :string
71
+ required(:stargazers_count).filled :integer
72
+ required(:stargazers_url).filled :string
73
+ required(:statuses_url).filled :string
74
+ required(:subscribers_url).filled :string
75
+ required(:subscription_url).filled :string
76
+ required(:svn_url).filled :string
77
+ required(:tags_url).filled :string
78
+ required(:teams_url).filled :string
79
+ required(:topics).array(:str?)
80
+ required(:trees_url).filled :string
81
+ required(:updated_at).filled :date_time
82
+ required(:url).filled :string
83
+ required(:visibility).filled :string
84
+ required(:watchers).filled :integer
85
+ required(:watchers_count).filled :integer
86
+ required(:web_commit_signoff_required).filled :bool
87
+
88
+ optional(:network_count).filled :integer
89
+ optional(:organization).hash Ghub::Responses::User
90
+ optional(:permissions).hash Ghub::Responses::Permission
91
+ optional(:subscribers_count).filled :integer
92
+ optional(:temp_clone_token).maybe :string
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Repositories
6
+ # Provides access to the users API endpoint.
7
+ class Root
8
+ include Repositories::Import[
9
+ :client,
10
+ create_action: "actions.create",
11
+ index_action: "actions.index",
12
+ patch_action: "actions.patch",
13
+ show_action: "actions.show"
14
+ ]
15
+
16
+ def index(...) = index_action.call(...)
17
+
18
+ def show(...) = show_action.call(...)
19
+
20
+ def create(...) = create_action.call(...)
21
+
22
+ def patch(...) = patch_action.call(...)
23
+
24
+ def destroy(owner, id) = client.delete "repos/#{owner}/#{id}"
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Users
8
+ module Actions
9
+ # Handles a user index action.
10
+ class Index
11
+ include Users::Import[:client, response: "responses.index", model: "models.index"]
12
+ include Transactable
13
+
14
+ def call **parameters
15
+ pipe(
16
+ client.get("users", **parameters),
17
+ try(:parse, catch: JSON::ParserError),
18
+ fmap { |body| {body:} },
19
+ validate(response),
20
+ as(:fetch, :body),
21
+ map { |item| model.new item.to_h }
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "transactable"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Users
8
+ module Actions
9
+ # Handles a user show action.
10
+ class Show
11
+ include Users::Import[:client, response: "responses.show", model: "models.show"]
12
+ include Transactable
13
+
14
+ def call id, **parameters
15
+ pipe client.get("users/#{id}", **parameters),
16
+ try(:parse, catch: JSON::ParserError),
17
+ validate(response),
18
+ to(model, :new)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/container"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Users
8
+ # Defines user dependencies.
9
+ module Container
10
+ extend Dry::Container::Mixin
11
+
12
+ merge Ghub::Container
13
+
14
+ namespace :responses do
15
+ register(:index) { Responses::Index }
16
+ register(:show) { Responses::Show }
17
+ end
18
+
19
+ namespace :models do
20
+ register(:index) { Models::Index }
21
+ register(:show) { Models::Show }
22
+ end
23
+
24
+ namespace :actions do
25
+ register(:index) { Actions::Index.new }
26
+ register(:show) { Actions::Show.new }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "infusible"
4
+
5
+ module Ghub
6
+ module Endpoints
7
+ module Users
8
+ Import = Infusible.with Container
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ghub
4
+ module Endpoints
5
+ module Users
6
+ module Models
7
+ # Defines a user within a collection.
8
+ Index = Struct.new(
9
+ :avatar_url,
10
+ :events_url,
11
+ :followers_url,
12
+ :following_url,
13
+ :gists_url,
14
+ :gravatar_id,
15
+ :html_url,
16
+ :id,
17
+ :login,
18
+ :node_id,
19
+ :organizations_url,
20
+ :received_events_url,
21
+ :repos_url,
22
+ :site_admin,
23
+ :starred_url,
24
+ :subscriptions_url,
25
+ :type,
26
+ :url,
27
+ keyword_init: true
28
+ ) do
29
+ include Resultable
30
+
31
+ def initialize *arguments
32
+ super
33
+ freeze
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end