Added examples
This commit is contained in:
parent
8cb6ac4c0b
commit
3517acf544
10 changed files with 139 additions and 33 deletions
|
@ -3,6 +3,5 @@
|
||||||
<ManuallySuppressedIssues/>
|
<ManuallySuppressedIssues/>
|
||||||
<CurrentIssues>
|
<CurrentIssues>
|
||||||
<ID>ThrowsCount:CryptoPrice.kt$CryptoPrice.Companion$ @JvmStatic @JvmOverloads @Throws(CryptoException::class) fun apiCall(paths: List<String>, params: Map<String, String> = emptyMap()): String</ID>
|
<ID>ThrowsCount:CryptoPrice.kt$CryptoPrice.Companion$ @JvmStatic @JvmOverloads @Throws(CryptoException::class) fun apiCall(paths: List<String>, params: Map<String, String> = emptyMap()): String</ID>
|
||||||
<ID>UtilityClassWithPublicConstructor:CryptoPrice.kt$CryptoPrice</ID>
|
|
||||||
</CurrentIssues>
|
</CurrentIssues>
|
||||||
</SmellBaseline>
|
</SmellBaseline>
|
||||||
|
|
|
@ -102,24 +102,6 @@ tasks {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val copyToDeploy by registering(Copy::class) {
|
|
||||||
from(configurations.runtimeClasspath) {
|
|
||||||
exclude("annotations-*.jar")
|
|
||||||
}
|
|
||||||
from(jar)
|
|
||||||
into(deployDir)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
register("deploy") {
|
|
||||||
description = "Copies all needed files to the $deployDir directory."
|
|
||||||
group = PublishingPlugin.PUBLISH_TASK_GROUP
|
|
||||||
dependsOn("build", "jar")
|
|
||||||
outputs.dir(deployDir)
|
|
||||||
inputs.files(copyToDeploy)
|
|
||||||
mustRunAfter("clean")
|
|
||||||
}
|
|
||||||
|
|
||||||
"sonarqube" {
|
"sonarqube" {
|
||||||
dependsOn("jacocoTestReport")
|
dependsOn("jacocoTestReport")
|
||||||
}
|
}
|
||||||
|
|
6
examples/.gitattributes
vendored
Normal file
6
examples/.gitattributes
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#
|
||||||
|
# https://help.github.com/articles/dealing-with-line-endings/
|
||||||
|
#
|
||||||
|
# These are explicitly windows files and should use crlf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
|
5
examples/.gitignore
vendored
Normal file
5
examples/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Ignore Gradle project-specific cache directory
|
||||||
|
.gradle
|
||||||
|
|
||||||
|
# Ignore Gradle build output directory
|
||||||
|
build
|
31
examples/build.gradle.kts
Normal file
31
examples/build.gradle.kts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
plugins {
|
||||||
|
id("org.jetbrains.kotlin.jvm") version "1.5.0"
|
||||||
|
id("com.github.ben-manes.versions") version "0.38.0"
|
||||||
|
application
|
||||||
|
}
|
||||||
|
|
||||||
|
// ./gradlew run
|
||||||
|
// ./gradlew runJava"
|
||||||
|
|
||||||
|
defaultTasks(ApplicationPlugin.TASK_RUN_NAME)
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation("net.thauvin.erik:cryptoprice:0.9.0-SNAPSHOT")
|
||||||
|
}
|
||||||
|
|
||||||
|
application {
|
||||||
|
mainClassName = "com.example.CryptoPriceExampleKt"
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
register<JavaExec>("runJava") {
|
||||||
|
group = "application"
|
||||||
|
main = "com.example.CryptoPriceSample"
|
||||||
|
classpath = sourceSets["main"].runtimeClasspath
|
||||||
|
}
|
||||||
|
}
|
10
examples/settings.gradle.kts
Normal file
10
examples/settings.gradle.kts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* This file was generated by the Gradle 'init' task.
|
||||||
|
*
|
||||||
|
* The settings file is used to specify which projects to include in your build.
|
||||||
|
*
|
||||||
|
* Detailed information about configuring a multi-project build in Gradle can be found
|
||||||
|
* in the user manual at https://docs.gradle.org/6.5.1/userguide/multi_project_builds.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
rootProject.name = "examples"
|
41
examples/src/main/java/com/example/CryptoPriceSample.java
Normal file
41
examples/src/main/java/com/example/CryptoPriceSample.java
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
package com.example;
|
||||||
|
|
||||||
|
import net.thauvin.erik.crypto.CryptoPrice;
|
||||||
|
import net.thauvin.erik.crypto.CryptoException;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class CryptoPriceSample {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
// Get current Bitcoin market price.
|
||||||
|
final CryptoPrice price = CryptoPrice.marketPrice("BTC");
|
||||||
|
System.out.println("The current Bitcoin price is " + price.getAmount() + " in " + price.getCurrency());
|
||||||
|
|
||||||
|
// Get current Bitcoin market price in Euros.
|
||||||
|
final CryptoPrice euroPrice = CryptoPrice.marketPrice("BTC", "EUR");
|
||||||
|
System.out.println("The current Bitcoin price is " + euroPrice.getAmount() + " in Euros");
|
||||||
|
|
||||||
|
// Get current Bitcoin buy price using API.
|
||||||
|
final CryptoPrice buyPrice =
|
||||||
|
CryptoPrice.toPrice(
|
||||||
|
CryptoPrice.apiCall(
|
||||||
|
List.of("prices", "BTC-USD", "buy"),
|
||||||
|
Collections.<String, String>emptyMap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
System.out.println("The current BTC buy price is " + price.getAmount() + " in " + price.getCurrency());
|
||||||
|
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
// Get current Ethereum market price in Pound sterling.
|
||||||
|
final CryptoPrice gbpPrice = CryptoPrice.marketPrice("ETH", "GBP");
|
||||||
|
System.out.println("The current Ethereum price is " + gbpPrice.getAmount() + " in Pound sterling");
|
||||||
|
|
||||||
|
} catch (CryptoException e) {
|
||||||
|
System.err.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
examples/src/main/kotlin/com/example/CryptoPriceExample.kt
Normal file
25
examples/src/main/kotlin/com/example/CryptoPriceExample.kt
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package com.example
|
||||||
|
|
||||||
|
import net.thauvin.erik.crypto.CryptoPrice.Companion.marketPrice
|
||||||
|
import net.thauvin.erik.crypto.CryptoPrice.Companion.apiCall
|
||||||
|
import net.thauvin.erik.crypto.CryptoPrice.Companion.toPrice
|
||||||
|
|
||||||
|
fun main(@Suppress("UNUSED_PARAMETER") args: Array<String>) {
|
||||||
|
// Get current Bitcoin market price.
|
||||||
|
var price = marketPrice("BTC")
|
||||||
|
println("The current Bitcoin price is ${price.amount} in ${price.currency}")
|
||||||
|
|
||||||
|
// Get current Bitcoin market price in Euro.
|
||||||
|
var euroPrice = marketPrice("BTC", "EUR")
|
||||||
|
println("The current Bitcoin price is ${euroPrice.amount} in Euros")
|
||||||
|
|
||||||
|
// Get current Bitcoin buy price using API.
|
||||||
|
var buyPrice = apiCall(listOf("prices", "BTC-USD", "buy"), emptyMap()).toPrice()
|
||||||
|
println("The current BTC buy price is ${buyPrice.amount} in ${buyPrice.currency}")
|
||||||
|
|
||||||
|
println()
|
||||||
|
|
||||||
|
// Get current Ethereum market price in Pound sterling.
|
||||||
|
var gbpPrice = marketPrice("ETH", "GBP")
|
||||||
|
println("The current Ehtereum price is ${gbpPrice.amount} in Pound sterling")
|
||||||
|
}
|
|
@ -40,23 +40,29 @@ import java.io.IOException
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
|
|
||||||
data class Price(val base: String, val currency: String, val amount: Double)
|
/**
|
||||||
|
* The `CryptoPrice` class
|
||||||
|
*/
|
||||||
|
open class CryptoPrice(val base: String, val currency: String, val amount: Double) {
|
||||||
|
companion object {
|
||||||
|
// Coinbase API URL
|
||||||
|
private const val COINBASE_API_URL = "https://api.coinbase.com/v2/"
|
||||||
|
|
||||||
fun String.toPrice(): Price {
|
@JvmStatic
|
||||||
|
fun String.toPrice(): CryptoPrice {
|
||||||
val json = JSONObject(this)
|
val json = JSONObject(this)
|
||||||
if (json.has("data")) {
|
if (json.has("data")) {
|
||||||
val data = json.getJSONObject("data")
|
val data = json.getJSONObject("data")
|
||||||
return Price(data.getString("base"), data.getString("currency"), data.getString("amount").toDouble())
|
return CryptoPrice(
|
||||||
|
data.getString("base"),
|
||||||
|
data.getString("currency"),
|
||||||
|
data.getString("amount").toDouble()
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
throw CryptoException("Missing JSON data.")
|
throw CryptoException("Missing JSON data.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class CryptoPrice private constructor() {
|
|
||||||
companion object {
|
|
||||||
// Coinbase API URL
|
|
||||||
private const val COINBASE_API_URL = "https://api.coinbase.com/v2/"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make an API call.
|
* Make an API call.
|
||||||
*/
|
*/
|
||||||
|
@ -105,7 +111,7 @@ open class CryptoPrice private constructor() {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
@Throws(CryptoException::class)
|
@Throws(CryptoException::class)
|
||||||
fun marketPrice(base: String, currency: String = "USD", date: LocalDate? = null): Price {
|
fun marketPrice(base: String, currency: String = "USD", date: LocalDate? = null): CryptoPrice {
|
||||||
val params = mutableMapOf<String, String>()
|
val params = mutableMapOf<String, String>()
|
||||||
if (date != null) {
|
if (date != null) {
|
||||||
params.put("date", "$date")
|
params.put("date", "$date")
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.thauvin.erik.crypto
|
package net.thauvin.erik.crypto
|
||||||
|
|
||||||
import net.thauvin.erik.crypto.CryptoPrice.Companion.marketPrice
|
import net.thauvin.erik.crypto.CryptoPrice.Companion.marketPrice
|
||||||
|
import net.thauvin.erik.crypto.CryptoPrice.Companion.toPrice
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFailsWith
|
import kotlin.test.assertFailsWith
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue