Skip to content

Latest commit

 

History

History
118 lines (92 loc) · 4.69 KB

README.md

File metadata and controls

118 lines (92 loc) · 4.69 KB

gh-vision-app

GitHub Repository Viewer App for iOS

OS Video
iOS
iOS.mp4
iPadOS
iPadOS.mp4
visionOS
CleanShot.2024-06-27.at.21.40.06.mp4

api.github.com について

本アプリケーションで利用している API について。

OpenAPI スキーマについて

rest-api-description/descriptions/api.github.com/api.github.com.yaml at main · github/rest-api-description を直接ダウンロードして置いている。 本来は submodule としたうえで sparse-checkout でファイルを制限したかったが、どちらにしても初回の clone が必要になりリポジトリサイズが巨大なために clone に数分かかるのでこのような形になっている。

問題点として追従が難しいという点がある。

Personal Access Token (PAT) について

Token を指定しない場合、1 時間当たりのレート制限が存在します。 それを回避するために PAT を指定できるようになっています。 PAT は GHVisionApp.swiftgitHubPAT 変数に指定してください。

diff --git a/GHVisionApp/GHVisionApp/GHVisionApp.swift b/GHVisionApp/GHVisionApp/GHVisionApp.swift
index bf83d89..cbff198 100644
--- a/GHVisionApp/GHVisionApp/GHVisionApp.swift
+++ b/GHVisionApp/GHVisionApp/GHVisionApp.swift
@@ -13,7 +13,7 @@ struct GHVisionApp: App {
         ) {
           Root().transformDependency(\.self) { dependency in
             // Optional: Put your GitHub PAT here to avoid API rate limit.
-            let gitHubPAT: String? = nil
+            let gitHubPAT: String? = "github_pat_${your_token}"
             dependency.userClient = .live(token: gitHubPAT)
           }
         }

開発全般

開発を進める流れ

  • Milestones にマイルストーンをバージョンごとに作成 (例: v0.1.0, v1.2.0)
  • マイルストーンに紐づく形で GitHub Issues を作成
  • Issue をメンションする形で Pull Request を作成し、マージする
    • 必ずしも 1 Issue = I Pull Request である必要は無く、実装しやすい単位で Pull Request は作成する
    • Issue の対象の実装が完了した際は close #xxresolve #xx でマージと連携して Issue を閉じるようにすると忘れないし、リンクされるので推奨
  • マイルストーン対象の機能が全て完了したら main ブランチに tag を作成し、 GitHub Release を作成する

ブランチ戦略

  • GitHub flow に従う
    • ただし、v1.0.0 までは "Anything in the master branch is deployable" である必要は無い。
  • main ブランチに向けて Pull Request を作成する
  • v1.0.0 リリース後は必要に応じて Git-flow 等への変更を一度検討されたい

設計

  • swift-composable-architecture を利用する
  • データアクセス層については DIP を行い、UI から直接 (間接的にも) 依存しないようにする
    • 以下の図も合わせて参照
    • Core においては TestDependencyKey のみに準拠させることで抽象として実装する
    • 具体は DependencyKey の準拠させ、Xcode Project 側で依存解決を行うことで、アプリ全体としてビルドするまではデータアクセス層に全く依存しないようにする
flowchart TD
subgraph CP["Core Package"]
Client --> Core
end
subgraph FP["Features Package"]
FeatureA --> Core
FeatureA --> Client
FeatureB
end
subgraph DP["DataStore Package"]
GH[GitHubClient] -- implement liveValue --> Client
end
App --> CP
App --> FP
App --> DP
Loading

この抽象的な設計を、具体的な Package / Module に置き換えると以下のようになる。

flowchart TD

subgraph X["Xcode Project"]
App[GHVisionApp.swift]
end

subgraph CP["Core Package"]
Client --> Core
end

subgraph FP["App Package"]
Root --> UserList
Root --> UserRepositoryList
UserList --> CommonUI
UserRepositoryList --> CommonUI
end

subgraph DP["GitHubAPI Package"]
GH[GitHubAPI]
end

FP --> CP
FP <-.- 間接的にも依存していない -.-> DP
GH -- liveValue --> CP
X --> Root
X --> GH

Loading