From 3ccc0dd265815302a0c25f48067d08a91f1d2bf6 Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Tue, 20 Aug 2024 20:25:25 +0200 Subject: [PATCH] First attempt at spring boot autoconfiguration --- build.gradle | 25 +---------- libllamascript/build.gradle | 34 ++++++++++++++ .../llamascript/LLamaScriptException.java | 0 .../llamascript/LLamaScriptFactory.java | 0 .../seeseemelk/llamascript/LlamaScript.java | 0 .../llamascript/LlamaScriptWorker.java | 0 .../llamascript/arguments/ArgumentBag.java | 0 .../llamascript/AbstractLlamaTest.java | 0 .../seeseemelk/llamascript/BooleanTests.java | 0 .../seeseemelk/llamascript/IntegerTests.java | 0 .../seeseemelk/llamascript/StringTests.java | 0 settings.gradle | 4 +- spring-llamascript-starter/build.gradle | 40 +++++++++++++++++ .../LlamaScriptAutoConfiguration.java | 31 +++++++++++++ .../autoconfigure/LlamaScriptProperties.java | 13 ++++++ .../main/resources/META-INF/spring.factories | 2 + .../llamascript/AbstractLlamaTest.java | 12 +++++ .../seeseemelk/llamascript/BooleanTests.java | 26 +++++++++++ .../seeseemelk/llamascript/IntegerTests.java | 41 +++++++++++++++++ .../seeseemelk/llamascript/StringTests.java | 44 +++++++++++++++++++ 20 files changed, 247 insertions(+), 25 deletions(-) create mode 100644 libllamascript/build.gradle rename {src => libllamascript/src}/main/java/be/seeseemelk/llamascript/LLamaScriptException.java (100%) rename {src => libllamascript/src}/main/java/be/seeseemelk/llamascript/LLamaScriptFactory.java (100%) rename {src => libllamascript/src}/main/java/be/seeseemelk/llamascript/LlamaScript.java (100%) rename {src => libllamascript/src}/main/java/be/seeseemelk/llamascript/LlamaScriptWorker.java (100%) rename {src => libllamascript/src}/main/java/be/seeseemelk/llamascript/arguments/ArgumentBag.java (100%) rename {src => libllamascript/src}/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java (100%) rename {src => libllamascript/src}/test/java/be/seeseemelk/llamascript/BooleanTests.java (100%) rename {src => libllamascript/src}/test/java/be/seeseemelk/llamascript/IntegerTests.java (100%) rename {src => libllamascript/src}/test/java/be/seeseemelk/llamascript/StringTests.java (100%) create mode 100644 spring-llamascript-starter/build.gradle create mode 100644 spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptAutoConfiguration.java create mode 100644 spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptProperties.java create mode 100644 spring-llamascript-starter/src/main/resources/META-INF/spring.factories create mode 100644 spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java create mode 100644 spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/BooleanTests.java create mode 100644 spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/IntegerTests.java create mode 100644 spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/StringTests.java diff --git a/build.gradle b/build.gradle index 86d8ef1..68e9c24 100644 --- a/build.gradle +++ b/build.gradle @@ -1,34 +1,11 @@ plugins { - id 'java' - id 'io.freefair.lombok' version '8.10' id 'maven-publish' } group = 'be.seeseemelk' -version = '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} - -dependencies { - implementation 'io.github.ollama4j:ollama4j:1.0.82' - - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'org.hamcrest:hamcrest:3.0' -} - -test { - useJUnitPlatform() -} +version = '0.1-SNAPSHOT' publishing { - publications { - library(MavenPublication) { - from components.java - } - } repositories { maven { name = "Gitea" diff --git a/libllamascript/build.gradle b/libllamascript/build.gradle new file mode 100644 index 0000000..6df20b6 --- /dev/null +++ b/libllamascript/build.gradle @@ -0,0 +1,34 @@ +plugins { + id 'java' + id 'io.freefair.lombok' version '8.10' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'io.github.ollama4j:ollama4j:1.0.82' + + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.hamcrest:hamcrest:3.0' +} + +test { + useJUnitPlatform() +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + libllamascript(MavenPublication) { + from components.java + artifactId 'libllamascript' + } + } +} diff --git a/src/main/java/be/seeseemelk/llamascript/LLamaScriptException.java b/libllamascript/src/main/java/be/seeseemelk/llamascript/LLamaScriptException.java similarity index 100% rename from src/main/java/be/seeseemelk/llamascript/LLamaScriptException.java rename to libllamascript/src/main/java/be/seeseemelk/llamascript/LLamaScriptException.java diff --git a/src/main/java/be/seeseemelk/llamascript/LLamaScriptFactory.java b/libllamascript/src/main/java/be/seeseemelk/llamascript/LLamaScriptFactory.java similarity index 100% rename from src/main/java/be/seeseemelk/llamascript/LLamaScriptFactory.java rename to libllamascript/src/main/java/be/seeseemelk/llamascript/LLamaScriptFactory.java diff --git a/src/main/java/be/seeseemelk/llamascript/LlamaScript.java b/libllamascript/src/main/java/be/seeseemelk/llamascript/LlamaScript.java similarity index 100% rename from src/main/java/be/seeseemelk/llamascript/LlamaScript.java rename to libllamascript/src/main/java/be/seeseemelk/llamascript/LlamaScript.java diff --git a/src/main/java/be/seeseemelk/llamascript/LlamaScriptWorker.java b/libllamascript/src/main/java/be/seeseemelk/llamascript/LlamaScriptWorker.java similarity index 100% rename from src/main/java/be/seeseemelk/llamascript/LlamaScriptWorker.java rename to libllamascript/src/main/java/be/seeseemelk/llamascript/LlamaScriptWorker.java diff --git a/src/main/java/be/seeseemelk/llamascript/arguments/ArgumentBag.java b/libllamascript/src/main/java/be/seeseemelk/llamascript/arguments/ArgumentBag.java similarity index 100% rename from src/main/java/be/seeseemelk/llamascript/arguments/ArgumentBag.java rename to libllamascript/src/main/java/be/seeseemelk/llamascript/arguments/ArgumentBag.java diff --git a/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java b/libllamascript/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java similarity index 100% rename from src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java rename to libllamascript/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java diff --git a/src/test/java/be/seeseemelk/llamascript/BooleanTests.java b/libllamascript/src/test/java/be/seeseemelk/llamascript/BooleanTests.java similarity index 100% rename from src/test/java/be/seeseemelk/llamascript/BooleanTests.java rename to libllamascript/src/test/java/be/seeseemelk/llamascript/BooleanTests.java diff --git a/src/test/java/be/seeseemelk/llamascript/IntegerTests.java b/libllamascript/src/test/java/be/seeseemelk/llamascript/IntegerTests.java similarity index 100% rename from src/test/java/be/seeseemelk/llamascript/IntegerTests.java rename to libllamascript/src/test/java/be/seeseemelk/llamascript/IntegerTests.java diff --git a/src/test/java/be/seeseemelk/llamascript/StringTests.java b/libllamascript/src/test/java/be/seeseemelk/llamascript/StringTests.java similarity index 100% rename from src/test/java/be/seeseemelk/llamascript/StringTests.java rename to libllamascript/src/test/java/be/seeseemelk/llamascript/StringTests.java diff --git a/settings.gradle b/settings.gradle index 6bdb82e..398f5c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,4 @@ -rootProject.name = 'libllamascript' +rootProject.name = 'llamascript' +include('libllamascript') +include('spring-llamascript-starter') diff --git a/spring-llamascript-starter/build.gradle b/spring-llamascript-starter/build.gradle new file mode 100644 index 0000000..651a82b --- /dev/null +++ b/spring-llamascript-starter/build.gradle @@ -0,0 +1,40 @@ +plugins { + id 'java' + id 'io.freefair.lombok' version '8.10' + id 'org.springframework.boot' version '3.3.2' +} + +apply plugin: 'io.spring.dependency-management' + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':libllamascript') + implementation 'org.springframework.boot:spring-boot' + implementation 'org.springframework.boot:spring-boot-autoconfigure' + implementation 'org.springframework.boot:spring-boot-configuration-processor' + + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.hamcrest:hamcrest:3.0' +} + +test { + useJUnitPlatform() +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + springLlamascriptStarter(MavenPublication) { + from components.java + artifactId 'spring-llamascript-starter' + } + } +} diff --git a/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptAutoConfiguration.java b/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptAutoConfiguration.java new file mode 100644 index 0000000..236e942 --- /dev/null +++ b/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptAutoConfiguration.java @@ -0,0 +1,31 @@ +package be.seeseemelk.llamascript.autoconfigure; + +import be.seeseemelk.llamascript.LLamaScriptFactory; +import be.seeseemelk.llamascript.LlamaScript; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(LlamaScriptProperties.class) +public class LlamaScriptAutoConfiguration { + @Autowired + private LlamaScriptProperties properties; + + @Bean + @ConditionalOnMissingBean + public LLamaScriptFactory lLamaScriptFactory() { + var factory = new LLamaScriptFactory(); + factory.setHost(properties.getHost()); + factory.setModel(properties.getModel()); + return factory; + } + + @Bean + @ConditionalOnMissingBean + public LlamaScript llamaScript(LLamaScriptFactory factory) { + return factory.build(); + } +} diff --git a/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptProperties.java b/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptProperties.java new file mode 100644 index 0000000..4db5720 --- /dev/null +++ b/spring-llamascript-starter/src/main/java/be/seeseemelk/llamascript/autoconfigure/LlamaScriptProperties.java @@ -0,0 +1,13 @@ +package be.seeseemelk.llamascript.autoconfigure; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Getter +@Setter +@ConfigurationProperties(prefix = "llamascript") +public class LlamaScriptProperties { + private String host = "http://localhost:11434"; + private String model = "llama3.1:8b"; +} diff --git a/spring-llamascript-starter/src/main/resources/META-INF/spring.factories b/spring-llamascript-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a2a426e --- /dev/null +++ b/spring-llamascript-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + be.seeseemelk.llamascript.autoconfigure.LlamaScriptAutoConfiguration diff --git a/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java new file mode 100644 index 0000000..a5a58af --- /dev/null +++ b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/AbstractLlamaTest.java @@ -0,0 +1,12 @@ +package be.seeseemelk.llamascript; + +import org.junit.jupiter.api.BeforeEach; + +public class AbstractLlamaTest { + protected LlamaScript llama; + + @BeforeEach + void setUp() { + llama = new LLamaScriptFactory().build(); + } +} diff --git a/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/BooleanTests.java b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/BooleanTests.java new file mode 100644 index 0000000..3462822 --- /dev/null +++ b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/BooleanTests.java @@ -0,0 +1,26 @@ +package be.seeseemelk.llamascript; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +public class BooleanTests extends AbstractLlamaTest { + @ParameterizedTest + @ValueSource(ints = {0, 1, 2, 3, 4, 5}) + void isEven(int number) { + boolean isEven = llama.evalBool("Return true if the number is even", number); + assertThat(isEven, equalTo(number % 2 == 0)); + } + + @Test + void isABuilding() { + boolean isBuilding = llama.evalBool("Return true if the argument is a building or skyscraper", "Dalai Lama"); + assertThat(isBuilding, equalTo(false)); + + isBuilding = llama.evalBool("Return true if the argument is a building or skyscraper", "Burj Khalifa"); + assertThat(isBuilding, equalTo(true)); + } +} diff --git a/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/IntegerTests.java b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/IntegerTests.java new file mode 100644 index 0000000..f517e29 --- /dev/null +++ b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/IntegerTests.java @@ -0,0 +1,41 @@ +package be.seeseemelk.llamascript; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +public class IntegerTests extends AbstractLlamaTest { + @Test + void canIncrementNumber() { + int value = llama.evalInt("Increment the number", 4); + assertThat(value, equalTo(5)); + } + + @Test + void canMultiply() { + int value = llama.evalInt("Multiply the numbers", 2, 3); + assertThat(value, equalTo(2*3)); + } + + @Test + void canMax() { + int value = llama.evalInt("Select the largest number", -2, 8); + assertThat(value, equalTo(8)); + } + + @Test + void canDoWeirdStuff() { + int value = llama.evalInt("Select the number with the most '5's in it.", 12, 5, 1023978, 158525); + assertThat(value, equalTo(158525)); + } + + @Test + void givePositivity() { + int value = llama.evalInt("If the string is something positive, return 1. Else, return 0.", "I like rainbows"); + assertThat(value, equalTo(1)); + + value = llama.evalInt("If the string is something positive, return 1. Else, return 0.", "Death to all"); + assertThat(value, equalTo(0)); + } +} diff --git a/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/StringTests.java b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/StringTests.java new file mode 100644 index 0000000..789ebd4 --- /dev/null +++ b/spring-llamascript-starter/src/test/java/be/seeseemelk/llamascript/StringTests.java @@ -0,0 +1,44 @@ +package be.seeseemelk.llamascript; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +public class StringTests extends AbstractLlamaTest { + @Test + void canUppercase() { + String value = llama.evalString("Return the string in uppercase", "Cat"); + assertThat(value, equalTo("CAT")); + } + + @Test + void canLowercase() { + String value = llama.evalString("Return the string in lowercase", "Cat"); + assertThat(value, equalTo("cat")); + } + + @Test + void canInvert() { + String value = llama.evalString("Return the string backwards", "Cat"); + assertThat(value, equalTo("taC")); + } + + @Test + void canSelectLongest() { + String value = llama.evalString("Return the longest string", "Cat", "Dog", "Horse"); + assertThat(value, equalTo("Horse")); + } + + @Test + void canDoWeirdStuff() { + String value = llama.evalString("Return the string that does not fit", "Cat", "Dog", "Horse", "Bicycle"); + assertThat(value, equalTo("Bicycle")); + } + + @Test + void canDoReallyWeirdStuff() { + String value = llama.evalString("Sort the letters alphabetically", "horse"); + assertThat(value, equalTo("ehors")); + } +}