diff --git a/.circleci/config.yml b/.circleci/config.yml
index c781fdc..ade5000 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,62 +1,54 @@
-version: 2.1
-
-orbs:
- sdkman: joshdholtz/sdkman@0.2.0
-
+version: 2
defaults: &defaults
working_directory: ~/repo
environment:
JVM_OPTS: -Xmx3200m
TERM: dumb
- CI_NAME: "CircleCI"
+ CI: true
-commands:
- build_and_test:
- parameters:
- reports-dir:
- type: string
- default: "build/reports/test_results"
- steps:
- - checkout
- - sdkman/setup-sdkman
- - sdkman/sdkman-install:
- candidate: kotlin
- version: 2.1.10
- - run:
- name: Download dependencies
- command: ./bld download
- - run:
- name: Compile source
- command: ./bld compile
- - run:
- name: Run tests
- command: ./bld jacoco -reports-dir=<< parameters.reports-dir >>
- - store_test_results:
- path: << parameters.reports-dir >>
- - store_artifacts:
- path: build/reports/jacoco/test/html
+defaults_gradle: &defaults_gradle
+ steps:
+ - checkout
+ - restore_cache:
+ keys:
+ - gradle-dependencies-{{ checksum "build.gradle.kts" }}
+ # fallback to using the latest cache if no exact match is found
+ - gradle-dependencies-
+ - run:
+ name: Gradle Dependencies
+ command: ./gradlew dependencies
+ - save_cache:
+ paths: ~/.m2
+ key: gradle-dependencies-{{ checksum "build.gradle.kts" }}
+ - run:
+ name: Run All Checks
+ command: ./gradlew check
+ - store_artifacts:
+ path: build/reports/
+ destination: reports
+ - store_test_results:
+ path: build/reports/
jobs:
- bld_jdk17:
+ build_gradle_jdk18:
<<: *defaults
docker:
- - image: cimg/openjdk:17.0
+ - image: cimg/openjdk:18.0
- steps:
- - build_and_test
+ <<: *defaults_gradle
- bld_jdk21:
+ build_gradle_jdk11:
<<: *defaults
docker:
- - image: cimg/openjdk:21.0
+ - image: cimg/openjdk:11.0
- steps:
- - build_and_test
+ <<: *defaults_gradle
workflows:
- bld:
- jobs:
- - bld_jdk17
- - bld_jdk21
+ version: 2
+ gradle:
+ jobs:
+ - build_gradle_jdk11
+ - build_gradle_jdk18
diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml
deleted file mode 100644
index 639d0d6..0000000
--- a/.github/workflows/bld.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-name: bld-ci
-
-on: [push, pull_request, workflow_dispatch]
-
-env:
- COVERAGE_JDK: "21"
- COVERAGE_KOTLIN: "2.0.21"
-
-jobs:
- build-bld-project:
- strategy:
- matrix:
- java-version: [17, 21, 24]
- kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ]
- os: [ ubuntu-latest, windows-latest, macos-latest ]
-
- runs-on: ${{ matrix.os }}
-
- steps:
- - name: Checkout source repository
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Set up JDK ${{ matrix.java-version }} with Kotlin ${{ matrix.kotlin-version }}
- uses: actions/setup-java@v4
- with:
- distribution: "zulu"
- java-version: ${{ matrix.java-version }}
-
- - name: Download dependencies [bld example]
- working-directory: examples/bld
- run: ./bld download
-
- - name: Compile and run examples [bld example]
- working-directory: examples/bld
- run: |
- ./bld compile
- ./bld run --args='https://www.example.com https://is.gd/Pt2sET'
- ./bld run-java --args='https://www.example.com https://is.gd/Pt2sET'
-
- - name: Run examples [gradle example]
- working-directory: examples/gradle
- run: |
- ./gradlew run --args='https://www.example.com https://is.gd/Pt2sET'
- ./gradlew runJava --args='https://www.example.com https://is.gd/Pt2sET'
-
- - name: Download dependencies
- run: ./bld download
-
- - name: Compile source
- run: ./bld compile
-
- - name: Run tests
- run: ./bld jacoco
-
- - name: Remove pom.xml
- if: success() && matrix.java-version == env.COVERAGE_JDK && matrix.kotlin-version == env.COVERAGE_KOTLIN
- && matrix.os == 'ubuntu-latest'
- run: rm -rf pom.xml
-
- - name: SonarCloud Scan
- uses: sonarsource/sonarcloud-github-action@master
- if: success() && matrix.java-version == env.COVERAGE_JDK && matrix.kotlin-version == env.COVERAGE_KOTLIN
- && matrix.os == 'ubuntu-latest'
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
new file mode 100644
index 0000000..658abb4
--- /dev/null
+++ b/.github/workflows/gradle.yml
@@ -0,0 +1,49 @@
+name: gradle-ci
+
+on: [ push, pull_request, workflow_dispatch ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ env:
+ GRADLE_OPTS: "-Dorg.gradle.jvmargs=-XX:MaxMetaspaceSize=512m"
+ SONAR_JDK: "17"
+
+ strategy:
+ matrix:
+ java-version: [ 11, 17, 20 ]
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK ${{ matrix.java-version }}
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: ${{ matrix.java-version }}
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Cache SonarCloud packages
+ if: matrix.java-version == env.SONAR_JDK
+ uses: actions/cache@v3
+ with:
+ path: ~/.sonar/cache
+ key: ${{ runner.os }}-sonar
+ restore-keys: ${{ runner.os }}-sonar
+
+ - name: Test with Gradle
+ uses: gradle/gradle-build-action@v2
+ with:
+ arguments: build check --stacktrace --scan
+
+ - name: SonarCloud
+ if: success() && matrix.java-version == env.SONAR_JDK
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ run: ./gradlew sonar --info
diff --git a/.gitignore b/.gitignore
index 1808834..0742f86 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,61 +1,84 @@
-.gradle
+!.vscode/extensions.json
+!.vscode/launch.json
+!.vscode/settings.json
+!.vscode/tasks.json
+*.class
+*.code-workspace
+*.ctxt
+*.iws
+*.log
+*.nar
+*.rar
+*.sublime-*
+*.tar.gz
+*.zip
.DS_Store
-build
-lib/bld/**
-!lib/bld/bld-wrapper.jar
-!lib/bld/bld-wrapper.properties
-lib/compile/
-lib/runtime/
-lib/standalone/
-lib/test/
-
-# IDEA ignores
-
-# User-specific
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# AWS User-specific
-.idea/**/aws.xml
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
+.classpath
+.gradle
+.history
+.kobalt
+.mtj.tmp/
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.nb-gradle
+.project
+.scannerwork
+.settings
+.vscode/*
+/**/.idea/$CACHE_FILE$
+/**/.idea/$PRODUCT_WORKSPACE_FILE$
+/**/.idea/**/caches/build_file_checksums.ser
+/**/.idea/**/contentModel.xml
+/**/.idea/**/dataSources.ids
+/**/.idea/**/dataSources.local.xml
+/**/.idea/**/dataSources/
+/**/.idea/**/dbnavigator.xml
+/**/.idea/**/dictionaries
+/**/.idea/**/dynamic.xml
+/**/.idea/**/gradle.xml
+/**/.idea/**/httpRequests
+/**/.idea/**/libraries
+/**/.idea/**/mongoSettings.xml
+/**/.idea/**/replstate.xml
+/**/.idea/**/shelf
+/**/.idea/**/shelf/
+/**/.idea/**/sqlDataSources.xml
+/**/.idea/**/tasks.xml
+/**/.idea/**/uiDesigner.xml
+/**/.idea/**/usage.statistics.xml
+/**/.idea/**/workspace.xml
+/**/.idea/sonarlint*
+/**/.idea_modules/
+Thumbs.db
+__pycache__
atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# SonarLint plugin
-.idea/sonarlint/
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-bin
-deploy
-target
+bin/
+build/
+cmake-build-*/
+com_crashlytics_export_strings.xml
+crashlytics-build.properties
+crashlytics.properties
+dependency-reduced-pom.xml
+deploy/
+dist/
+ehthumbs.db
+fabric.properties
+gen/
+hs_err_pid*
+kobaltBuild
+kobaltw*-test
+lib/kotlin*
+libs/
local.properties
-
+out/
+pom.xml.asc
+pom.xml.next
+pom.xml.releaseBackup
+pom.xml.tag
+pom.xml.versionsBackup
+proguard-project.txt
+project.properties
+release.properties
+target/
+test-output
+venv
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 10b9b0f..1a3e8b4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,24 +1,31 @@
-image: fedora:latest
+image: gradle:8-jdk11
variables:
- CI_NAME: "GitLab CI"
-
-stages:
- - test
+ GRADLE_OPTS: "-Dorg.gradle.daemon=false"
before_script:
- - dnf -qy update && dnf -y install zip
- - curl -s "https://get.sdkman.io" | bash
- - echo sdkman_auto_answer=true > $HOME/.sdkman/etc/config
- - echo sdkman_auto_selfupdate=true >> $HOME/.sdkman/etc/config
- - source "$HOME/.sdkman/bin/sdkman-init.sh"
- - sdk install java
- - sdk install kotlin
- - source "$HOME/.sdkman/bin/sdkman-init.sh"
+ - export GRADLE_USER_HOME=`pwd`/.gradle
+
+stages:
+ - build
+ - test
+
+build:
+ stage: build
+ script: gradle --build-cache assemble
+ cache:
+ key: "$CI_COMMIT_REF_NAME"
+ policy: push
+ paths:
+ - build
+ - .gradle
test:
stage: test
- script:
- - ./bld download
- - ./bld compile
- - ./bld test
+ script: gradle check
+ cache:
+ key: "$CI_COMMIT_REF_NAME"
+ policy: pull
+ paths:
+ - build
+ - .gradle
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/app.iml b/.idea/app.iml
deleted file mode 100644
index 2c1fe21..0000000
--- a/.idea/app.iml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/bld.iml b/.idea/bld.iml
deleted file mode 100644
index e63e11e..0000000
--- a/.idea/bld.iml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/bld.xml b/.idea/bld.xml
deleted file mode 100644
index 6600cee..0000000
--- a/.idea/bld.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/compiler.xml b/.idea/compiler.xml
similarity index 100%
rename from examples/gradle/.idea/compiler.xml
rename to .idea/compiler.xml
diff --git a/.idea/copyright/BSD_3.xml b/.idea/copyright/BSD_3.xml
deleted file mode 100644
index dcac8a6..0000000
--- a/.idea/copyright/BSD_3.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/Erik_s_Copyright_Notice.xml b/.idea/copyright/Erik_s_Copyright_Notice.xml
new file mode 100644
index 0000000..1c363f3
--- /dev/null
+++ b/.idea/copyright/Erik_s_Copyright_Notice.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
index 3203074..1419e40 100644
--- a/.idea/copyright/profiles_settings.xml
+++ b/.idea/copyright/profiles_settings.xml
@@ -1,3 +1,3 @@
-
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 94f28ea..9c38803 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,9 +1,50 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/gradle/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
similarity index 65%
rename from examples/gradle/.idea/jarRepositories.xml
rename to .idea/jarRepositories.xml
index 4e9cedf..4290988 100644
--- a/examples/gradle/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -11,6 +11,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -26,5 +36,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 9d6ea82..f8467b4 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,13 +1,6 @@
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml
deleted file mode 100644
index 153a060..0000000
--- a/.idea/libraries/bld.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml
deleted file mode 100644
index 99cc0c0..0000000
--- a/.idea/libraries/compile.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml
deleted file mode 100644
index d4069f2..0000000
--- a/.idea/libraries/runtime.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml
deleted file mode 100644
index 57ed5ef..0000000
--- a/.idea/libraries/test.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3131f62..c9a5d1f 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,26 +1,15 @@
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 55adcb9..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Run Tests.xml b/.idea/runConfigurations/Run Tests.xml
deleted file mode 100644
index 3217d0c..0000000
--- a/.idea/runConfigurations/Run Tests.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1dd..94a25f7 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
index 75e61da..77cf63c 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
+Copyright 2020-2023 Erik C. Thauvin (erik@thauvin.net)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
diff --git a/README.md b/README.md
index 7bff2fb..ef83280 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,11 @@
[](https://opensource.org/licenses/BSD-3-Clause)
-[](https://kotlinlang.org/)
-[](https://rife2.com/bld)
+[](https://kotlinlang.org/)
+[](https://oss.sonatype.org/content/repositories/snapshots/net/thauvin/erik/isgd-shorten/)
[](https://github.com/ethauvin/isgd-shorten/releases/latest)
[](https://central.sonatype.com/artifact/net.thauvin.erik/isgd-shorten)
-[](https://oss.sonatype.org/content/repositories/snapshots/net/thauvin/erik/isgd-shorten/)
-
[](https://sonarcloud.io/dashboard?id=ethauvin_isgd-shorten)
-[](https://github.com/ethauvin/isgd-shorten/actions/workflows/bld.yml)
+[](https://github.com/ethauvin/isgd-shorten/actions/workflows/gradle.yml)
[](https://circleci.com/gh/ethauvin/isgd-shorten/tree/master)
# [is.gd](https://is.gd/developers.php) Shortener for Kotlin, Java & Android
@@ -19,16 +17,16 @@ A simple implementation of the [is.gd](https://is.gd/) URL shortening and lookup
```kotlin
import net.thauvin.erik.isgd.Isgd
-// ...
+...
Isgd.shorten("https://www.example.com/") // returns https://is.gd/Pt2sET
Isgd.lookup("https://is.gd/Pt2sET") // returns https://www.example.com
```
-- View [bld](https://github.com/ethauvin/isgd-shorten/blob/master/examples/bld) or [Gradle](https://github.com/ethauvin/isgd-shorten/blob/master/examples/gradle) Examples.
+- View [Kotlin](https://github.com/ethauvin/isgd-shorten/blob/master/examples/src/main/kotlin/com/example/IsgdExample.kt) or [Java](https://github.com/ethauvin/isgd-shorten/blob/master/examples/src/main/java/com/example/IsgdSample.java) Examples.
-## JSON or XML
+### JSON or XML
The [is.gd API](https://is.gd/developers.php) can return data in plain text (default), JSON or XML.
@@ -42,7 +40,7 @@ returns:
{ "shorturl": "https://is.gd/Pt2sET" }
```
-## Parameters
+### Parameters
All of the [is.gd API](https://is.gd/developers.php) parameters are supported:
@@ -61,20 +59,9 @@ returns:
test({ "shorturl": "https://is.gd/foobar" });
```
-## bld
+### Gradle
-To use with [bld](https://rife2.com/bld), include the following dependency in your [build](https://github.com/ethauvin/isgd-shorten/blob/master/examples/bld/src/bld/java/com/example/ExampleBuild.java) file:
-
-```java
-repositories = List.of(MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY);
-
-scope(compile)
- .include("net.thauvin.erik:isgd-shorten:1.1.0");
-```
-
-## Gradle, Maven, etc...
-
-To use with [Gradle](https://gradle.org/), include the following dependency in your [build](https://github.com/ethauvin/isgd-shorten/blob/master/examples/gradle/build.gradle.kts) file:
+To use with [Gradle](https://gradle.org/), include the following dependency in your [build](https://github.com/ethauvin/isgd-shorten/blob/master/examples/build.gradle.kts) file:
```gradle
repositories {
@@ -83,7 +70,7 @@ repositories {
}
dependencies {
- implementation("net.thauvin.erik:isgd-shorten:1.1.0")
+ implementation("net.thauvin.erik:isgd-shorten:1.0.0")
}
```
@@ -94,10 +81,11 @@ Instructions for using with Maven, Ivy, etc. can be found on [Maven Central](htt
To make it easier to use the library with Java, configuration builders are available:
```java
-var config = new ShortenConfig.Builder("https://www.example.com/")
- .shorturl("foobar")
+var config = new Config.Builder()
+ .url("https://www.example.com/")
+ .shortUrl("foobar")
.callback("test")
- .logstats(true)
+ .logStats(true)
.format(Format.JSON)
.build();
@@ -105,15 +93,15 @@ Isgd.shorten(config);
```
```java
-var config = new LookupConfig.Builder("https://is.gd/Pt2sET")
- .callback("test")
+var config = new Config.Builder()
+ .shortUrl("https://is.gd/Pt2sET")
.format(Format.XML)
.build();
Isgd.lookup(config);
```
-## Errors
+### Errors
An `IsgdException` is thrown when an API error occurs. The error message (text, XML or JSON) and HTTP status code can be retrieved as follows:
@@ -126,33 +114,15 @@ try {
}
```
-```console
+```
Status Code: 400
Error: Sorry, the URL you entered is on our internal blacklist. It may have been used abusively in the past, or it may link to another URL redirection service.
```
-## v.gd
+### v.gd
Additionally, link can be shortened using [v.gd](https://v.gd/) by setting the `isVgd` flag:
```kotlin
Isgd.shorten("https://www.example.com/", isVgd = true) // returns https://v.gd/2z2ncj
```
-
-## Contributing
-
-If you want to contribute to this project, all you have to do is clone the GitHub
-repository:
-
-```console
-git clone git@github.com:ethauvin/isgd-shorten.git
-```
-
-Then use [bld](https://rife2.com/bld) to build:
-
-```console
-cd isgd-shorten
-./bld compile
-```
-
-The project has an [IntelliJ IDEA](https://www.jetbrains.com/idea/) project structure. You can just open it after all the dependencies were downloaded and peruse the code.
diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml
index ace99d2..a9514a0 100644
--- a/bitbucket-pipelines.yml
+++ b/bitbucket-pipelines.yml
@@ -1,20 +1,9 @@
-image: ubuntu:latest
+image: maven:3-openjdk-18
pipelines:
default:
- step:
- name: Test with bld
+ caches:
+ - gradle
script:
- # Install latest Java & Kotlin via SDKMAN!
- - apt-get update -qq && apt-get install -y curl zip
- - curl -s "https://get.sdkman.io" | bash
- - echo sdkman_auto_answer=true > $HOME/.sdkman/etc/config
- - echo sdkman_auto_selfupdate=true >> $HOME/.sdkman/etc/config
- - source "$HOME/.sdkman/bin/sdkman-init.sh"
- - sdk install java
- - sdk install kotlin
- - source "$HOME/.sdkman/bin/sdkman-init.sh"
- # Download, compile and test with bld
- - ./bld download
- - ./bld compile
- - ./bld test
+ - bash ./gradlew check
diff --git a/bld b/bld
deleted file mode 100755
index 5237f94..0000000
--- a/bld
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/env sh
-java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build net.thauvin.erik.IsgdShortenBuild "$@"
\ No newline at end of file
diff --git a/bld.bat b/bld.bat
deleted file mode 100644
index 7a1b7af..0000000
--- a/bld.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build net.thauvin.erik.IsgdShortenBuild %*
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..59fe0e8
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,209 @@
+import org.gradle.api.tasks.testing.logging.TestExceptionFormat
+import org.gradle.api.tasks.testing.logging.TestLogEvent
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ id("com.github.ben-manes.versions") version "0.48.0"
+ id("io.gitlab.arturbosch.detekt") version "1.23.1"
+ id("java")
+ id("java-library")
+ id("maven-publish")
+ id("net.thauvin.erik.gradle.semver") version "1.0.4"
+ id("org.jetbrains.dokka") version "1.9.0"
+ id("org.jetbrains.kotlinx.kover") version "0.7.3"
+ id("org.sonarqube") version "4.3.1.3277"
+ id("signing")
+ kotlin("jvm") version "1.9.10"
+ kotlin("kapt") version "1.9.10"
+}
+
+group = "net.thauvin.erik"
+description = "A simple implementation of the is.gd URL shortening and lookup APIs"
+
+val gitHub = "ethauvin/$name"
+val mavenUrl = "https://github.com/$gitHub"
+val deployDir = "deploy"
+var isRelease = "release" in gradle.startParameter.taskNames
+
+val publicationName = "mavenJava"
+
+repositories {
+ mavenCentral()
+ maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") }
+}
+
+dependencies {
+ implementation(platform(kotlin("bom")))
+ implementation("net.thauvin.erik.urlencoder:urlencoder-lib:1.4.0")
+
+ testImplementation(kotlin("test"))
+ testImplementation(kotlin("test-junit"))
+ testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.27.0")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ withSourcesJar()
+}
+
+koverReport {
+ defaults {
+ xml {
+ onCheck = true
+ }
+ html {
+ onCheck = true
+ }
+ }
+}
+
+detekt {
+ //toolVersion = "main-SNAPSHOT"
+ baseline = project.rootDir.resolve("config/detekt/baseline.xml")
+}
+
+sonarqube {
+ properties {
+ property("sonar.projectKey", "ethauvin_$name")
+ property("sonar.organization", "ethauvin-github")
+ property("sonar.host.url", "https://sonarcloud.io")
+ property("sonar.sourceEncoding", "UTF-8")
+ property("sonar.coverage.jacoco.xmlReportPaths", "${layout.buildDirectory.get()}/reports/kover/report.xml")
+ }
+}
+
+val javadocJar by tasks.creating(Jar::class) {
+ dependsOn(tasks.dokkaJavadoc)
+ from(tasks.dokkaJavadoc)
+ archiveClassifier.set("javadoc")
+ description = "Assembles a JAR of the generated Javadoc."
+ group = JavaBasePlugin.DOCUMENTATION_GROUP
+}
+
+tasks {
+ withType().configureEach {
+ kotlinOptions.jvmTarget = java.targetCompatibility.toString()
+ }
+
+ withType {
+ testLogging {
+ exceptionFormat = TestExceptionFormat.FULL
+ events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
+ }
+ }
+
+ withType {
+ destination = file("$projectDir/pom.xml")
+ }
+
+ assemble {
+ dependsOn(javadocJar)
+ }
+
+ clean {
+ doLast {
+ project.delete(fileTree(deployDir))
+ }
+ }
+
+ dokkaJavadoc {
+ dokkaSourceSets {
+ configureEach {
+ includes.from("config/dokka/packages.md")
+ }
+ }
+ mustRunAfter("kaptKotlin")
+ }
+
+ val copyToDeploy by registering(Copy::class) {
+ from(configurations.runtimeClasspath) {
+ exclude("annotations-*.jar")
+ }
+ from(jar)
+ into(deployDir)
+ }
+
+ val gitIsDirty by registering(Exec::class) {
+ description = "Fails if git has uncommitted changes."
+ group = "verification"
+ commandLine("git", "diff", "--quiet", "--exit-code")
+ }
+
+ val gitTag by registering(Exec::class) {
+ description = "Tags the local repository with version ${project.version}"
+ group = PublishingPlugin.PUBLISH_TASK_GROUP
+ dependsOn(gitIsDirty)
+ if (isRelease) {
+ commandLine("git", "tag", "-a", project.version, "-m", "Version ${project.version}")
+ }
+ }
+
+ register("deploy") {
+ description = "Copies all needed files to the $deployDir directory."
+ group = PublishingPlugin.PUBLISH_TASK_GROUP
+ dependsOn(clean, build, jar)
+ outputs.dir(deployDir)
+ inputs.files(copyToDeploy)
+ mustRunAfter(clean)
+ }
+
+ register("release") {
+ description = "Publishes version ${project.version} to local repository."
+ group = PublishingPlugin.PUBLISH_TASK_GROUP
+ dependsOn("deploy", gitTag, publishToMavenLocal)
+ }
+}
+
+publishing {
+ publications {
+ create(publicationName) {
+ from(components["java"])
+ artifact(javadocJar)
+ pom {
+ name.set(project.name)
+ description.set(project.description)
+ url.set(mavenUrl)
+ licenses {
+ license {
+ name.set("BSD 3-Clause")
+ url.set("https://opensource.org/licenses/BSD-3-Clause")
+ }
+ }
+ developers {
+ developer {
+ id.set("ethauvin")
+ name.set("Erik C. Thauvin")
+ email.set("erik@thauvin.net")
+ url.set("https://erik.thauvin.net/")
+ }
+ }
+ scm {
+ connection.set("scm:git:https://github.com/$gitHub.git")
+ developerConnection.set("scm:git:git@github.com:$gitHub.git")
+ url.set(mavenUrl)
+ }
+ issueManagement {
+ system.set("GitHub")
+ url.set("$mavenUrl/issues")
+ }
+ }
+ }
+ }
+ repositories {
+ maven {
+ name = "ossrh"
+ project.afterEvaluate {
+ url = if (project.version.toString().contains("SNAPSHOT"))
+ uri("https://oss.sonatype.org/content/repositories/snapshots/") else
+ uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
+ }
+ credentials(PasswordCredentials::class)
+ }
+ }
+}
+
+signing {
+ useGpgCmd()
+ sign(publishing.publications[publicationName])
+}
diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml
index 0eea41c..693c365 100644
--- a/config/detekt/baseline.xml
+++ b/config/detekt/baseline.xml
@@ -1,12 +1,10 @@
-
+
-
+
LongParameterList:Isgd.kt$Isgd.Companion$( url: String, shorturl: String = "", callback: String = "", logstats: Boolean = false, format: Format = Format.SIMPLE, isVgd: Boolean = false )
MagicNumber:Isgd.kt$Isgd.Companion$200
MagicNumber:Isgd.kt$Isgd.Companion$399
- MaxLineLength:Isgd.kt$Isgd.Companion$*
- NestedBlockDepth:IsgdExample.kt$fun main(args: Array<String>)
WildcardImport:IsgdTest.kt$import assertk.assertions.*
diff --git a/examples/gradle/.gitattributes b/examples/.gitattributes
similarity index 100%
rename from examples/gradle/.gitattributes
rename to examples/.gitattributes
diff --git a/examples/gradle/.gitignore b/examples/.gitignore
similarity index 100%
rename from examples/gradle/.gitignore
rename to examples/.gitignore
diff --git a/examples/bld/.gitignore b/examples/bld/.gitignore
deleted file mode 100644
index a2805aa..0000000
--- a/examples/bld/.gitignore
+++ /dev/null
@@ -1,55 +0,0 @@
-.gradle
-.DS_Store
-build
-lib/bld/**
-!lib/bld/bld-wrapper.jar
-!lib/bld/bld-wrapper.properties
-lib/compile/
-lib/runtime/
-lib/standalone/
-lib/test/
-
-# IDEA ignores
-
-# User-specific
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# AWS User-specific
-.idea/**/aws.xml
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# SonarLint plugin
-.idea/sonarlint/
-
-# Editor-based Rest Client
-.idea/httpRequests
\ No newline at end of file
diff --git a/examples/bld/.idea/.gitignore b/examples/bld/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/examples/bld/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/examples/bld/.idea/.name b/examples/bld/.idea/.name
deleted file mode 100644
index fdb4a4a..0000000
--- a/examples/bld/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-isgd-shorten-examples-bld
\ No newline at end of file
diff --git a/examples/bld/.idea/app.iml b/examples/bld/.idea/app.iml
deleted file mode 100644
index 2c1fe21..0000000
--- a/examples/bld/.idea/app.iml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/bld.iml b/examples/bld/.idea/bld.iml
deleted file mode 100644
index e63e11e..0000000
--- a/examples/bld/.idea/bld.iml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/inspectionProfiles/Project_Default.xml b/examples/bld/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 1e01b48..0000000
--- a/examples/bld/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/libraries/bld.xml b/examples/bld/.idea/libraries/bld.xml
deleted file mode 100644
index 153a060..0000000
--- a/examples/bld/.idea/libraries/bld.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/bld/.idea/libraries/compile.xml b/examples/bld/.idea/libraries/compile.xml
deleted file mode 100644
index 99cc0c0..0000000
--- a/examples/bld/.idea/libraries/compile.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/libraries/runtime.xml b/examples/bld/.idea/libraries/runtime.xml
deleted file mode 100644
index d4069f2..0000000
--- a/examples/bld/.idea/libraries/runtime.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/libraries/test.xml b/examples/bld/.idea/libraries/test.xml
deleted file mode 100644
index 57ed5ef..0000000
--- a/examples/bld/.idea/libraries/test.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/misc.xml b/examples/bld/.idea/misc.xml
deleted file mode 100644
index 301a237..0000000
--- a/examples/bld/.idea/misc.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/modules.xml b/examples/bld/.idea/modules.xml
deleted file mode 100644
index 55adcb9..0000000
--- a/examples/bld/.idea/modules.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/runConfigurations/Run Tests.xml b/examples/bld/.idea/runConfigurations/Run Tests.xml
deleted file mode 100644
index 2b503e5..0000000
--- a/examples/bld/.idea/runConfigurations/Run Tests.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.idea/vcs.xml b/examples/bld/.idea/vcs.xml
deleted file mode 100644
index b2bdec2..0000000
--- a/examples/bld/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/bld/.vscode/launch.json b/examples/bld/.vscode/launch.json
deleted file mode 100644
index 30a8889..0000000
--- a/examples/bld/.vscode/launch.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
- {
- "type": "java",
- "name": "Run Tests",
- "request": "launch",
- "mainClass": "com.example.ExampleTest"
- }
- ]
-}
diff --git a/examples/bld/.vscode/settings.json b/examples/bld/.vscode/settings.json
deleted file mode 100644
index ba429d0..0000000
--- a/examples/bld/.vscode/settings.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "java.project.sourcePaths": [
- "src/main/java",
- "src/main/resources",
- "src/test/java",
- "src/test/resources",
- "src/bld/java",
- "src/bld/resources"
- ],
- "java.configuration.updateBuildConfiguration": "automatic",
- "java.project.referencedLibraries": [
- "${HOME}/.bld/dist/bld-2.2.1.jar",
- "lib/**/*.jar"
- ]
-}
diff --git a/examples/bld/README.md b/examples/bld/README.md
deleted file mode 100644
index 7b7a4a6..0000000
--- a/examples/bld/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-## Kotlin Example
-To compile & run the Kotlin example:
-
-```console
-./bld compile
-
-./bld run --args='https://www.example.com https://is.gd/Pt2sET'
-```
-
-## Java Example
-To compile & run the Java example:
-
-```console
-./bld compile
-
-./bld run-java --args='https://www.example.com https://is.gd/Pt2sET'
-
-```
diff --git a/examples/bld/bld b/examples/bld/bld
deleted file mode 100755
index 80d2986..0000000
--- a/examples/bld/bld
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/env sh
-java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build com.example.ExampleBuild "$@"
\ No newline at end of file
diff --git a/examples/bld/bld.bat b/examples/bld/bld.bat
deleted file mode 100644
index 084bb72..0000000
--- a/examples/bld/bld.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build com.example.ExampleBuild %*
\ No newline at end of file
diff --git a/examples/bld/lib/bld/bld-wrapper.jar b/examples/bld/lib/bld/bld-wrapper.jar
deleted file mode 100644
index ee1bfee..0000000
Binary files a/examples/bld/lib/bld/bld-wrapper.jar and /dev/null differ
diff --git a/examples/bld/lib/bld/bld-wrapper.properties b/examples/bld/lib/bld/bld-wrapper.properties
deleted file mode 100644
index 1156265..0000000
--- a/examples/bld/lib/bld/bld-wrapper.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bld.downloadExtensionJavadoc=false
-bld.downloadExtensionSources=true
-bld.downloadLocation=
-bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.10
-bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0-SNAPSHOT
-bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
-bld.sourceDirectories=
-bld.version=2.2.1
diff --git a/examples/bld/src/bld/java/com/example/ExampleBuild.java b/examples/bld/src/bld/java/com/example/ExampleBuild.java
deleted file mode 100644
index 172466e..0000000
--- a/examples/bld/src/bld/java/com/example/ExampleBuild.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.example;
-
-import rife.bld.BaseProject;
-import rife.bld.BuildCommand;
-import rife.bld.extension.CompileKotlinOperation;
-import rife.bld.operations.RunOperation;
-
-import java.util.List;
-
-import static rife.bld.dependencies.Repository.*;
-import static rife.bld.dependencies.Scope.compile;
-
-public class ExampleBuild extends BaseProject {
- public ExampleBuild() {
- pkg = "com.example";
- name = "Example";
- version = version(0, 1, 0);
-
- mainClass = "com.example.IsgdExampleKt";
-
- javaRelease = 11;
- downloadSources = true;
- autoDownloadPurge = true;
- repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY);
-
- scope(compile)
- .include(dependency("net.thauvin.erik:isgd-shorten:1.1.1-SNAPSHOT"));
- }
-
- public static void main(String[] args) {
- new ExampleBuild().start(args);
- }
-
- @Override
- public void compile() throws Exception {
- new CompileKotlinOperation()
- .fromProject(this)
- .execute();
-
- // Also compile the Java source code
- super.compile();
- }
-
- @BuildCommand(value = "run-java", summary = "Runs the Java example")
- public void runJava() throws Exception {
- new RunOperation()
- .fromProject(this)
- .mainClass("com.example.IsgdSample")
- .execute();
- }
-}
diff --git a/examples/gradle/build.gradle.kts b/examples/build.gradle.kts
similarity index 60%
rename from examples/gradle/build.gradle.kts
rename to examples/build.gradle.kts
index 989a94e..ca16f83 100644
--- a/examples/gradle/build.gradle.kts
+++ b/examples/build.gradle.kts
@@ -2,10 +2,13 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("application")
- id("com.github.ben-manes.versions") version "0.51.0"
- kotlin("jvm") version "2.1.20"
+ id("com.github.ben-manes.versions") version "0.48.0"
+ kotlin("jvm") version "1.9.10"
}
+// ./gradlew run --args='https://www.example.com https://is.gd/Pt2sET'
+// ./gradlew runJava --args='https://www.example.com https://is.gd/Pt2sET'
+
repositories {
mavenLocal()
mavenCentral()
@@ -13,7 +16,7 @@ repositories {
}
dependencies {
- implementation("net.thauvin.erik:isgd-shorten:1.1.1-SNAPSHOT")
+ implementation("net.thauvin.erik:isgd-shorten:1.0.0")
}
java {
@@ -25,11 +28,11 @@ application {
mainClass.set("com.example.IsgdExampleKt")
}
-kotlin {
- compilerOptions.jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11)
-}
-
tasks {
+ withType().configureEach {
+ kotlinOptions.jvmTarget = java.targetCompatibility.toString()
+ }
+
register("runJava", JavaExec::class) {
group = "application"
mainClass.set("com.example.IsgdSample")
diff --git a/examples/gradle/.idea/.gitignore b/examples/gradle/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/examples/gradle/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/examples/gradle/.idea/.name b/examples/gradle/.idea/.name
deleted file mode 100644
index a595e88..0000000
--- a/examples/gradle/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-isgd-shorten-examples-gradle
\ No newline at end of file
diff --git a/examples/gradle/.idea/gradle.xml b/examples/gradle/.idea/gradle.xml
deleted file mode 100644
index f2c1963..0000000
--- a/examples/gradle/.idea/gradle.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/inspectionProfiles/Project_Default.xml b/examples/gradle/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 1e01b48..0000000
--- a/examples/gradle/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/kotlinc.xml b/examples/gradle/.idea/kotlinc.xml
deleted file mode 100644
index 6d0ee1c..0000000
--- a/examples/gradle/.idea/kotlinc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_isgd_shorten_1_0_2_SNAPSHOT.xml b/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_isgd_shorten_1_0_2_SNAPSHOT.xml
deleted file mode 100644
index 21fabac..0000000
--- a/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_isgd_shorten_1_0_2_SNAPSHOT.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_urlencoder_urlencoder_lib_jvm_1_5_0.xml b/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_urlencoder_urlencoder_lib_jvm_1_5_0.xml
deleted file mode 100644
index a546fd2..0000000
--- a/examples/gradle/.idea/libraries/Gradle__net_thauvin_erik_urlencoder_urlencoder_lib_jvm_1_5_0.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/examples/gradle/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
deleted file mode 100644
index e179fa0..0000000
--- a/examples/gradle/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_2_0_0.xml b/examples/gradle/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_2_0_0.xml
deleted file mode 100644
index 05bcccc..0000000
--- a/examples/gradle/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_2_0_0.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/misc.xml b/examples/gradle/.idea/misc.xml
deleted file mode 100644
index a4d3e28..0000000
--- a/examples/gradle/.idea/misc.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/modules.xml b/examples/gradle/.idea/modules.xml
deleted file mode 100644
index 2ec1f70..0000000
--- a/examples/gradle/.idea/modules.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.iml b/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.iml
deleted file mode 100644
index 5fe3c00..0000000
--- a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.main.iml b/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.main.iml
deleted file mode 100644
index dbd3931..0000000
--- a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.main.iml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-scripting-jvm/2.0.0/kotlin-scripting-jvm-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-scripting-common/2.0.0/kotlin-scripting-common-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-script-runtime/2.0.0/kotlin-script-runtime-2.0.0.jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.test.iml b/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.test.iml
deleted file mode 100644
index 6ade093..0000000
--- a/examples/gradle/.idea/modules/isgd-shorten-examples-gradle.test.iml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
- isgd-shorten-examples-gradle:main
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-scripting-jvm/2.0.0/kotlin-scripting-jvm-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-scripting-common/2.0.0/kotlin-scripting-common-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/2.0.0/kotlin-stdlib-2.0.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar
- $MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-script-runtime/2.0.0/kotlin-script-runtime-2.0.0.jar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/.idea/vcs.xml b/examples/gradle/.idea/vcs.xml
deleted file mode 100644
index b2bdec2..0000000
--- a/examples/gradle/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/examples/gradle/README.md b/examples/gradle/README.md
deleted file mode 100644
index ba0bfd7..0000000
--- a/examples/gradle/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-## Kotlin Example
-To compile & run the Kotlin example:
-
-```console
-./gradlew run --args='https://www.example.com https://is.gd/Pt2sET'
-```
-
-## Java Example
-
-To compile & run the Java example:
-
-```console
-./gradlew runJava --args='https://www.example.com https://is.gd/Pt2sET'
-```
diff --git a/examples/gradle/gradle/wrapper/gradle-wrapper.jar b/examples/gradle/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 1b33c55..0000000
Binary files a/examples/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/examples/gradle/src/main/java/com/example/IsgdSample.java b/examples/gradle/src/main/java/com/example/IsgdSample.java
deleted file mode 100644
index ed0d774..0000000
--- a/examples/gradle/src/main/java/com/example/IsgdSample.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.example;
-
-import net.thauvin.erik.isgd.Format;
-import net.thauvin.erik.isgd.Isgd;
-import net.thauvin.erik.isgd.IsgdException;
-import net.thauvin.erik.isgd.LookupConfig;
-
-public final class IsgdSample {
- public static void main(final String[] args) {
- if (args.length > 0) {
- for (final String arg : args) {
- try {
- if (arg.contains("is.gd")) {
- System.out.println(arg + " <-- " + Isgd.lookup(arg));
- System.out.print(Isgd.lookup(new LookupConfig.Builder(arg).format(Format.WEB).build()));
- } else {
- System.out.println(arg + " --> " + Isgd.shorten(arg));
- }
- } catch (IsgdException e) {
- System.out.println(e.getMessage());
- }
- }
- } else {
- System.err.println("Try specifying one or more URLs as arguments.");
- }
- System.exit(0);
- }
-}
diff --git a/examples/gradle/src/main/kotlin/com/example/IsgdExample.kt b/examples/gradle/src/main/kotlin/com/example/IsgdExample.kt
deleted file mode 100644
index fe721a0..0000000
--- a/examples/gradle/src/main/kotlin/com/example/IsgdExample.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.example
-
-import net.thauvin.erik.isgd.Isgd
-import net.thauvin.erik.isgd.IsgdException
-import kotlin.system.exitProcess
-
-fun main(args: Array) {
- if (args.isNotEmpty()) {
- args.forEach {
- try {
- if (it.contains("is.gd"))
- println(it + " <-- " + Isgd.lookup(it))
- else
- println(it + " --> " + Isgd.shorten(it))
- } catch (e: IsgdException) {
- println(e.message)
- }
- }
- } else {
- println("Try specifying one or more URLs as arguments.")
- }
- exitProcess(0)
-}
diff --git a/examples/gradle/wrapper/gradle-wrapper.jar b/examples/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..033e24c
Binary files /dev/null and b/examples/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/gradle/wrapper/gradle-wrapper.properties b/examples/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..9f4197d
--- /dev/null
+++ b/examples/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/examples/gradlew b/examples/gradlew
new file mode 100755
index 0000000..fcb6fca
--- /dev/null
+++ b/examples/gradlew
@@ -0,0 +1,248 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/examples/gradle/gradlew.bat b/examples/gradlew.bat
similarity index 87%
rename from examples/gradle/gradlew.bat
rename to examples/gradlew.bat
index db3a6ac..93e3f59 100644
--- a/examples/gradle/gradlew.bat
+++ b/examples/gradlew.bat
@@ -13,8 +13,6 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@@ -45,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
@@ -59,22 +57,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
-set CLASSPATH=
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/examples/gradle/settings.gradle.kts b/examples/settings.gradle.kts
similarity index 86%
rename from examples/gradle/settings.gradle.kts
rename to examples/settings.gradle.kts
index ed4a5c2..4ddea20 100644
--- a/examples/gradle/settings.gradle.kts
+++ b/examples/settings.gradle.kts
@@ -7,4 +7,4 @@
* in the user manual at https://docs.gradle.org/6.2/userguide/multi_project_builds.html
*/
-rootProject.name = "isgd-shorten-examples-gradle"
+rootProject.name = "isgd-examples"
diff --git a/examples/bld/src/main/java/com/example/IsgdSample.java b/examples/src/main/java/com/example/IsgdSample.java
similarity index 84%
rename from examples/bld/src/main/java/com/example/IsgdSample.java
rename to examples/src/main/java/com/example/IsgdSample.java
index ed0d774..b79d095 100644
--- a/examples/bld/src/main/java/com/example/IsgdSample.java
+++ b/examples/src/main/java/com/example/IsgdSample.java
@@ -1,9 +1,9 @@
package com.example;
+import net.thauvin.erik.isgd.Config;
import net.thauvin.erik.isgd.Format;
import net.thauvin.erik.isgd.Isgd;
import net.thauvin.erik.isgd.IsgdException;
-import net.thauvin.erik.isgd.LookupConfig;
public final class IsgdSample {
public static void main(final String[] args) {
@@ -12,7 +12,7 @@ public final class IsgdSample {
try {
if (arg.contains("is.gd")) {
System.out.println(arg + " <-- " + Isgd.lookup(arg));
- System.out.print(Isgd.lookup(new LookupConfig.Builder(arg).format(Format.WEB).build()));
+ System.out.print(Isgd.lookup(new Config.Builder().shortUrl(arg).format(Format.WEB).build()));
} else {
System.out.println(arg + " --> " + Isgd.shorten(arg));
}
diff --git a/examples/bld/src/main/kotlin/com/example/IsgdExample.kt b/examples/src/main/kotlin/com/example/IsgdExample.kt
similarity index 100%
rename from examples/bld/src/main/kotlin/com/example/IsgdExample.kt
rename to examples/src/main/kotlin/com/example/IsgdExample.kt
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..e69de29
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7f93135
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
similarity index 94%
rename from examples/gradle/gradle/wrapper/gradle-wrapper.properties
rename to gradle/wrapper/gradle-wrapper.properties
index ca025c8..ac72c34 100644
--- a/examples/gradle/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/examples/gradle/gradlew b/gradlew
similarity index 90%
rename from examples/gradle/gradlew
rename to gradlew
index 23d15a9..0adc8e1 100755
--- a/examples/gradle/gradlew
+++ b/gradlew
@@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# SPDX-License-Identifier: Apache-2.0
-#
##############################################################################
#
@@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -86,7 +84,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -114,7 +112,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH="\\\"\\\""
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -147,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
+ # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -155,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
+ # shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -204,16 +202,16 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-# Collect all arguments for the java command:
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
-# and any embedded shellness will be escaped.
-# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
-# treated as '${Hostname}' itself on the command line.
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
- -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
+ org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..93e3f59
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar
deleted file mode 100644
index a252a09..0000000
Binary files a/lib/bld/bld-wrapper.jar and /dev/null differ
diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties
deleted file mode 100644
index 751133d..0000000
--- a/lib/bld/bld-wrapper.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bld.downloadExtensionJavadoc=false
-bld.downloadExtensionSources=true
-bld.downloadLocation=
-bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.10-SNAPSHOT
-bld.extension-dokka=com.uwyn.rife2:bld-dokka:1.0.4-SNAPSHOT
-bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.10
-bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0-SNAPSHOT
-bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
-bld.sourceDirectories=
-bld.version=2.2.1
diff --git a/pom.xml b/pom.xml
index 33a16b9..b1cfd73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,10 +1,14 @@
-
+
+
+
+
+
+
4.0.0
net.thauvin.erik
isgd-shorten
- 1.1.1-SNAPSHOT
+ 1.0.0
isgd-shorten
A simple implementation of the is.gd URL shortening and lookup APIs
https://github.com/ethauvin/isgd-shorten
@@ -14,20 +18,6 @@
https://opensource.org/licenses/BSD-3-Clause
-
-
- org.jetbrains.kotlin
- kotlin-stdlib
- 2.1.20
- compile
-
-
- net.thauvin.erik.urlencoder
- urlencoder-lib-jvm
- 1.6.0
- compile
-
-
ethauvin
@@ -41,4 +31,33 @@
scm:git:git@github.com:ethauvin/isgd-shorten.git
https://github.com/ethauvin/isgd-shorten
+
+ GitHub
+ https://github.com/ethauvin/isgd-shorten/issues
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-bom
+ 1.9.10
+ pom
+ import
+
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ 1.9.10
+ compile
+
+
+ net.thauvin.erik.urlencoder
+ urlencoder-lib-jvm
+ 1.4.0
+ runtime
+
+
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..cf129ff
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,18 @@
+plugins {
+ id("com.gradle.enterprise").version("3.15")
+}
+
+gradleEnterprise {
+ buildScan {
+ link("GitHub", "https://github.com/ethauvin/isgd-shorten/tree/master")
+ if (!System.getenv("CI").isNullOrEmpty()) {
+ isUploadInBackground = false
+ publishOnFailure()
+ tag("CI")
+ }
+ termsOfServiceUrl = "https://gradle.com/terms-of-service"
+ termsOfServiceAgree = "yes"
+ }
+}
+
+rootProject.name = "isgd-shorten"
diff --git a/sonar-project.properties b/sonar-project.properties
deleted file mode 100644
index 07235d2..0000000
--- a/sonar-project.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-sonar.organization=ethauvin-github
-sonar.projectKey=ethauvin_isgd-shorten
-sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml
-sonar.sources=src/main/kotlin/
-sonar.tests=src/test/kotlin/
-sonar.java.binaries=build/main,build/test
-sonar.java.libraries=lib/compile/*.jar
diff --git a/src/bld/java/net/thauvin/erik/IsgdShortenBuild.java b/src/bld/java/net/thauvin/erik/IsgdShortenBuild.java
deleted file mode 100644
index 49abd79..0000000
--- a/src/bld/java/net/thauvin/erik/IsgdShortenBuild.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * IsgdShortenBuild.java
- *
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of this project nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package net.thauvin.erik;
-
-import rife.bld.BuildCommand;
-import rife.bld.Project;
-import rife.bld.extension.CompileKotlinOperation;
-import rife.bld.extension.DetektOperation;
-import rife.bld.extension.DokkaOperation;
-import rife.bld.extension.JacocoReportOperation;
-import rife.bld.extension.dokka.LoggingLevel;
-import rife.bld.extension.dokka.OutputFormat;
-import rife.bld.extension.kotlin.CompileOptions;
-import rife.bld.operations.exceptions.ExitStatusException;
-import rife.bld.publish.PomBuilder;
-import rife.bld.publish.PublishDeveloper;
-import rife.bld.publish.PublishLicense;
-import rife.bld.publish.PublishScm;
-import rife.tools.exceptions.FileUtilsErrorException;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import static rife.bld.dependencies.Repository.*;
-import static rife.bld.dependencies.Scope.compile;
-import static rife.bld.dependencies.Scope.test;
-
-public class IsgdShortenBuild extends Project {
- final File srcMainKotlin = new File(srcMainDirectory(), "kotlin");
-
- public IsgdShortenBuild() {
- pkg = "net.thauvin.erik";
- name = "isgd-shorten";
- version = version(1, 1, 1, "SNAPSHOT");
-
- javaRelease = 11;
- downloadSources = true;
- autoDownloadPurge = true;
-
- repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL);
-
- final var kotlin = version(2, 1, 20);
- scope(compile)
- .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin))
- .include(dependency("net.thauvin.erik.urlencoder", "urlencoder-lib-jvm", version(1, 6, 0)));
- scope(test)
- .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin))
- .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 2)))
- .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 2)))
- .include(dependency("org.junit.platform", "junit-platform-launcher", version(1, 12, 2)))
- .include(dependency("com.willowtreeapps.assertk", "assertk-jvm", version(0, 28, 1)));
-
- publishOperation()
- .repository(version.isSnapshot() ? repository(SONATYPE_SNAPSHOTS_LEGACY.location())
- .withCredentials(property("sonatype.user"), property("sonatype.password"))
- : repository(SONATYPE_RELEASES_LEGACY.location())
- .withCredentials(property("sonatype.user"), property("sonatype.password")))
- .repository(repository("github"))
- .info()
- .groupId(pkg)
- .artifactId(name)
- .description("A simple implementation of the is.gd URL shortening and lookup APIs")
- .url("https://github.com/ethauvin/" + name)
- .developer(new PublishDeveloper()
- .id("ethauvin")
- .name("Erik C. Thauvin")
- .email("erik@thauvin.net")
- .url("https://erik.thauvin.net/")
- )
- .license(new PublishLicense()
- .name("BSD 3-Clause")
- .url("https://opensource.org/licenses/BSD-3-Clause")
- )
- .scm(new PublishScm()
- .connection("scm:git:https://github.com/ethauvin/" + name + ".git")
- .developerConnection("scm:git:git@github.com:ethauvin/" + name + ".git")
- .url("https://github.com/ethauvin/" + name)
- )
- .signKey(property("sign.key"))
- .signPassphrase(property("sign.passphrase"));
-
- jarSourcesOperation().sourceDirectories(srcMainKotlin);
- }
-
- public static void main(String[] args) {
- // Enable detailed logging for the extensions
- var level = Level.ALL;
- var logger = Logger.getLogger("rife.bld.extension");
- var consoleHandler = new ConsoleHandler();
-
- consoleHandler.setLevel(level);
- logger.addHandler(consoleHandler);
- logger.setLevel(level);
- logger.setUseParentHandlers(false);
-
- new IsgdShortenBuild().start(args);
- }
-
- @BuildCommand(summary = "Compiles the Kotlin project")
- @Override
- public void compile() throws Exception {
- new CompileKotlinOperation()
- .fromProject(this)
- .compileOptions(new CompileOptions().verbose(true))
- .execute();
- }
-
- @BuildCommand(summary = "Checks source with Detekt")
- public void detekt() throws ExitStatusException, IOException, InterruptedException {
- new DetektOperation()
- .fromProject(this)
- .baseline("config/detekt/baseline.xml")
- .execute();
- }
-
- @BuildCommand(value = "detekt-baseline", summary = "Creates the Detekt baseline")
- public void detektBaseline() throws ExitStatusException, IOException, InterruptedException {
- new DetektOperation()
- .fromProject(this)
- .baseline("config/detekt/baseline.xml")
- .createBaseline(true)
- .execute();
- }
-
- @BuildCommand(summary = "Generates JaCoCo Reports")
- public void jacoco() throws Exception {
- new JacocoReportOperation()
- .fromProject(this)
- .sourceFiles(srcMainKotlin)
- .execute();
- }
-
- @Override
- public void javadoc() throws ExitStatusException, IOException, InterruptedException {
- new DokkaOperation()
- .fromProject(this)
- .loggingLevel(LoggingLevel.INFO)
- .moduleName("is.gd Shorten")
- .moduleVersion(version.toString())
- .outputDir(new File(buildDirectory(), "javadoc"))
- .outputFormat(OutputFormat.JAVADOC)
- .execute();
- }
-
- @Override
- public void publish() throws Exception {
- super.publish();
- pomRoot();
- }
-
- @Override
- public void publishLocal() throws Exception {
- super.publishLocal();
- pomRoot();
- }
-
- @BuildCommand(value = "pom-root", summary = "Generates the POM file in the root directory")
- public void pomRoot() throws FileUtilsErrorException {
- PomBuilder.generateInto(publishOperation().fromProject(this).info(), dependencies(),
- new File(workDirectory, "pom.xml"));
- }
-}
diff --git a/src/main/kotlin/net/thauvin/erik/isgd/Config.kt b/src/main/kotlin/net/thauvin/erik/isgd/Config.kt
new file mode 100644
index 0000000..3c132cf
--- /dev/null
+++ b/src/main/kotlin/net/thauvin/erik/isgd/Config.kt
@@ -0,0 +1,74 @@
+/*
+ * Config.kt
+ *
+ * Copyright 2023 Erik C. Thauvin (erik@thauvin.net)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of this project nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package net.thauvin.erik.isgd
+
+/**
+ * Provides a builder to create/lookup an is.gd shortlink.
+ */
+class Config private constructor(
+ val url: String,
+ val shorturl: String,
+ val callback: String,
+ val logstats: Boolean,
+ val format: Format,
+ val isVgd: Boolean
+) {
+ /**
+ * Configures the parameters to create/lookup an is.gd shortlink.
+ *
+ * See the [is.gd API](https://is.gd/apishorteningreference.php).
+ */
+ data class Builder(
+ private var url: String = "",
+ private var shorturl: String = "",
+ private var callback: String = "",
+ private var logstats: Boolean = false,
+ private var format: Format = Format.SIMPLE,
+ private var isVgd: Boolean = false
+ ) {
+ fun url(url: String) = apply { this.url = url }
+ fun shortUrl(shortUrl: String) = apply { this.shorturl = shortUrl }
+ fun callback(callback: String) = apply { this.callback = callback }
+ fun logStats(logStats: Boolean) = apply { this.logstats = logStats }
+ fun format(format: Format) = apply { this.format = format }
+ fun isVgd(isVgd: Boolean) = apply { this.isVgd = isVgd }
+
+ fun build() = Config(
+ url,
+ shorturl,
+ callback,
+ logstats,
+ format,
+ isVgd
+ )
+ }
+}
diff --git a/src/main/kotlin/net/thauvin/erik/isgd/Isgd.kt b/src/main/kotlin/net/thauvin/erik/isgd/Isgd.kt
index 9157567..4c6728c 100644
--- a/src/main/kotlin/net/thauvin/erik/isgd/Isgd.kt
+++ b/src/main/kotlin/net/thauvin/erik/isgd/Isgd.kt
@@ -1,7 +1,7 @@
/*
* Isgd.kt
*
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2023 Erik C. Thauvin (erik@thauvin.net)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -33,7 +33,7 @@ package net.thauvin.erik.isgd
import net.thauvin.erik.urlencoder.UrlEncoderUtil
import java.net.HttpURLConnection
-import java.net.URI
+import java.net.URL
/**
* See the [is.gd API](https://is.gd/apishorteningreference.php).
@@ -50,21 +50,17 @@ fun String.encode(): String = UrlEncoderUtil.encode(this)
class Isgd private constructor() {
companion object {
private fun callApi(url: String): String {
- val connection = URI(url).toURL().openConnection() as HttpURLConnection
- try {
- connection.setRequestProperty(
- "User-Agent",
- "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/109.0"
- )
- if (connection.responseCode in 200..399) {
- return connection.inputStream.bufferedReader().use { it.readText() }
- } else {
- throw IsgdException(
- connection.responseCode,
- connection.errorStream.bufferedReader().use { it.readText() })
- }
- } finally {
- connection.disconnect()
+ val connection = URL(url).openConnection() as HttpURLConnection
+ connection.setRequestProperty(
+ "User-Agent",
+ "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/109.0"
+ )
+ if (connection.responseCode in 200..399) {
+ return connection.inputStream.bufferedReader().use { it.readText() }
+ } else {
+ throw IsgdException(
+ connection.responseCode,
+ connection.errorStream.bufferedReader().use { it.readText() })
}
}
@@ -79,7 +75,7 @@ class Isgd private constructor() {
*/
@JvmStatic
@Throws(IsgdException::class)
- fun lookup(config: LookupConfig): String {
+ fun lookup(config: Config): String {
return lookup(
config.shorturl,
config.callback,
@@ -92,17 +88,6 @@ class Isgd private constructor() {
* Lookup a shortlink.
*
* See the [is.gd API](https://is.gd/apilookupreference.php).
- *
- * @param shorturl The shorturl parameter is the shortened is.gd URL that you want to look up. You can either
- * submit the full address (e.g. `https://is.gd/example`) or only the unique part (e.g. `example`). The address
- * you submit should be properly formed; the API lookup function is not guaranteed to handle malformed URLs the
- * same way as when you visit them manually.
- * @param callback The callback parameter is used to specify a callback function to wrap the returned data in
- * when using JSON format. This can be useful when working with cross domain data. Even when using JSON format
- * this parameter is optional.
- * @param format The format parameter determines what format is.gd uses to send output back to you (e.g. to
- * tell you what your new shortened URL is or if an error has occurred).
- * @param isVgd Lookup using the `v.gd` domain.
*/
@JvmStatic
@JvmOverloads
@@ -133,7 +118,7 @@ class Isgd private constructor() {
*/
@JvmStatic
@Throws(IsgdException::class)
- fun shorten(config: ShortenConfig): String {
+ fun shorten(config: Config): String {
return shorten(
config.url,
config.shorturl,
@@ -148,26 +133,6 @@ class Isgd private constructor() {
* Shortens a link.
*
* See the [is.gd API](https://is.gd/apishorteningreference.php).
- *
- * @param url The url parameter is the address that you want to shorten.
- * @param shorturl You can specify the shorturl parameter if you'd like to pick a shortened URL instead of
- * having is.gd randomly generate one. These must be between 5 and 30 characters long and can only contain
- * alphanumeric characters and underscores. Shortened URLs are case sensitive. Bear in mind that a desired
- * short URL might already be taken (this is very often the case with common words) so if you're using this
- * option be prepared to respond to an error and get an alternative choice from your app's user.
- * @param callback The callback parameter is used to specify a callback function to wrap the returned data in
- * when using JSON format. This can be useful when working with cross domain data. Even when using JSON format
- * this parameter is optional.
- * @param logstats Turns on logging of detailed statistics when the shortened URL you create is accessed. This
- * allows you to see how many times the link was accessed on a given day, what pages referred people to the
- * link, what browser visitors were using etc. You can access these stats via the link preview page for your
- * shortened URL (add a hyphen/dash to the end of the shortened URL to get to it). Creating links with
- * statistics turned on has twice the "cost" towards our rate limit of other shortened links, so leave this
- * parameter out of your API call if you don't require statistics on usage. See the
- * [usage limits page](https://is.gd/usagelimits.php) for more information on this.
- * @param format The format parameter determines what format is.gd uses to send output back to you (e.g. to
- * tell you what your new shortened URL is or if an error has occurred).
- * @param isVgd Shorten using the `v.gd` domain.
*/
@JvmStatic
@JvmOverloads
diff --git a/src/main/kotlin/net/thauvin/erik/isgd/IsgdException.kt b/src/main/kotlin/net/thauvin/erik/isgd/IsgdException.kt
index d44ea5a..ebafb24 100644
--- a/src/main/kotlin/net/thauvin/erik/isgd/IsgdException.kt
+++ b/src/main/kotlin/net/thauvin/erik/isgd/IsgdException.kt
@@ -1,7 +1,7 @@
/*
* IsgdException.kt
*
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2023 Erik C. Thauvin (erik@thauvin.net)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/src/main/kotlin/net/thauvin/erik/isgd/LookupConfig.kt b/src/main/kotlin/net/thauvin/erik/isgd/LookupConfig.kt
deleted file mode 100644
index 6975ff2..0000000
--- a/src/main/kotlin/net/thauvin/erik/isgd/LookupConfig.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * LookupConfig.kt
- *
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of this project nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package net.thauvin.erik.isgd
-
-/**
- * Provides a builder to lookup an is.gd shortlink.
- */
-class LookupConfig private constructor(builder: Builder) {
- val shorturl: String = builder.shorturl
- val callback: String = builder.callback
- val format: Format = builder.format
- val isVgd: Boolean = builder.isVgd
-
- /**
- * Configures the parameters to lookup an is.gd shortlink.
- *
- * See the [is.gd Lookup]() API.
- *
- * @param shorturl The shorturl parameter is the shortened is.gd URL that you want to look up. You can either submit
- * the full address (e.g. `https://is.gd/example`) or only the unique part (e.g. `example`). The address you submit
- * should be properly formed; the API lookup function is not guaranteed to handle malformed URLs the same way as
- * when you visit them manually.
- */
- data class Builder(var shorturl: String) {
- var callback: String = ""
- var format: Format = Format.SIMPLE
- var isVgd: Boolean = false
-
- /**
- * The shorturl parameter is the shortened is.gd URL that you want to look up. You can either submit the full
- * address (e.g. `https://is.gd/example`) or only the unique part (e.g. `example`). The address you submit
- * should be properly formed; the API lookup function is not guaranteed to handle malformed URLs the same way
- * as when you visit them manually.
- */
- fun shorturl(shorturl: String): Builder = apply { this.shorturl = shorturl }
-
- /**
- * The callback parameter is used to specify a callback function to wrap the returned data in
- * when using JSON format. This can be useful when working with cross domain data. Even when using JSON format
- * this parameter is optional.
- */
- fun callback(callback: String): Builder = apply { this.callback = callback }
-
- /**
- * The format parameter determines what format is.gd uses to send output back to you (e.g. to
- * tell you what your new shortened URL is or if an error has occurred).
- */
- fun format(format: Format): Builder = apply { this.format = format }
-
- /**
- * Shorten using the `v.gd` domain.
- */
- fun isVgd(isVgd: Boolean): Builder = apply { this.isVgd = isVgd }
-
- /**
- * Builds a new configuration.
- */
- fun build() = LookupConfig(this)
- }
-}
diff --git a/src/main/kotlin/net/thauvin/erik/isgd/ShortenConfig.kt b/src/main/kotlin/net/thauvin/erik/isgd/ShortenConfig.kt
deleted file mode 100644
index a11fc4e..0000000
--- a/src/main/kotlin/net/thauvin/erik/isgd/ShortenConfig.kt
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * ShortenConfig.kt
- *
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of this project nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package net.thauvin.erik.isgd
-
-/**
- * Provides a builder to create an is.gd shortlink.
- */
-class ShortenConfig private constructor(builder: Builder) {
- val url: String = builder.url
- val shorturl: String = builder.shorturl
- val callback: String = builder.callback
- val logstats: Boolean = builder.logstats
- val format: Format = builder.format
- val isVgd: Boolean = builder.isVgd
-
- /**
- * Configures the parameters to create an is.gd shortlink.
- *
- * See the [is.gd Shortening](https://is.gd/apishorteningreference.php) API.
- *
- * @param url The url parameter is the address that you want to shorten.
- */
- data class Builder(var url: String) {
- var shorturl: String = ""
- var callback: String = ""
- var logstats: Boolean = false
- var format: Format = Format.SIMPLE
- var isVgd: Boolean = false
-
- /**
- * The url parameter is the address that you want to shorten.
- */
- fun url(url: String): Builder = apply { this.url = url }
-
- /**
- * You can specify the shorturl parameter if you'd like to pick a shortened URL instead of
- * having is.gd randomly generate one. These must be between 5 and 30 characters long and can only contain
- * alphanumeric characters and underscores. Shortened URLs are case-sensitive. Bear in mind that a desired
- * short URL might already be taken (this is very often the case with common words) so if you're using this
- * option be prepared to respond to an error and get an alternative choice from your app's user.
- */
- fun shorturl(shorturl: String): Builder = apply { this.shorturl = shorturl }
-
- /**
- * The callback parameter is used to specify a callback function to wrap the returned data in
- * when using JSON format. This can be useful when working with cross domain data. Even when using JSON format
- * this parameter is optional.
- */
- fun callback(callback: String): Builder = apply { this.callback = callback }
-
- /**
- * Turns on logging of detailed statistics when the shortened URL you create is accessed. This
- * allows you to see how many times the link was accessed on a given day, what pages referred people to the
- * link, what browser visitors were using etc. You can access these stats via the link preview page for your
- * shortened URL (add a hyphen/dash to the end of the shortened URL to get to it). Creating links with
- * statistics turned on has twice the "cost" towards our rate limit of other shortened links, so leave this
- * parameter out of your API call if you don't require statistics on usage. See the
- * [usage limits page](https://is.gd/usagelimits.php) for more information on this.
- */
- fun logstats(logstats: Boolean): Builder = apply { this.logstats = logstats }
-
- /**
- * The format parameter determines what format is.gd uses to send output back to you (e.g. to
- * tell you what your new shortened URL is or if an error has occurred).
- */
- fun format(format: Format): Builder = apply { this.format = format }
-
- /**
- * Shorten using the `v.gd` domain.
- */
- fun isVgd(isVgd: Boolean): Builder = apply { this.isVgd = isVgd }
-
- /**
- * Builds a new configuration.
- */
- fun build() = ShortenConfig(this)
- }
-}
diff --git a/src/test/kotlin/net/thauvin/erik/isgd/IsgdTest.kt b/src/test/kotlin/net/thauvin/erik/isgd/IsgdTest.kt
index 8048362..9ec930a 100644
--- a/src/test/kotlin/net/thauvin/erik/isgd/IsgdTest.kt
+++ b/src/test/kotlin/net/thauvin/erik/isgd/IsgdTest.kt
@@ -1,7 +1,7 @@
/*
* IsgdTest.kt
*
- * Copyright 2020-2025 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2023 Erik C. Thauvin (erik@thauvin.net)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -66,7 +66,7 @@ class IsgdTest {
assertFailsWith(
message = "shorten(config:duplicate)",
exceptionClass = IsgdException::class,
- block = { Isgd.shorten(ShortenConfig.Builder(shortUrl).build()) }
+ block = { Isgd.shorten(Config.Builder().url(shortUrl).build()) }
)
}
@@ -84,7 +84,7 @@ class IsgdTest {
assertFailsWith(
message = "lookup(config:empty)",
exceptionClass = IllegalArgumentException::class,
- block = { Isgd.lookup(LookupConfig.Builder("").build()) }
+ block = { Isgd.lookup(Config.Builder().shortUrl("").build()) }
)
}
@@ -96,10 +96,10 @@ class IsgdTest {
@Test
fun testLookupDefaultConfig() {
- assertEquals(url, Isgd.lookup(LookupConfig.Builder(shortUrl).build()), "lookup(config)")
+ assertEquals(url, Isgd.lookup(Config.Builder().shortUrl(shortUrl).build()), "lookup(config)")
assertEquals(
url, Isgd.lookup(
- LookupConfig.Builder(shortVgdUrl).isVgd(true).build()
+ Config.Builder().shortUrl(shortVgdUrl).isVgd(true).build()
), "lookup(config:isVgd)"
)
}
@@ -119,12 +119,12 @@ class IsgdTest {
fun testLookupJsonConfig() {
assertEquals(
"{ \"url\": \"$url\" }",
- Isgd.lookup(LookupConfig.Builder(shortUrl).format(Format.JSON).build()), "lookup(config)"
+ Isgd.lookup(Config.Builder().shortUrl(shortUrl).format(Format.JSON).build()), "lookup(config)"
)
assertEquals(
"test({ \"url\": \"$url\" });",
- Isgd.lookup(LookupConfig.Builder(shortUrl).callback("test").format(Format.JSON).build()),
+ Isgd.lookup(Config.Builder().shortUrl(shortUrl).callback("test").format(Format.JSON).build()),
"lookup(config:callback)"
)
}
@@ -141,7 +141,7 @@ class IsgdTest {
fun testLookupXmlConfig() {
assertEquals(
"$url ",
- Isgd.lookup(LookupConfig.Builder(shortUrl).format(Format.XML).build()),
+ Isgd.lookup(Config.Builder().shortUrl(shortUrl).format(Format.XML).build()),
"lookup(config:xml)"
)
}
@@ -166,13 +166,13 @@ class IsgdTest {
assertFailsWith(
message = "shorten(config:empty)",
exceptionClass = IllegalArgumentException::class,
- block = { Isgd.shorten(ShortenConfig.Builder("").build()) }
+ block = { Isgd.shorten(Config.Builder().url("").build()) }
)
assertFailsWith(
message = "shorten(config:shorturl)",
exceptionClass = IsgdException::class,
- block = { Isgd.shorten(ShortenConfig.Builder(url).shorturl("test").build()) }
+ block = { Isgd.shorten(Config.Builder(url).shortUrl("test").build()) }
)
}
@@ -185,13 +185,13 @@ class IsgdTest {
@Test
fun testShortenDefaultConfig() {
- assertEquals(shortUrl, Isgd.shorten(ShortenConfig.Builder(url).build()), "shorten(config:url)")
+ assertEquals(shortUrl, Isgd.shorten(Config.Builder().url(url).build()), "shorten(config:url)")
assertEquals(
shortVgdUrl,
- Isgd.shorten(ShortenConfig.Builder(url).isVgd(true).build()),
+ Isgd.shorten(Config.Builder().url(url).isVgd(true).build()),
"shorten(config:isVgd)"
)
- assertThat(Isgd.shorten(ShortenConfig.Builder(url).logstats(true).build()), "shorten(config:callback)")
+ assertThat(Isgd.shorten(Config.Builder().url(url).logStats(true).build()), "shorten(config:callback)")
.matches("https://is.gd/\\w{6}".toRegex())
}
@@ -209,11 +209,11 @@ class IsgdTest {
fun testShortenJsonConfig() {
assertEquals(
"{ \"shorturl\": \"$shortUrl\" }",
- Isgd.shorten(ShortenConfig.Builder(url).format(Format.JSON).build()), "shorten(config:json)"
+ Isgd.shorten(Config.Builder().url(url).format(Format.JSON).build()), "shorten(config:json)"
)
assertEquals(
"test({ \"shorturl\": \"$shortUrl\" });",
- Isgd.shorten(ShortenConfig.Builder(url).callback("test").format(Format.JSON).build()),
+ Isgd.shorten(Config.Builder().url(url).callback("test").format(Format.JSON).build()),
"shorten(config:callback,json)"
)
}
@@ -232,7 +232,7 @@ class IsgdTest {
assertEquals(
"" +
"$shortUrl ",
- Isgd.shorten(ShortenConfig.Builder(url).format(Format.XML).build()),
+ Isgd.shorten(Config.Builder().url(url).format(Format.XML).build()),
"shorten(config:xml)"
)
}
@@ -244,7 +244,7 @@ class IsgdTest {
@Test
fun testShortenWebConfig() {
- assertThat(Isgd.shorten(ShortenConfig.Builder(url).format(Format.WEB).build()), "shorten(config:web)")
+ assertThat(Isgd.shorten(Config.Builder().url(url).format(Format.WEB).build()), "shorten(config:web)")
.contains(shortUrl)
}
}
diff --git a/version.properties b/version.properties
new file mode 100644
index 0000000..4b9c7b3
--- /dev/null
+++ b/version.properties
@@ -0,0 +1,8 @@
+#Generated by the Semver Plugin for Gradle
+#Sun May 02 21:57:08 PDT 2021
+version.buildmeta=
+version.major=1
+version.minor=0
+version.patch=0
+version.prerelease=
+version.semver=1.0.0