From 826d8a24f2ad3c83c5283855a052fc7ae282c21f Mon Sep 17 00:00:00 2001 From: Tristan Date: Tue, 25 Jul 2017 22:53:56 +0200 Subject: [PATCH 1/4] Import sample code --- .gitignore | 2 + build.gradle | 34 ++++ gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ libs/softwareneedsyou-api-0.0.4.jar | Bin 0 -> 16944 bytes settings.gradle | 1 + .../plugins/compile/python/CompilerEx.java | 81 +++++++++ .../compile/python/CompilerExDeclare.java | 63 +++++++ .../plugins/compile/python/package-info.java | 6 + .../plugins/compile/python/LibraryTest.java | 18 ++ 11 files changed, 467 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libs/softwareneedsyou-api-0.0.4.jar create mode 100644 settings.gradle create mode 100644 src/main/java/fr/sny/plugins/compile/python/CompilerEx.java create mode 100644 src/main/java/fr/sny/plugins/compile/python/CompilerExDeclare.java create mode 100644 src/main/java/fr/sny/plugins/compile/python/package-info.java create mode 100644 src/test/java/fr/sny/plugins/compile/python/LibraryTest.java diff --git a/.gitignore b/.gitignore index 6143e53..859b6f3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +/.gradle/ +/bin/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..8de5f61 --- /dev/null +++ b/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'java-library' + +repositories { + // Use jcenter for resolving your dependencies. + // You can declare any Maven/Ivy/file repository here. + jcenter() +} + +version = '0.0.2' +project.group = 'fr.sny.example.plugin.compile' + +sourceCompatibility = JavaVersion.VERSION_1_8 //1.8 +targetCompatibility = JavaVersion.VERSION_1_8 //1.8 + +dependencies { + // This dependency is exported to consumers, that is to say found on their compile classpath. + //api 'org.apache.commons:commons-math3:3.6.1' + + // This dependency is used internally, and not exposed to consumers on their own compile classpath. + //implementation 'com.google.guava:guava:21.0' + + compile group: 'org.kohsuke.metainf-services', name: 'metainf-services', version: '1.+' + compile fileTree(dir: 'libs', include: '*.jar') + + // Use JUnit test framework + testImplementation 'junit:junit:4.+' +} + +jar { + manifest { + attributes 'Implementation-Title': project.name, + 'Implementation-Version': "$version" + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..9eee009 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Jul 17 20:22:55 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4453cce --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" + which java >/dev/null 2>&1 || 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 + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/softwareneedsyou-api-0.0.4.jar b/libs/softwareneedsyou-api-0.0.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..6e9a4778364d26d16b1d8303275464835a754bf3 GIT binary patch literal 16944 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 literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..2c9ebf7 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'sny-plugin-compiler-python' diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java b/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java new file mode 100644 index 0000000..c4437f2 --- /dev/null +++ b/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java @@ -0,0 +1,81 @@ +/** + * + */ +package fr.sny.plugins.compile.python; + +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import fr.esgi.projet.softwareneedsyou.api.ConsoleOutput; +import fr.esgi.projet.softwareneedsyou.api.compiler.CompilerException; +import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler; +import fr.esgi.projet.softwareneedsyou.api.compiler.ResultCompiler; +import fr.esgi.projet.softwareneedsyou.api.compiler.ResultTest; +import fr.esgi.projet.softwareneedsyou.api.compiler.TestState; + +/** + * @author Tristan + * + */ +public class CompilerEx implements PluginCompiler { + + /** + * + */ + public CompilerEx() { + // TODO Auto-generated constructor stub + } + + /* (non-Javadoc) + * @see java.lang.AutoCloseable#close() + */ + @Override + public void close() throws Exception { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#compileAndTest() + */ + @Override + public ResultCompiler compileAndTest(final String code, final InputStream testsDef, final ConsoleOutput console) throws CompilerException { + //TODO: compile the code + if(true) { + ResultCompiler result = new ResultCompiler(true); + //TODO: run tests + List tests = Arrays.asList(1, 2, 3, 4); + for(Integer i : tests) { + //if(file.test[i].run()) + ResultTest res = new ResultTest(); + if(i%2 == 0) { + res.setState(TestState.SUCCESS); + result.addResultTest(i, res); + } else { + res.setState(i%3==0 ? TestState.FAIL : TestState.WARNING); + res.setDetail("details of error"); + result.addResultTest(i, res); + } + } + return result; + } else + return new ResultCompiler(false); + } + + private final static Set languages = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("MyLanguage", "OtherLanguage"))); + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#getLngSupported() + */ + @Override + public Set getLngSupported() { + return languages; + } + +} diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerExDeclare.java b/src/main/java/fr/sny/plugins/compile/python/CompilerExDeclare.java new file mode 100644 index 0000000..089cbd3 --- /dev/null +++ b/src/main/java/fr/sny/plugins/compile/python/CompilerExDeclare.java @@ -0,0 +1,63 @@ +/** + * + */ +package fr.sny.plugins.compile.python; + +import java.util.Map; +import java.util.UUID; + +import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler; +import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompilerDeclare; +import fr.esgi.projet.softwareneedsyou.api.spi.InitialisationException; + +/** + * @author Tristan + * + */ +public class CompilerExDeclare implements PluginCompilerDeclare { + private final static UUID uid = UUID.fromString("d40a12f4-5c80-42f4-8b05-5a5b466c620c"); + + /** + * + */ + public CompilerExDeclare() { + // TODO Auto-generated constructor stub + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.spi.PluginDescriptor#getDescription() + */ + @Override + public String getDescription() { + // TODO Auto-generated method stub + return "a example of description"; + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.spi.PluginDescriptor#getID() + */ + @Override + public UUID getID() { + // TODO Auto-generated method stub + return uid; + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.spi.PluginDescriptor#getInstance(java.util.Map) + */ + @Override + public PluginCompiler getInstance(Map arg0) throws InitialisationException { + // TODO Auto-generated method stub + return new CompilerEx(); + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.spi.PluginDescriptor#getResume() + */ + @Override + public String getResume() { + // TODO Auto-generated method stub + return "a short example"; + } + +} diff --git a/src/main/java/fr/sny/plugins/compile/python/package-info.java b/src/main/java/fr/sny/plugins/compile/python/package-info.java new file mode 100644 index 0000000..41aab62 --- /dev/null +++ b/src/main/java/fr/sny/plugins/compile/python/package-info.java @@ -0,0 +1,6 @@ +/** + * Implémentation d'un plugin Compiler pour le Python. + * + * @author SNY + */ +package fr.sny.plugins.compile.python; \ No newline at end of file diff --git a/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java new file mode 100644 index 0000000..0efa356 --- /dev/null +++ b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java @@ -0,0 +1,18 @@ +package fr.sny.plugins.compile.python; +/* + * This Java source file was generated by the Gradle 'init' task. + */ +import org.junit.Test; + +import fr.sny.plugins.compile.python.CompilerExDeclare; + +import static org.junit.Assert.*; + +import java.util.UUID; + +public class LibraryTest { + @Test public void testSomeLibraryMethod() { + CompilerExDeclare classUnderTest = new CompilerExDeclare(); + assertTrue("yours tests here", UUID.fromString("00000000-0000-0000-0000-000000000000").compareTo(classUnderTest.getID()) == 0); + } +} From 515fe5d66c971ab59a5f7821672fccd10648bfa0 Mon Sep 17 00:00:00 2001 From: Tristan Date: Wed, 26 Jul 2017 00:29:49 +0200 Subject: [PATCH 2/4] Implementation plugin --- build.gradle | 4 +++- ...0.4.jar => softwareneedsyou-api-0.0.6.jar} | Bin 16944 -> 17606 bytes ...eclare.java => CompilerPythonDeclare.java} | 17 ++++++----------- .../plugins/compile/python/LibraryTest.java | 4 ++-- 4 files changed, 11 insertions(+), 14 deletions(-) rename libs/{softwareneedsyou-api-0.0.4.jar => softwareneedsyou-api-0.0.6.jar} (65%) rename src/main/java/fr/sny/plugins/compile/python/{CompilerExDeclare.java => CompilerPythonDeclare.java} (68%) diff --git a/build.gradle b/build.gradle index 8de5f61..eb4cba4 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ repositories { jcenter() } -version = '0.0.2' +version = '0.0.4' project.group = 'fr.sny.example.plugin.compile' sourceCompatibility = JavaVersion.VERSION_1_8 //1.8 @@ -19,6 +19,8 @@ dependencies { // This dependency is used internally, and not exposed to consumers on their own compile classpath. //implementation 'com.google.guava:guava:21.0' + compile group: 'org.apache.commons', name: 'commons-io', version: '1.3+' + compile group: 'org.kohsuke.metainf-services', name: 'metainf-services', version: '1.+' compile fileTree(dir: 'libs', include: '*.jar') diff --git a/libs/softwareneedsyou-api-0.0.4.jar b/libs/softwareneedsyou-api-0.0.6.jar similarity index 65% rename from libs/softwareneedsyou-api-0.0.4.jar rename to libs/softwareneedsyou-api-0.0.6.jar index 6e9a4778364d26d16b1d8303275464835a754bf3..280c304a6248d54ad1d243e06e67c47385334ed2 100644 GIT binary patch delta 3562 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 jk8##i1D=OsDm39hZ760*QAn delta 2959 zcmY*bc{r47AD$VM5wfNjjA`sy8p2p6W8Y0kB073VnXF$ zwAm&jQ>cuCGPZ0Z{#s1zeW|7R1@}@CtxH{QMyQ z#(F^!aMqj%a0sjoac=~Cz-AmM1>3WsVF7#v!odLEE-(i*b{zym-5WRTmhx#B9B^{C zBjH4<7mOykBh>mPIM>!g@4G@n z9Rcw~8}Z6YnVs+O<&Wyj%z`5166L3a31XgGuZWAh!9D<^ST(ZPJ4BX|E54&$*mmFMwjlUWv9a*E=Gu#^kZLTfKy*gtu>KW2p8&&T}2`$(N3DZFTZ6j=RcT_n08|b!3-sA6A?2IZS z_(r{b%oe@~p%SV-Tkm%b6S>J+_JexMV=B(1uSMJF5@JPUn28A zf6-O3@>J*fX5&N9r^3GU{%u$~L6Uc=BUW#btCtzKQ2JLz+dsp*|C42hz31|S9b5qnrXCJ7G(d~tDZ|X~=jXZhkfS;v}w)8d4^v%$v z>8D*pVh)_xW9aGFJHS&~bLy#!o|Pji>G{MFXcSFNg@zy`#I!rnADwHUJWjH1&JpRh zHd7^$+f;4rV9SPo4GTdxOYdtPTqngX8#D)(YJB!cT+kVGqy-zEy#A~-WinRV9Z<(Q zk>4O;$)S~HyJ!*_F*<$~tLP;+F-)YjdXd}l6MnA83lt>mNm=hR`UiCs4BcDBHXg@7 zHcZo1qMZrh9fS9J1C_ilZ8ssF+D%rdhcFM_bTct&phxcPqbE^KWqj95 z%}LspNxdBL%5zAJQ99#l>o)C%krh}WzNOeup1&Lmf8+V~U6zVpr7Cfaa9bjO2|rgodL&=gvm|-xNvH3g$6kGQSb9}#3ezYy?_}0D_0-$aG6HWBF&fcs zVw;Jy-PSITvc2a_DMtDwBQ^JQvP7<*lRt$hM2yN;LMe06EgyYlmyR$!EURE!{#YIJ zam8Vw%=LBA(M|i}Cz2(cSF|q6<&WCg7a4@ia)^jH`kN@(F29ai;wAdEHIeACr6vKb z4~nd6u^O1U64G`nOg6OmVcLvI4GkA`Q>7 z!(|sf->IG+_A4*Q5^_A7}c`928l&Pxjetxs#ccZ zY&*0!dfaBqWj$E2tp=KzK>i+tq}b`lpSGb^0k?L9T# zcdYbIfAe8I$An&1zw21ZB&n7nbc5onqAPHtOKYn82j7->T)hp;D0D(TGEu7C+nJi@ z9|tK~i7lc8{M`L3s<7k7&fX?&9C;%4iI)>c?no7L*J$bUoOlA1$=Gq|1(^bFIRmc4 zO)Z@Y2rf<|&T!EVsljcJQMBT;cPJ)sRj?|F90a=6MmcnudJ&hl&}|$c>%YOn&u&%CFS`a1#fPL#PQ1 zk}k!b(gIpdWH`(So6(X61{IZni_+qN7DkZ6nqXj%doo=1Dv}>a!3c7<@{%M&w_!V| z@Pk0;-yHt_)vN&%0v7)#^OG%;1pi0oEnFP%KFT!+Itqi375-Hb0)!Dl0MwXU{lu=0 zA^xeVn@VvHxXq+Ve`MRDz#x#`Z}z6Z8B arg0) throws InitialisationException { - // TODO Auto-generated method stub - return new CompilerEx(); + public PluginCompiler getInstance(final Map params) throws InitialisationException { + return new CompilerPython(); } /* (non-Javadoc) @@ -56,8 +52,7 @@ public PluginCompiler getInstance(Map arg0) throws Initialisatio */ @Override public String getResume() { - // TODO Auto-generated method stub - return "a short example"; + return "A simple Python Compiler"; } } diff --git a/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java index 0efa356..dcf7100 100644 --- a/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java +++ b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java @@ -4,7 +4,7 @@ */ import org.junit.Test; -import fr.sny.plugins.compile.python.CompilerExDeclare; +import fr.sny.plugins.compile.python.CompilerPythonDeclare; import static org.junit.Assert.*; @@ -12,7 +12,7 @@ public class LibraryTest { @Test public void testSomeLibraryMethod() { - CompilerExDeclare classUnderTest = new CompilerExDeclare(); + CompilerPythonDeclare classUnderTest = new CompilerPythonDeclare(); assertTrue("yours tests here", UUID.fromString("00000000-0000-0000-0000-000000000000").compareTo(classUnderTest.getID()) == 0); } } From ce49c1e1bc7db610363825594355c5e01f2b9120 Mon Sep 17 00:00:00 2001 From: Tristan Date: Wed, 26 Jul 2017 00:48:55 +0200 Subject: [PATCH 3/4] Implementation pllugin api python --- build.gradle | 2 +- .../plugins/compile/python/CompilerEx.java | 81 ---------- .../compile/python/CompilerPython.java | 147 ++++++++++++++++++ 3 files changed, 148 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/fr/sny/plugins/compile/python/CompilerEx.java create mode 100644 src/main/java/fr/sny/plugins/compile/python/CompilerPython.java diff --git a/build.gradle b/build.gradle index eb4cba4..2245f9c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ repositories { jcenter() } -version = '0.0.4' +version = '0.0.5' project.group = 'fr.sny.example.plugin.compile' sourceCompatibility = JavaVersion.VERSION_1_8 //1.8 diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java b/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java deleted file mode 100644 index c4437f2..0000000 --- a/src/main/java/fr/sny/plugins/compile/python/CompilerEx.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * - */ -package fr.sny.plugins.compile.python; - -import java.io.InputStream; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import fr.esgi.projet.softwareneedsyou.api.ConsoleOutput; -import fr.esgi.projet.softwareneedsyou.api.compiler.CompilerException; -import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler; -import fr.esgi.projet.softwareneedsyou.api.compiler.ResultCompiler; -import fr.esgi.projet.softwareneedsyou.api.compiler.ResultTest; -import fr.esgi.projet.softwareneedsyou.api.compiler.TestState; - -/** - * @author Tristan - * - */ -public class CompilerEx implements PluginCompiler { - - /** - * - */ - public CompilerEx() { - // TODO Auto-generated constructor stub - } - - /* (non-Javadoc) - * @see java.lang.AutoCloseable#close() - */ - @Override - public void close() throws Exception { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#compileAndTest() - */ - @Override - public ResultCompiler compileAndTest(final String code, final InputStream testsDef, final ConsoleOutput console) throws CompilerException { - //TODO: compile the code - if(true) { - ResultCompiler result = new ResultCompiler(true); - //TODO: run tests - List tests = Arrays.asList(1, 2, 3, 4); - for(Integer i : tests) { - //if(file.test[i].run()) - ResultTest res = new ResultTest(); - if(i%2 == 0) { - res.setState(TestState.SUCCESS); - result.addResultTest(i, res); - } else { - res.setState(i%3==0 ? TestState.FAIL : TestState.WARNING); - res.setDetail("details of error"); - result.addResultTest(i, res); - } - } - return result; - } else - return new ResultCompiler(false); - } - - private final static Set languages = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("MyLanguage", "OtherLanguage"))); - /* (non-Javadoc) - * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#getLngSupported() - */ - @Override - public Set getLngSupported() { - return languages; - } - -} diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java b/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java new file mode 100644 index 0000000..44b8778 --- /dev/null +++ b/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java @@ -0,0 +1,147 @@ +/** + * + */ +package fr.sny.plugins.compile.python; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import org.apache.commons.io.IOUtils; + +import fr.esgi.projet.softwareneedsyou.SharedParams; +import fr.esgi.projet.softwareneedsyou.api.ConsoleOutput; +import fr.esgi.projet.softwareneedsyou.api.compiler.CompilerException; +import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler; +import fr.esgi.projet.softwareneedsyou.api.compiler.ResultCompiler; +import fr.esgi.projet.softwareneedsyou.api.compiler.ResultTest; +import fr.esgi.projet.softwareneedsyou.api.compiler.TestState; + +/** + * @author Tristan + * + */ +public class CompilerPython implements PluginCompiler { + private final static Path folder = SharedParams.AppPluginsFolder.resolve("PythonCompiler"); + private final static Path tmp = folder.resolve("tmp"); + private final static Path conf = folder.resolve("conf_python.properties"); + static { + if(Files.notExists(folder)) + try { + Files.createDirectory(folder); + } catch (IOException e) { + e.printStackTrace(); + } + if(Files.notExists(tmp)) + try { + Files.createDirectories(tmp); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private final Properties params = getParams(); + + /** + * + */ + public CompilerPython() { + } + + /* (non-Javadoc) + * @see java.lang.AutoCloseable#close() + */ + @SuppressWarnings("deprecation") + @Override + public void close() throws Exception { + try(OutputStream out = new FileOutputStream(conf.toFile())) { + this.params.save(out, ""); + } + } + + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#compileAndTest() + */ + @Override + public ResultCompiler compileAndTest(final String code, final InputStream testsDef, final ConsoleOutput console) throws CompilerException { + Path dest = tmp.resolve("tmp.py"); + try { + Files.write(dest, code.getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE, StandardOpenOption.CREATE); + ProcessBuilder pb = new ProcessBuilder(this.params.getProperty("exe", "python"), "-m", "compileall", "-f", "."); + pb.directory(tmp.toFile()); + Process p = pb.start(); + IOUtils.copy(p.getInputStream(), console.getOutput()); + IOUtils.copy(p.getErrorStream(), console.getError()); + if(p.waitFor() == 0) { //p.exitValue + ResultCompiler result = new ResultCompiler(true); + /*//TODO: run tests + List tests = Arrays.asList(1, 2, 3, 4); + for(Integer i : tests) { + //if(file.test[i].run()) + ResultTest res = new ResultTest(); + if(i%2 == 0) { + res.setState(TestState.SUCCESS); + result.addResultTest(i, res); + } else { + res.setState(i%3==0 ? TestState.FAIL : TestState.WARNING); + res.setDetail("details of error"); + result.addResultTest(i, res); + } + }*/ + return result; + } else + return new ResultCompiler(false); + } catch (IOException | InterruptedException e) { + throw new CompilerException(e); + } + } + + private final static Set languages = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("MyLanguage", "OtherLanguage"))); + /* (non-Javadoc) + * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#getLngSupported() + */ + @Override + public Set getLngSupported() { + return languages; + } + + private final static Properties getParams() { + Properties props = new Properties(); + try(FileInputStream in = new FileInputStream(conf.toFile())) { + props.load(in); + } catch (IOException e) { + e.printStackTrace(); + } + return props; + } + + public final static void main(final String[] args) { + CompilerPython comp = new CompilerPython(); + try { + comp.compileAndTest("", null, new ConsoleOutput() { + private final PrintWriter writer = new PrintWriter(System.out); + @Override + public PrintWriter getWriter(boolean arg0) { + return writer; + } + }); + } catch (CompilerException e) { + e.printStackTrace(); + } + } +} From 97017bbfe1f2a3c6976ecf625d95f02b9748ac92 Mon Sep 17 00:00:00 2001 From: Tristan Date: Thu, 27 Jul 2017 22:49:55 +0200 Subject: [PATCH 4/4] Correction final v1 --- build.gradle | 2 +- ...0.6.jar => softwareneedsyou-api-0.1.0.jar} | Bin 17606 -> 17219 bytes .../compile/python/CompilerPython.java | 74 ++++++++++-------- .../compile/python/CompilerPythonDeclare.java | 3 + .../plugins/compile/python/LibraryTest.java | 22 ++++-- 5 files changed, 60 insertions(+), 41 deletions(-) rename libs/{softwareneedsyou-api-0.0.6.jar => softwareneedsyou-api-0.1.0.jar} (56%) diff --git a/build.gradle b/build.gradle index 2245f9c..4a26b1a 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ repositories { jcenter() } -version = '0.0.5' +version = '0.1.2' project.group = 'fr.sny.example.plugin.compile' sourceCompatibility = JavaVersion.VERSION_1_8 //1.8 diff --git a/libs/softwareneedsyou-api-0.0.6.jar b/libs/softwareneedsyou-api-0.1.0.jar similarity index 56% rename from libs/softwareneedsyou-api-0.0.6.jar rename to libs/softwareneedsyou-api-0.1.0.jar index 280c304a6248d54ad1d243e06e67c47385334ed2..6c6826842b81b0a15d8bd85e6d8c0368d309fa2f 100644 GIT binary patch delta 4285 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 Z{9n@PL})1hQ*w&HMJ-yAM+&Ds{|DC6UhV(@ diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java b/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java index 44b8778..68cb8cc 100644 --- a/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java +++ b/src/main/java/fr/sny/plugins/compile/python/CompilerPython.java @@ -8,17 +8,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Properties; import java.util.Set; @@ -79,39 +77,47 @@ public void close() throws Exception { */ @Override public ResultCompiler compileAndTest(final String code, final InputStream testsDef, final ConsoleOutput console) throws CompilerException { - Path dest = tmp.resolve("tmp.py"); try { - Files.write(dest, code.getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE, StandardOpenOption.CREATE); - ProcessBuilder pb = new ProcessBuilder(this.params.getProperty("exe", "python"), "-m", "compileall", "-f", "."); - pb.directory(tmp.toFile()); - Process p = pb.start(); - IOUtils.copy(p.getInputStream(), console.getOutput()); - IOUtils.copy(p.getErrorStream(), console.getError()); - if(p.waitFor() == 0) { //p.exitValue - ResultCompiler result = new ResultCompiler(true); - /*//TODO: run tests - List tests = Arrays.asList(1, 2, 3, 4); - for(Integer i : tests) { - //if(file.test[i].run()) - ResultTest res = new ResultTest(); - if(i%2 == 0) { - res.setState(TestState.SUCCESS); - result.addResultTest(i, res); - } else { - res.setState(i%3==0 ? TestState.FAIL : TestState.WARNING); - res.setDetail("details of error"); - result.addResultTest(i, res); - } - }*/ - return result; - } else - return new ResultCompiler(false); - } catch (IOException | InterruptedException e) { - throw new CompilerException(e); + console.getOutput().println("Compilation ..."); + try { + Files.write(tmp.resolve("__init__.py"), "\n".getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + } catch (final IOException e1) { + //e1.printStackTrace(); + } + final Path dest = tmp.resolve("tmp.py"); + try { + Files.write(dest, code.getBytes(StandardCharsets.UTF_8), StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + ;//.redirectErrorStream(true); + Process p = new ProcessBuilder(this.params.getProperty("exe", "python"), "-m", "compileall", "-f", ".") + .inheritIO().directory(tmp.toFile()).start(); + final int exitCode = p.waitFor(); + System.out.println("exit code = " + exitCode); + IOUtils.copy(p.getInputStream(), console.getOutput()); + IOUtils.copy(p.getErrorStream(), console.getError()); + if(exitCode == 0) { //p.exitValue + System.out.println("ok!"); + ResultCompiler result = new ResultCompiler(true); + final Path test = tmp.resolve("test.py"); + Files.copy(testsDef, test, StandardCopyOption.REPLACE_EXISTING); + p = new ProcessBuilder(this.params.getProperty("exe", "python"), "-m", "compileall", "-f", ".") + .inheritIO().directory(tmp.toFile()).start(); + result.addResultTest(0, new ResultTest((p.waitFor()==0) ? TestState.SUCCESS : TestState.FAIL, "...")); + p = new ProcessBuilder(this.params.getProperty("exe", "python"), "-m", "unittest", "test.py") + .inheritIO().directory(tmp.toFile()).start(); + result.addResultTest(1, new ResultTest((p.waitFor()==0) ? TestState.SUCCESS : TestState.FAIL, "...")); + return result; + } else + return new ResultCompiler(false); + } catch (IOException | InterruptedException e) { + throw new CompilerException(e); + } + } catch(RuntimeException r) { + r.printStackTrace(); + throw new CompilerException(r); } } - private final static Set languages = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("MyLanguage", "OtherLanguage"))); + private final static Set languages = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("Python"))); /* (non-Javadoc) * @see fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler#getLngSupported() */ @@ -125,7 +131,7 @@ private final static Properties getParams() { try(FileInputStream in = new FileInputStream(conf.toFile())) { props.load(in); } catch (IOException e) { - e.printStackTrace(); + //e.printStackTrace(); } return props; } @@ -136,7 +142,7 @@ public final static void main(final String[] args) { comp.compileAndTest("", null, new ConsoleOutput() { private final PrintWriter writer = new PrintWriter(System.out); @Override - public PrintWriter getWriter(boolean arg0) { + public PrintWriter getWriter(final boolean isErr) { return writer; } }); diff --git a/src/main/java/fr/sny/plugins/compile/python/CompilerPythonDeclare.java b/src/main/java/fr/sny/plugins/compile/python/CompilerPythonDeclare.java index f02b8a3..85b11cd 100644 --- a/src/main/java/fr/sny/plugins/compile/python/CompilerPythonDeclare.java +++ b/src/main/java/fr/sny/plugins/compile/python/CompilerPythonDeclare.java @@ -6,6 +6,8 @@ import java.util.Map; import java.util.UUID; +import org.kohsuke.MetaInfServices; + import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompiler; import fr.esgi.projet.softwareneedsyou.api.compiler.PluginCompilerDeclare; import fr.esgi.projet.softwareneedsyou.api.spi.InitialisationException; @@ -14,6 +16,7 @@ * @author Tristan * */ +@MetaInfServices public class CompilerPythonDeclare implements PluginCompilerDeclare { private final static UUID uid = UUID.fromString("d40a12f4-5c80-42f4-8b05-5a5b466c620c"); diff --git a/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java index dcf7100..4be73f4 100644 --- a/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java +++ b/src/test/java/fr/sny/plugins/compile/python/LibraryTest.java @@ -4,15 +4,25 @@ */ import org.junit.Test; -import fr.sny.plugins.compile.python.CompilerPythonDeclare; - +import fr.esgi.projet.softwareneedsyou.api.ConsoleOutput; +import fr.esgi.projet.softwareneedsyou.api.compiler.CompilerException; +import fr.esgi.projet.softwareneedsyou.api.compiler.ResultCompiler; import static org.junit.Assert.*; -import java.util.UUID; +import java.io.PrintWriter; public class LibraryTest { - @Test public void testSomeLibraryMethod() { - CompilerPythonDeclare classUnderTest = new CompilerPythonDeclare(); - assertTrue("yours tests here", UUID.fromString("00000000-0000-0000-0000-000000000000").compareTo(classUnderTest.getID()) == 0); + @Test + public void testLibraryCompiler() throws CompilerException, Exception { + CompilerPython compiler = new CompilerPython(); + ResultCompiler result = compiler.compileAndTest("# test\ndef fn():\n\tprint('test')\n", null, new ConsoleOutput() { + @Override + public PrintWriter getWriter(final boolean isErr) { + return new PrintWriter(isErr ? System.err : System.out); + } + }); + assertNotNull(result); + assertTrue(result.isCompileSuccess()); + compiler.close(); } }