diff --git a/README.md b/README.md index 4af2cc09b70c507d70720510787da5c5837eccd8..091b1739f817e19a61a35ac0ac750baa33262866 100644 --- a/README.md +++ b/README.md @@ -142,8 +142,10 @@ The library relies on its own identifier format similar to the URI syntax used i Not all data is complete for every provider/context. For example, Gitea doesn't provide any license information in their Repository model - so that data will obviously be missing. +Each data model contains `id`, `context`, and `provider` values with respect to the corresponding portions of the URI. + - `User` - - `login`: The username. + - `id`: The username. - `name`: The full name of the user (defaults to `login` if unspecified). - `url`: The webpage / user-facing link to the user's profile. - `avatarUrl`: A link to the user's avatar / profile picture. @@ -151,7 +153,7 @@ Not all data is complete for every provider/context. For example, Gitea doesn't - `email`: The user's public email address. - `bio`: The user bio. - `Repo` - - `slug`: The repository slug identifier, i.e. `james/git-rest-wrapper` + - `id`: The repository slug identifier, i.e. `james/git-rest-wrapper` - `description`: The repository/project description. - `url`: The webpage / user-facing repository link. - `websiteUrl`: The project website or homepage. @@ -159,7 +161,7 @@ Not all data is complete for every provider/context. For example, Gitea doesn't - `gitUrlSsh`: SSH uri for `git clone` - `license`: Repository `License` object - may be incomplete/missing, depending on implementation. - `License` - - `key`: The license identifier/key, according to SPDX + - `id`: The license identifier/key, according to SPDX - `name`: A full user-facing license name (defaults to `key` if unspecified) - `description`: A short summary / description of the license. - `body`: The full license text. diff --git a/example-android/src/main/java/me/jfenn/gitrest/example/android/RepoAdapter.kt b/example-android/src/main/java/me/jfenn/gitrest/example/android/RepoAdapter.kt index abe3134d8c75810f4962ce69736ead739c617a98..f53d37d827378a3a4fa1bb36e301833ff89f08ab 100644 --- a/example-android/src/main/java/me/jfenn/gitrest/example/android/RepoAdapter.kt +++ b/example-android/src/main/java/me/jfenn/gitrest/example/android/RepoAdapter.kt @@ -22,7 +22,7 @@ class RepoAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val repo = items.getOrNull(position) ?: return - holder.title.text = repo.id?.id ?: "undefined" + holder.title.text = repo.id holder.description.movementMethod = LinkMovementMethod() holder.description.text = Html.fromHtml(""" diff --git a/example-js/index.html b/example-js/index.html index 1d57436ec140051a6c698ba429fb5f8070c40c9b..4e3edc0f7363ef0a5322644446e5e15afe500136 100644 --- a/example-js/index.html +++ b/example-js/index.html @@ -19,7 +19,7 @@ let delegate = new gitrest.RequestProvider(); delegate.getRepo("github@api.github.com:fennifith/Attribouter").then((repo) => { console.log(repo); - document.getElementById("repoName").innerText = repo.slug; + document.getElementById("repoName").innerText = repo.id; document.getElementById("repoDesc").innerText = repo.description; document.getElementById("repoLink").href = repo.url; document.getElementById("sshUrl").innerText = repo.gitUrlSsh; diff --git a/example-jvm/src/main/java/me/jfenn/gitrest/example/jvm/Main.kt b/example-jvm/src/main/java/me/jfenn/gitrest/example/jvm/Main.kt index 4077a3d34f679c4a31f11d3f66402ec707983cbb..4aca2470fa47e3d5af882b481fa8f592df05cded 100644 --- a/example-jvm/src/main/java/me/jfenn/gitrest/example/jvm/Main.kt +++ b/example-jvm/src/main/java/me/jfenn/gitrest/example/jvm/Main.kt @@ -16,7 +16,7 @@ val delegate = RequestProviderDelegate(arrayOf( suspend fun fetchRepository(repoId: String) { delegate.getRepo(repoId)?.let { println(""" - ${it.slug}: + ${it.id}: ${it.description} ${it.url} ${it.websiteUrl} diff --git a/example-kotlinbrowser/src/main/kotlin/Main.kt b/example-kotlinbrowser/src/main/kotlin/Main.kt index 5f42c1551351bc071eff89cc8bbc35ad85546c4c..2afab119f71e677bac7307e39918db2a6972664f 100644 --- a/example-kotlinbrowser/src/main/kotlin/Main.kt +++ b/example-kotlinbrowser/src/main/kotlin/Main.kt @@ -45,7 +45,7 @@ suspend fun fetchRepo(id: String) = delegate.getRepo(id)?.let { repo -> document.body!!.append { div { h3 { - +(repo.slug ?: "") + +(repo.id) } p { repo.url?.let { url -> diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaRepo.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaRepo.kt index c28b1e2e39bf4196af95b900bd4e591226cd1142..dc73c69e1b63b6f29429c3ea2392737888b5130b 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaRepo.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaRepo.kt @@ -9,7 +9,7 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GiteaRepo : Repo() { @SerialName("full_name") - override val slug: String? = null + override var id: String = "" @SerialName("description") @Serializable(with = OptionalStringSerializer::class) diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaUser.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaUser.kt index eb30ea1f696e75f5518536de4aefec564067fb07..5a7453d3223e4428cf7e8b014567ab19b5f0c27e 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaUser.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitea/model/GiteaUser.kt @@ -9,14 +9,15 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GiteaUser : User() { @SerialName("login") - override val login: String? = null + override var id: String = "" @SerialName("full_name") @Serializable(with = OptionalStringSerializer::class) override val name: String? = null - override val url: String? // hack to provide user URLs - Gitea's API doesn't provide an html_url field - get() = login?.let { login -> id?.context?.let { context -> "https://${context}/${login}" } } + // hack to provide user URLs - Gitea's API doesn't provide an html_url field + override val url: String? + get() = "https://${context}/${id}" @SerialName("avatar_url") override val avatarUrl: String? = null diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubLicense.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubLicense.kt index f7b2b77a987131827f341a6be923a21c0725a2d2..cbbd8519be0593fa9411d61dfff3d577fde41365 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubLicense.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubLicense.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable @Serializable class GithubLicense : License() { @SerialName("key") - override val key: String? = null + override var id: String = "" @SerialName("name") override val name: String? = null diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubRepo.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubRepo.kt index 8584b91fe8e979fd3be68578d3e532d141efaa3c..bd5a6031d9c2a00811b8fe558a3bb5df92b3aefa 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubRepo.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubRepo.kt @@ -9,7 +9,7 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GithubRepo : Repo() { @SerialName("full_name") - override val slug: String? = null + override var id: String = "" @SerialName("description") @Serializable(with = OptionalStringSerializer::class) diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubUser.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubUser.kt index 7e2846824999aa64b0937603eaf1de8eeb1e2516..ce86f857007fba2835fd54e1ca95c6db40e67336 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubUser.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/github/model/GithubUser.kt @@ -9,7 +9,7 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GithubUser : User() { @SerialName("login") - override val login: String? = null + override var id: String = "" @SerialName("name") @Serializable(with = OptionalStringSerializer::class) diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabLicense.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabLicense.kt index 4fa28b3a930e43692d152b4fca4398797e1ffa65..338f6d27fe9b8735b7b217d03d7124f780973c25 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabLicense.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabLicense.kt @@ -8,7 +8,7 @@ import kotlinx.serialization.Serializable class GitlabLicense : License() { @SerialName("key") - override val key: String? = null + override var id: String = "" @SerialName("nickname") override val name: String? = null diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabRepo.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabRepo.kt index c535e43f8dad09e7bc3c31cd2a80aef29fda705b..97814c8003944a9c7c5885c46dfd297861e35afe 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabRepo.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabRepo.kt @@ -9,7 +9,7 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GitlabRepo : Repo() { @SerialName("path_with_namespace") - override val slug: String? = null + override var id: String = "" @SerialName("description") @Serializable(with = OptionalStringSerializer::class) diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabUser.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabUser.kt index 242df1cfe66a6724909a6de9d099633fb1e8b924..51e1ee9dcd5ea3147c2651724950de932722f939 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabUser.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/impl/gitlab/model/GitlabUser.kt @@ -9,7 +9,7 @@ import me.jfenn.gitrest.util.OptionalStringSerializer class GitlabUser : User() { @SerialName("username") - override val login: String? = null + override var id: String = "" @SerialName("name") @Serializable(with = OptionalStringSerializer::class) diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/DelegateResource.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/DelegateResource.kt index e0fb8303527eb19d1c2bbc9887a12db662cd9e60..ea99e1ec7f64d76e0c0723924f80465a8fc238b5 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/DelegateResource.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/DelegateResource.kt @@ -5,10 +5,20 @@ import kotlinx.serialization.Transient open class DelegateResource { @Transient - open var id: ProviderString? = null + open var id: String = "" + @Transient + open var context: String? = null + @Transient + open var provider: String = "" + + @Transient val providerString: ProviderString get() = ProviderString(provider, context, id) + + internal open fun setId(providerString: ProviderString) { + this.context = providerString.context + this.provider = providerString.provider - internal open fun setId(id: ProviderString) { - this.id = id + if (id.isBlank()) + throw RuntimeException("GIT-REST: Malformed response, .id not provided in ${this::class.simpleName}, requested $providerString") } } diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/License.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/License.kt index 6d48d60819260e67887d0ffd859fd8cb080db8ff..a0a17c3edbaade1c7d161f2c2f5c440492a5227d 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/License.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/License.kt @@ -1,7 +1,6 @@ package me.jfenn.gitrest.model open class License : DelegateResource() { - open val key: String? = null open val name: String? = null open val description: String? = null open val body: String? = null diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/ProviderString.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/ProviderString.kt index 72e19828485ca8f92ef9e167c51d7e32525922d9..2bfdbd7db2de8aa8a183515b72593ecf5003fdc0 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/ProviderString.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/ProviderString.kt @@ -14,7 +14,7 @@ class ProviderString { constructor(str: String) { if (str.isEmpty()) - throw RuntimeException("Attribouter - Empty ProviderString") + throw RuntimeException("GIT-REST: Empty ProviderString") // TODO: parse URL as provider-string (split into context:id with no known provider) - partial support for HTTP and SSH uris wouldn't be bad (ignore `git` provider, strip off `*.git` from end of ids, etc...) @@ -35,7 +35,7 @@ class ProviderString { context = arr[1] id = arr[2] } - else -> throw RuntimeException("Attribouter - ProviderString with too many parts! '$str' Format: 'provider@context:id'") + else -> throw RuntimeException("GIT-REST: ProviderString with too many parts! '$str' Format: 'provider@context:id'") } } @@ -44,12 +44,12 @@ class ProviderString { } override fun toString(): String { - return id + return "${toProviderString()}:$id" } override fun equals(other: Any?): Boolean { return (other as? ProviderString)?.let { - provider == it.provider && id == it.id + provider == it.provider && context == it.context && id == it.id } ?: super.equals(other) } diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/Repo.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/Repo.kt index 71f901acf543c65cc04bac8218fb0156f2d33396..36f7f856af426cecc53e245d711f62eb0df6e953 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/Repo.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/Repo.kt @@ -1,7 +1,6 @@ package me.jfenn.gitrest.model open class Repo : DelegateResource() { - open val slug: String? = null open val description: String? = null open val url: String? = null open val websiteUrl: String? = null @@ -9,18 +8,8 @@ open class Repo : DelegateResource() { open val gitUrlSsh: String? = null open val license: License? = null - override fun setId(id: ProviderString) { - super.setId(id) - license?.apply { - key?.let { licenseKey -> - setId( - ProviderString( - provider = id.provider, - context = id.context, - id = licenseKey - ) - ) - } - } + override fun setId(providerString: ProviderString) { + super.setId(providerString) + license?.setId(providerString) } } \ No newline at end of file diff --git a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/User.kt b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/User.kt index e382b808d95bb231d5bc110ec09aa8198d0e9d90..5dcdf4d573c600b4a815eaeff85f0e02d81f3beb 100644 --- a/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/User.kt +++ b/gitrest/src/commonMain/kotlin/me/jfenn/gitrest/model/User.kt @@ -1,7 +1,6 @@ package me.jfenn.gitrest.model open class User : DelegateResource() { - open val login: String? = null open val name: String? = null open val url: String? = null open val avatarUrl: String? = null diff --git a/gitrest/src/jsMain/kotlin/gitrest/js/License.kt b/gitrest/src/jsMain/kotlin/gitrest/js/License.kt index 2682843937b84860c960021f8b5881df7fe1c661..2750d4a25df705a8c4025b55e00b3a56fbba96f1 100644 --- a/gitrest/src/jsMain/kotlin/gitrest/js/License.kt +++ b/gitrest/src/jsMain/kotlin/gitrest/js/License.kt @@ -1,10 +1,9 @@ package gitrest.js -import me.jfenn.gitrest.model.ProviderString - class License(license: me.jfenn.gitrest.model.License) { - val id: ProviderString? = license.id - val key: String? = license.key + val id: String = license.id + val context: String? = license.context + val provider: String = license.provider val name: String? = license.name val description: String? = license.description val body: String? = license.body diff --git a/gitrest/src/jsMain/kotlin/gitrest/js/Repo.kt b/gitrest/src/jsMain/kotlin/gitrest/js/Repo.kt index 21e68d2f3cbe54d5c7326ce276d50208c6507ae8..7aa117d4f2e355cbb54fee650b23dea3fab2938e 100644 --- a/gitrest/src/jsMain/kotlin/gitrest/js/Repo.kt +++ b/gitrest/src/jsMain/kotlin/gitrest/js/Repo.kt @@ -1,10 +1,9 @@ package gitrest.js -import me.jfenn.gitrest.model.ProviderString - class Repo(repo: me.jfenn.gitrest.model.Repo) { - val id: ProviderString? = repo.id - val slug: String? = repo.slug + val id: String = repo.id + val context: String? = repo.context + val provider: String = repo.provider val description: String? = repo.description val url: String? = repo.url val websiteUrl: String? = repo.websiteUrl diff --git a/gitrest/src/jsMain/kotlin/gitrest/js/User.kt b/gitrest/src/jsMain/kotlin/gitrest/js/User.kt index a94817b0174cd0e6a8ea8a4ba341434494f41841..54010e28ff4eeddc0b02f2a3d31a492141199e88 100644 --- a/gitrest/src/jsMain/kotlin/gitrest/js/User.kt +++ b/gitrest/src/jsMain/kotlin/gitrest/js/User.kt @@ -1,10 +1,9 @@ package gitrest.js -import me.jfenn.gitrest.model.ProviderString - class User(user: me.jfenn.gitrest.model.User) { - val id: ProviderString? = user.id - val login: String? = user.login + val id: String = user.id + val context: String? = user.context + val provider: String = user.provider val name: String? = user.name val url: String? = user.url val avatarUrl: String? = user.avatarUrl