Create a simple Calculator REST API using JSON that supports input of mathematical expressions with the basic operations: +, -, *, and /. It should allow the usage of parens and understand operator precedence.
Example:
POST /calc {"expression": "-1 * (2 * 6 / 3)"}
Returns {"result": "-4"}
Extra credits for the ability to retrieve history of calculations done.
If you already have set-up the development environment:
- Start the application:
lein run - Go to localhost:8080 to see the web interface for the calculator.
- Read the app's source code at localhost:8080/docs.
- Run the app's tests with
lein test. Read the tests attest/calculator_api/.
If not, see instructions below.
To configure logging see config/logback.xml. By default, the app logs to stdout and logs/. To learn more about configuring Logback, read its documentation.
If you received calculator-api-0.0.1-SNAPSHOT-standalone.jar, just run java -jar filename.jar.
It should run without any dependency issues. Everything is "statically compiled" inside the jar file. You won't need to install antlr.
Otherwise, you need to setup the development environment.
We need to install antlr-4.9.2 to compile Grammer and generate parser.
$ cd /opt
$ sudo mkdir antlr4
$ sudo chown <username>:<username> antlr4
$ cd antlr4
# Get latest version from https://www.antlr.org/download.html
$ sudo curl -O https://www.antlr.org/download/antlr-X.X.X-complete.jar
# Add these to .bashrc or similar location.
$ export CLASSPATH=".:/usr/local/lib/antlr4/antlr-X.X.X-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-X.X.X-complete.jar'
$ alias grun='java org.antlr.v4.gui.TestRig'
cd src/java/grammar/expr
rm *.java *.tokens *.interp *.class # remove what's left over from testing the grammar
antlr4 -package grammar.expr -no-listener -visitor Expr.g4
cd src/java/grammar/expr
rm *.java *.tokens *.interp # remove what's left over from compiling the grammar
antlr4 Expr.g4 && javac *.java
grun Expr prog -gui <file-with-expressions> # GUI
grun Expr prog -tree <file-with-expressions> # Text-based
If you don't supply any file, you can type your expression directly, then press ctrl+d to get the result.
Install Sass preprocessor:
sudo npm install -g sass
Watch (for development):
lein sass-watch
# or
sass --style=compressed --watch src/sass/style.sass:resources/public/vendor/css/style.min.css
Release compile:
lein sass
# or
sass --style=compressed src/sass/style.sass:resources/public/vendor/css/style.min.css
$ lein marg
$ lein clj-fmt check # Use `fix` instead of `check` if you're brave enough.
Development (front-end source files are located in src/front-end)
shadow-cljs watch app
Release compile:
npm run release
For more information about front-end, check FRONTEND.md
- Start a new REPL:
lein repl - Start your service in dev-mode:
(def dev-serv (run-dev)) - Connect your editor to the running REPL session. Re-evaluated code will be seen immediately in the service.
lein do clean, marg, sass, front-end, uberjar
Then you can run/release/deploy the standalone jar file in target/ directory.
Docker container support
- Configure your service to accept incoming connections (edit service.clj and add ::http/host "0.0.0.0" )
- Build an uberjar of your service. (see above)
- Build a Docker image:
sudo docker build -t calculator-api . - Run your Docker image:
docker run -net host calculator-api
- Build and run your image:
capstan run -f "8080:8080"
Once the image it built, it's cached. To delete the image and build a new one:
capstan rmi calculator-api; capstan build