lots of exercises in java... from https://github.com/exercism/java

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #!/bin/bash
  2. SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
  3. EXECPATH=$PWD
  4. XAPI_PID=""
  5. # Makes CI output easier to read
  6. TERM=dumb
  7. function on_exit() {
  8. echo ">>> on_exit()"
  9. if [ "$XAPI_PID" != "" ] ; then
  10. kill $XAPI_PID
  11. echo "Stopped X-API (pid=${XAPI_PID})"
  12. fi
  13. cd $EXECPATH
  14. echo "<<< on_exit()"
  15. }
  16. assert_gradle_installed() {
  17. echo ">>> assert_gradle_installed()"
  18. which gradle >/dev/null
  19. if [ $? != 0 ]; then
  20. echo "Gradle not found. This the Java build tool and is required."
  21. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  22. echo "PATH=${PATH}"
  23. echo "aborting."
  24. exit 1
  25. fi
  26. echo "<<< assert_gradle_installed()"
  27. }
  28. assert_jq_installed() {
  29. echo ">>> assert_jq_installed()"
  30. which jq >/dev/null
  31. if [ $? != 0 ]; then
  32. echo "jq not found. This utility is used to parse the config.json file and is required."
  33. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  34. echo "PATH=${PATH}"
  35. echo "aborting."
  36. exit 1
  37. fi
  38. echo "<<< assert_jq_installed()"
  39. }
  40. assert_required_ruby_installed() {
  41. echo ">>> assert_required_ruby_installed(\"$1\")"
  42. local RUBY_APP_HOME="$1"
  43. pushd "${RUBY_APP_HOME}" >/dev/null
  44. local CURRENT_RUBY_VER=`ruby --version | egrep --only-matching "[0-9]+\.[0-9]+\.[0-9]+"`
  45. local EXPECTED_RUBY_VER=`cat Gemfile | awk -F\' '/ruby /{print $2}'`
  46. popd >/dev/null
  47. if [ "$EXPECTED_RUBY_VER" != "" -a "$CURRENT_RUBY_VER" != "$EXPECTED_RUBY_VER" ]; then
  48. echo "${RUBY_APP_HOME} requires Ruby ${EXPECTED_RUBY_VER}; current Ruby version is ${CURRENT_RUBY_VER}."
  49. echo -e "Ruby used: `which ruby`.\n"
  50. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  51. echo "PATH=${PATH}"
  52. echo "aborting."
  53. exit 1
  54. fi
  55. echo "<<< assert_required_ruby_installed()"
  56. }
  57. clean_build() {
  58. echo ">>> clean_build(\"$1\", \"$2\")"
  59. local REPO_ROOT="$1"
  60. local BUILD_DIR="$2"
  61. if [ -d "$BUILD_DIR" ] ; then
  62. echo "Cleaning journey script build (${BUILD_DIR})."
  63. rm -rf "$BUILD_DIR"
  64. fi
  65. pushd ${REPO_ROOT}/exercises > /dev/null
  66. gradle clean
  67. popd > /dev/null
  68. echo "<<< clean_build()"
  69. }
  70. get_operating_system() {
  71. case $(uname) in
  72. (Darwin*)
  73. echo "mac";;
  74. (Linux*)
  75. echo "linux";;
  76. (Windows*)
  77. echo "windows";;
  78. (*)
  79. echo "linux";;
  80. esac
  81. }
  82. get_cpu_architecture() {
  83. case $(uname -m) in
  84. (*64*)
  85. echo 64bit;;
  86. (*686*)
  87. echo 32bit;;
  88. (*386*)
  89. echo 32bit;;
  90. (*)
  91. echo 64bit;;
  92. esac
  93. }
  94. fetch_exercism_cli() {
  95. echo ">>> fetch_exercism_cli(\"$1\", \"$2\", \"$3\")"
  96. local OS="$1"
  97. local ARCH="$2"
  98. local EXERCISM_HOME="$3"
  99. local LATEST=https://github.com/exercism/cli/releases/latest
  100. # "curl..." :: HTTP 302 headers, including "Location" -- URL to redirect to.
  101. # "awk..." :: pluck last path segment from "Location" (i.e. the version number)
  102. local VERSION="$(curl --head --silent $LATEST | awk -v FS=/ '/Location:/{print $NF}' | tr -d '\r')"
  103. local CLI_URL=https://github.com/exercism/cli/releases/download/${VERSION}/exercism-${OS}-${ARCH}.tgz
  104. mkdir -p ${EXERCISM_HOME}
  105. curl -s --location ${CLI_URL} | tar xz -C ${EXERCISM_HOME}
  106. echo "<<< fetch_exercism_cli()"
  107. }
  108. fetch_x_api() {
  109. echo ">>> fetch_x_api(\"$1\")"
  110. local XAPI_HOME="$1"
  111. git clone https://github.com/exercism/x-api ${XAPI_HOME}
  112. echo "<<< fetch_x_api()"
  113. }
  114. fetch_trackler() {
  115. echo ">>> fetch_trackler(\"$1\")"
  116. local TRACKLER_HOME="$1"
  117. git clone https://github.com/exercism/trackler ${TRACKLER_HOME}
  118. echo "<<< fetch_trackler()"
  119. }
  120. build_trackler() {
  121. echo ">>> build_trackler(\"$1\")"
  122. local TRACKLER_HOME="$1"
  123. pushd ${TRACKLER_HOME} >/dev/null
  124. git submodule init -- common
  125. git submodule update
  126. rmdir tracks/java
  127. mkdir -p tracks/java/exercises
  128. cp $REPO_ROOT/config.json tracks/java
  129. cp -r $REPO_ROOT/exercises tracks/java
  130. gem install bundler
  131. bundle install
  132. gem build trackler.gemspec
  133. gem install --local trackler-*.gem
  134. popd > /dev/null
  135. echo "<<< build_trackler()"
  136. }
  137. start_x_api() {
  138. echo ">>> start_x_api(\"$1\")"
  139. local XAPI_HOME="$1"
  140. pushd $XAPI_HOME >/dev/null
  141. gem install bundler
  142. bundle install
  143. RACK_ENV=development rackup &
  144. XAPI_PID=$!
  145. sleep 5
  146. echo "X-API is running (pid=${XAPI_PID})."
  147. popd > /dev/null
  148. echo "<<< start_x_api()"
  149. }
  150. configure_exercism_cli() {
  151. echo ">>> configure_exercism_cli(\"$1\", \"$2\", $3)"
  152. local EXERCISM_HOME="$1"
  153. local EXERCISM_CONFIGFILE="$2"
  154. local XAPI_PORT=$3
  155. local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
  156. mkdir -p "${EXERCISM_HOME}"
  157. pushd "${EXERCISM_HOME}" >/dev/null
  158. $EXERCISM configure --dir="${EXERCISM_HOME}"
  159. $EXERCISM configure --api http://localhost:${XAPI_PORT}
  160. $EXERCISM debug
  161. popd >/dev/null
  162. echo "<<< configure_exercism_cli()"
  163. }
  164. solve_all_exercises() {
  165. echo ">>> solve_all_exercises(\"$1\", \"$2\")"
  166. local EXERCISM_HOME="$1"
  167. local EXERCISM_CONFIGFILE="$2"
  168. local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
  169. local EXERCISES=`cat config.json | jq '.problems []' --raw-output`
  170. local TOTAL_EXERCISES=`cat config.json | jq '.problems | length'`
  171. local CURRENT_EXERCISE_NUMBER=1
  172. local TEMPFILE="${TMPDIR:-/tmp}/journey-test.sh-unignore_all_tests.txt"
  173. pushd ${EXERCISM_HOME} >/dev/null
  174. for EXERCISE in $EXERCISES; do
  175. echo ''
  176. echo '****' Testing $EXERCISE '('$CURRENT_EXERCISE_NUMBER / $TOTAL_EXERCISES') ****'
  177. echo ''
  178. $EXERCISM fetch java $EXERCISE
  179. cp -R -H $REPO_ROOT/exercises/$EXERCISE/src/example/java/* $EXERCISM_HOME/java/$EXERCISE/src/main/java/
  180. pushd $EXERCISM_HOME/java/$EXERCISE/ >/dev/null
  181. for TESTFILE in `find . -name "*Test.java"`; do
  182. sed 's/@Ignore//' $TESTFILE > "$TEMPFILE" && mv "$TEMPFILE" "$TESTFILE"
  183. done
  184. gradle test
  185. popd >/dev/null
  186. CURRENT_EXERCISE_NUMBER=$((CURRENT_EXERCISE_NUMBER + 1))
  187. done
  188. popd >/dev/null
  189. }
  190. main() {
  191. # allow all functions to assume current working directory is repository root.
  192. cd "${SCRIPTPATH}/.."
  193. local REPO_ROOT="${PWD}"
  194. local BUILD_DIR="${REPO_ROOT}/build"
  195. local XAPI_HOME="${BUILD_DIR}/x-api"
  196. local TRACKLER_HOME="${BUILD_DIR}/trackler"
  197. local EXERCISM_HOME="${BUILD_DIR}/exercism"
  198. local EXERCISM_CONFIGFILE=".journey-test.exercism.json"
  199. local XAPI_PORT=9292
  200. assert_gradle_installed
  201. assert_jq_installed
  202. clean_build "${REPO_ROOT}" "${BUILD_DIR}"
  203. fetch_exercism_cli $(get_operating_system) $(get_cpu_architecture) "${EXERCISM_HOME}"
  204. fetch_x_api "${XAPI_HOME}"
  205. fetch_trackler "${TRACKLER_HOME}"
  206. assert_required_ruby_installed "${XAPI_HOME}"
  207. assert_required_ruby_installed "${TRACKLER_HOME}"
  208. build_trackler "${TRACKLER_HOME}"
  209. start_x_api "${XAPI_HOME}"
  210. configure_exercism_cli "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}" "${XAPI_PORT}"
  211. solve_all_exercises "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}"
  212. }
  213. ##########################################################################
  214. # Execution begins here...
  215. set -e
  216. trap on_exit EXIT
  217. main