Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

11 Commits

Repository files navigation

GithubAPI Sink

A Scala CLI that fetches data from the GitHub REST API and writes it to a configurable sink. The project explores functional programming with Cats and JSON handling with Circe.

Features

  • Fetch GitHub user or repository metadata
  • Write results to console, file, or MongoDB
  • Type-safe models with Circe codecs (validated by property-based tests)
  • Docker Compose examples for each sink

Requirements

  • Java 8 or later
  • sbt 1.x (for local development)
  • Docker and Docker Compose (optional, for containerized runs)

Quick start

Build and run locally

# Run with the default console sink
sbt "run user --user octocat"# Fetch a repository
sbt "run repo --user octocat --repo Hello-World"

Build a fat JAR

sbt assembly
java -jar target/scala-2.13/githubapi-sink-assembly-0.1.0-SNAPSHOT.jar user --user octocat

Run tests

sbt test

CLI usage

GithubAPI 0.1
Usage: GithubAPI [repo|user] [options]
-s, --sink <value> Destination type (default: console)
-f, --config-file <value> Path to sink configuration JSON (required for file and mongo)
Command: repo [options]
-r, --repo <value> Repository name
-u, --user <value> GitHub username or organization
Command: user [options]
-u, --user <value> GitHub username

Examples

# Console (default) — prints JSON to stdout
sbt "run user --user octocat"# File — writes JSON to disk
sbt "run user --user octocat --sink file --config-file docker/file/config.json"# MongoDB — upserts document by id
sbt "run user --user octocat --sink mongo --config-file docker/mongodb/config.json"# Repository lookup
sbt "run repo --user octocat --repo Hello-World --sink console"

Sinks

SinkCLI valueConfig requiredDescription
ConsoleconsoleNoPrints JSON to stdout (default)
FilefileYesWrites JSON to a file on disk
MongoDBmongoYesUpserts a document keyed by id

File sink configuration

docker/file/config.json:

{
"path": "/root",
"name": "output.json"
}

If path or name is missing, output defaults to ./output.json.

MongoDB sink configuration

docker/mongodb/config.json:

{
"connectionString": "mongodb://root:example@mongo:27017/",
"database": "test",
"collection": "user"
}

All three fields (connectionString, database, collection) are required.

Docker

Build the assembly JAR before starting a Compose stack:

sbt assembly

Then run one of the example stacks from the repository root:

# Console sink
docker compose -f docker/console/docker-compose.yaml up --build
# File sink
docker compose -f docker/file/docker-compose.yaml up --build
# MongoDB sink (includes MongoDB and mongo-express on port 8081)
docker compose -f docker/mongodb/docker-compose.yaml up --build

Project structure

src/main/scala/com/himewel/
├── App.scala # CLI entry point
├── CliConfig.scala # scopt argument parsing
├── GithubAPI.scala # GitHub API client
├── models/ # User and Repo domain models
└── sink/ # Console, File, and MongoDB sinks
docker/
├── base/Dockerfile # Runtime image with the assembly JAR
├── console/ # Console sink example
├── file/ # File sink example and config
└── mongodb/ # MongoDB sink example and config

Dependencies

About

Functional Scala CLI for extracting GitHub API data and sinking JSON to console, file, or MongoDB using Cats and Circe

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Contributors

Languages