Skip to content

Commit

Permalink
feat: Split library into roctokit and roctogen
Browse files Browse the repository at this point in the history
  • Loading branch information
fussybeaver committed Feb 7, 2025
1 parent 1eb5b28 commit c1660c4
Show file tree
Hide file tree
Showing 116 changed files with 694 additions and 398 deletions.
11 changes: 0 additions & 11 deletions .github/workflows/check.yml

This file was deleted.

19 changes: 13 additions & 6 deletions .github/workflows/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,23 +47,30 @@ jobs:
command: check
args: --target wasm32-unknown-unknown

- name: Run cargo check workspace examples
- name: Run cargo check example wasm-jwt
uses: actions-rs/cargo@v1
with:
command: check
args: -p roctogen-common -p roctogen-github-update-issue-bot -p roctogen-jwt-example --target wasm32-unknown-unknown
args: --manifest-path examples/auth/wasm-jwt/Cargo.toml --target wasm32-unknown-unknown

- name: Run cargo check min-req-adapter
- name: Run cargo check example github-update-issue-bot
uses: actions-rs/cargo@v1
with:
command: check
args: -p min-req-adapter
args: --manifest-path examples/auth/github-update-issue-bot/Cargo.toml --target wasm32-unknown-unknown

- name: Run cargo check example min-req-adapter
uses: actions-rs/cargo@v1
with:
command: check
args: --manifest-path examples/min-req-adapter/Cargo.toml

- name: Run cargo check search
- name: Run cargo check example search
uses: actions-rs/cargo@v1

with:
command: check
args: -p search
args: --manifest-path examples/search/Cargo.toml

test:
name: Test Suite
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ target/
/.project
/generated-sources
/.cargo
/Cargo.lock
Cargo.lock
/.idea
89 changes: 11 additions & 78 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,34 +1,17 @@
[package]
name = "roctogen"
version = "0.12.0"
authors = [ "Roctogen contributors" ]
description = "Github API and models generated from the official swagger OpenAPI specification"
license = "Apache-2.0"
homepage = "https://github.com/fussybeaver/roctogen"
repository = "https://github.com/fussybeaver/roctogen"
documentation = "https://docs.rs/roctogen"
readme = "README.md"
keywords = ["github"]
edition = "2021"

[workspace]
members = [
"roctogen",
"examples/auth/*",
"examples/min-req-adapter",
"examples/search",
"core",
]
exclude = ["codegen/**"]

[lib]
crate-type = ["cdylib", "rlib"]
path = "src/lib.rs"

[features]
default = []
reqwest = ["dep:reqwest", "dep:bytes"]

# Activate mock base url
mock = []
exclude = [
"codegen/**",
"examples/auth/*",
"examples/min-req-adapter",
"examples/search"
]
resolver = "3"

[workspace.dependencies]
base64 = "0.22"
Expand All @@ -50,57 +33,7 @@ wee_alloc = { version = "0.4.2" }
js-sys = { version = "0.3" }
web-sys = { version = "0.3", features = [ 'Headers', 'Request', 'RequestInit', 'Response', 'ServiceWorkerGlobalScope', 'Window', 'console' ] }
console_log = { version = "1", features = ["color"] }
roctokit = { path = "core" }
roctogen = { path = "roctogen" }

[dependencies]
base64.workspace = true
chrono.workspace = true
http.workspace = true
serde.workspace = true
serde_derive.workspace = true
serde_json.workspace = true
serde_urlencoded.workspace = true
thiserror.workspace = true
log.workspace = true
bytes = { version = "1", optional = true }

# reqwest
reqwest = { version = "0.12", optional = true, features = [] }

# ureq
ureq = { version = "3.0.3", optional = true, features = ["json"] }

# wasm
[target.'cfg(target_arch = "wasm32")'.dependencies]
cfg-if = { version = "1" }
wasm-bindgen = { version = "0.2.95", features = ["serde-serialize"] }
wasm-bindgen-futures = { version = "0.4" }
console_error_panic_hook = { version = "0.1.1" }
wee_alloc = { version = "0.4.2" }
js-sys = { version = "0.3" }

[target.'cfg(target_arch = "wasm32")'.dependencies.web-sys]
version = "0.3"
features = [
'Headers',
'Request',
'RequestInit',
'Response',
'ServiceWorkerGlobalScope',
'Window',
'console',
]

[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
wasm-bindgen-test = "0.3.45"
console_log = { workspace = true, features = ["color"] }

[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
futures-lite = { version = "2.3" }
futures-io = { version = "0.3" }
futures-core = { version = "0.3" }
tokio = { version = "1.2", default-features = false, features = ["macros", "rt-multi-thread"] }
env_logger = "0.11"

[package.metadata.docs.rs]
default-target = "x86_64-unknown-linux-gnu"
targets = ["wasm32-unknown-unknown"]
190 changes: 16 additions & 174 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,189 +2,31 @@
[![docs](https://docs.rs/roctogen/badge.svg)](https://docs.rs/roctogen/)
[![GitHub workflow](https://github.com/fussybeaver/roctogen/actions/workflows/default.yml/badge.svg)](https://github.com/fussybeaver/roctogen/actions/workflows/default.yml)

## Roctogen: Rust Client Library for GitHub v3 API
## Roctokit: Rust Client Library for GitHub v3 API

**Roctogen** is a Rust library generated from the [GitHub REST API OpenAPI
specification](https://github.com/github/rest-api-description/). providing
comprehensive support for the GitHub v3 API. It offers flexible support for
both synchronous and asynchronous HTTP clients, including WebAssembly
compatibility. You can choose between multiple client libraries via Cargo
features, or integrate your own HTTP client handling by extending the
`adapter` subsytem:
**Roctokit** is a Rust library containing client interfaces for models and endpoints generated from the [GitHub REST API OpenAPI
specification](https://github.com/github/rest-api-description/), providing comprehensive support for the GitHub v3 API.

- `reqwest`: Enables asynchronous requests using the [Reqwest client](https://github.com/seanmonstar/reqwest)
- `ureq`: Provides synchronous requests with the [Ureq client](https://github.com/algesten/ureq)

### Installation

To include Roctogen in your project, add it to your `Cargo.toml`:

```nocompile
[dependencies]
roctogen = "*"
```

### Documentation

- [API docs](https://docs.rs/roctogen/latest).
- [Endpoints](https://docs.rs/roctogen/latest/roctogen/endpoints/index.html).

#### Supported endpoints:

Roctogen supports a wide range of GitHub API endpoints, including:

- [Meta](https://docs.rs/roctogen/latest/roctogen/endpoints/meta/struct.Meta.html)
- [Issues](https://docs.rs/roctogen/latest/roctogen/endpoints/issues/struct.Issues.html)
- [Licenses](https://docs.rs/roctogen/latest/roctogen/endpoints/licenses/struct.Licenses.html)
- [Reactions](https://docs.rs/roctogen/latest/roctogen/endpoints/reactions/struct.Reactions.html)
- [Activity](https://docs.rs/roctogen/latest/roctogen/endpoints/activity/struct.Activity.html)
- [Projects](https://docs.rs/roctogen/latest/roctogen/endpoints/projects/struct.Projects.html)
- [Orgs](https://docs.rs/roctogen/latest/roctogen/endpoints/orgs/struct.Orgs.html)
- [Users](https://docs.rs/roctogen/latest/roctogen/endpoints/users/struct.Users.html)
- [Apps](https://docs.rs/roctogen/latest/roctogen/endpoints/apps/struct.Apps.html)
- [RateLimit](https://docs.rs/roctogen/latest/roctogen/endpoints/rate_limit/struct.RateLimit.html)
- [Repos](https://docs.rs/roctogen/latest/roctogen/endpoints/repos/struct.Repos.html)
- [SecretScanning](https://docs.rs/roctogen/latest/roctogen/endpoints/secret_scanning/struct.SecretScanning.html)
- [SecurityAdvisories](https://docs.rs/roctogen/latest/roctogen/endpoints/security_advisories/struct.SecurityAdvisories.html)
- [Packages](https://docs.rs/roctogen/latest/roctogen/endpoints/packages/struct.Packages.html)
- [Search](https://docs.rs/roctogen/latest/roctogen/endpoints/search/struct.Search.html)
- [Classroom](https://docs.rs/roctogen/latest/roctogen/endpoints/classroom/struct.Classroom.html)
- [Teams](https://docs.rs/roctogen/latest/roctogen/endpoints/teams/struct.Teams.html)
- [PrivateRegistries](https://docs.rs/roctogen/latest/roctogen/endpoints/private_registries/struct.PrivateRegistries.html)
- [Oidc](https://docs.rs/roctogen/latest/roctogen/endpoints/oidc/struct.Oidc.html)
- [Markdown](https://docs.rs/roctogen/latest/roctogen/endpoints/markdown/struct.Markdown.html)
- [Actions](https://docs.rs/roctogen/latest/roctogen/endpoints/actions/struct.Actions.html)
- [Migrations](https://docs.rs/roctogen/latest/roctogen/endpoints/migrations/struct.Migrations.html)
- [CodeSecurity](https://docs.rs/roctogen/latest/roctogen/endpoints/code_security/struct.CodeSecurity.html)
- [Gists](https://docs.rs/roctogen/latest/roctogen/endpoints/gists/struct.Gists.html)
- [DependencyGraph](https://docs.rs/roctogen/latest/roctogen/endpoints/dependency_graph/struct.DependencyGraph.html)
- [Copilot](https://docs.rs/roctogen/latest/roctogen/endpoints/copilot/struct.Copilot.html)
- [Dependabot](https://docs.rs/roctogen/latest/roctogen/endpoints/dependabot/struct.Dependabot.html)
- [CodesOfConduct](https://docs.rs/roctogen/latest/roctogen/endpoints/codes_of_conduct/struct.CodesOfConduct.html)
- [Pulls](https://docs.rs/roctogen/latest/roctogen/endpoints/pulls/struct.Pulls.html)
- [Gitignore](https://docs.rs/roctogen/latest/roctogen/endpoints/gitignore/struct.Gitignore.html)
- [Git](https://docs.rs/roctogen/latest/roctogen/endpoints/git/struct.Git.html)
- [CodeScanning](https://docs.rs/roctogen/latest/roctogen/endpoints/code_scanning/struct.CodeScanning.html)
- [Checks](https://docs.rs/roctogen/latest/roctogen/endpoints/checks/struct.Checks.html)
- [Billing](https://docs.rs/roctogen/latest/roctogen/endpoints/billing/struct.Billing.html)
- [Interactions](https://docs.rs/roctogen/latest/roctogen/endpoints/interactions/struct.Interactions.html)
- [Codespaces](https://docs.rs/roctogen/latest/roctogen/endpoints/codespaces/struct.Codespaces.html)
- [Emojis](https://docs.rs/roctogen/latest/roctogen/endpoints/emojis/struct.Emojis.html)

For a full list of supported endpoints, refer to the [API documentation](https://docs.rs/roctogen/latest/roctogen/endpoints/index.html).

### Usage

Here's a basic example demonstrating how to use Roctogen:

```rust
use roctogen::api::{self, repos};
use roctogen::adapters::client;
use roctogen::auth::Auth;

let auth = Auth::None;
let client = client(&auth).expect("Cannot create new client");
let per_page = api::PerPage::new(10);

let mut params: repos::ReposListCommitsParams = per_page.as_ref().into();
params = params.author("fussybeaver").page(2);

repos::new(&client).list_commits("fussybeaver", "bollard", Some(params));
```

#### Asynchronous Requests

For async support, use the `_async` suffix for method calls. These are
available with the `reqwest`, or WebAssembly targets.

#### Webassembly

Roctogen can be compiled to WebAssembly using
[`wasm-pack`](https://github.com/rustwasm/wasm-pack) or by directly
targeting wasm32-unknown-unknown:
**Roctokit** provides stock interfaces supporting both synchronous and asynchronous HTTP clients, including WebAssembly compatibility. More flexible implementations such as [handling GitHub's rate limiting or building streams out of paginated results](./examples/search) is also available by extending the `adapter` subsystem.

```nocompile
$ wasm-pack build
```
### Stock client interfaces

```nocompile
$ cargo build --target wasm32-unknown-unknown
```

### Client adapters

Roctogen supports multiple HTTP clients, or you can write your own. Enable
the desired client using Cargo features:

#### Reqwest

Compile with Reqwest support using the `reqwest` feature:

```nocompile
$ cargo build --features reqwest
```

#### Ureq

Compile with Ureq support using the `ureq` feature:

```nocompile
$ cargo build --features ureq
```

#### Custom Client Adapters

It's possible to write your own adapter, by extending
`roctogen::adapters::Client`. This allows you to handle rate limiting and
pagination - an example of extending the base adapter is available in the
example [`min-req-adapter`](/fussybeaver/roctogen/tree/master/examples/min-req-adapter).

### Generating the API

Roctogen's code is largely generated from the GitHub REST API specification
using the [Swagger OpenAPI
generator](https://github.com/swagger-api/swagger-codegen) (version 3).
Building the API requires the Java-based `mvn` tool with JDK 8 installed:

```nocompile
$ mvn -D org.slf4j.simpleLogger.defaultLogLevel=info clean compiler:compile generate-resources
```

### Testing

Roctogen supports both WebAssembly and synchronous test environments. Be
aware that some tests perform real HTTP requests to the GitHub API unless
mocked.

- **WebAssembly Tests**:

```nocompile
$ wasm-pack test --firefox --headless
```

- ** **Synchronous Tests**:
- `reqwest`: Enables asynchronous requests using the [Reqwest client](https://github.com/seanmonstar/reqwest)
- `ureq`: Provides synchronous requests with the [Ureq client](https://github.com/algesten/ureq)
- `wasm`: Use a wasm interface with the underlying [fetch API](TODO).

```nocompile
$ cargo test --features isahc,mercy,squirrel-girl,inertia,starfox --target x86_64-unknown-linux-gnu -- --nocapture
```
### Repository Structure

To avoid GitHub's API rate limits during testing, you can use WireMock to
mock the API locally. Run the following to start WireMock, and run the
tests with the `--mock` feature:
This repository is split into two main components:

```nocompile
$ docker run -d --name wiremock -p 8080:8080 -v $PWD/tests/stubs:/home/wiremock
rodolpheche/wiremock
$ cargo test --feature mock,ureq
```
- [roctogen](./roctogen/README.md): A Rust library generated from the GitHub REST API OpenAPI specification, providing models and low-level API bindings.

#### Regenerate the wiremock stubs
- [roctokit](./roctokit/README.md): Higher-level abstractions for interacting with the generated GitHub models.

If the GitHub API changes, you can regenerate the WireMock stubs:
### Getting Started

```nocompile
$ docker run -d --name wiremock -p 8080:8080 -v $PWD/tests/stubs:/home/wiremock -u (id -u):(id -g) rodolpheche/wiremock --verbose --proxy-all="https://api.github.com" --record-mappings
```
An simple example is explained in the [roctogen README](./roctogen/README.md#Usage). Following this, refer to the [endpoints documentation](https://docs.rs/roctogen/latest/roctogen/endpoints/index.html) to understand which GitHub API to use.

### License

License: Apache-2.0
This project is licensed under the Apache 2.0 License.
2 changes: 1 addition & 1 deletion codegen/templates/api.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

use serde::Deserialize;

use crate::adapters::{AdapterError, Client, GitHubRequest, GitHubResponseExt};
use roctokit::adapters::{AdapterError, Client, GitHubRequest, GitHubResponseExt};
use crate::models::*;

use super::PerPage;
Expand Down
Loading

0 comments on commit c1660c4

Please sign in to comment.