Browse Source

Add Nim Basolato (#5902)

* wip add basolato

* success run db test

* success fortune

* success update

* edit readme

* update controller fortune
itsumura-h 5 years ago
parent
commit
f30ebdf710

+ 1 - 0
.travis.yml

@@ -61,6 +61,7 @@ env:
     - "TESTLANG=Lisp"
     - "TESTLANG=Lisp"
     - "TESTLANG=Lua"
     - "TESTLANG=Lua"
     - "TESTLANG=Nim"
     - "TESTLANG=Nim"
+    - 'TESTDIR="Nim/httpbeast Nim/jester Nim/basolato"'
     - "TESTLANG=Perl"
     - "TESTLANG=Perl"
     - 'TESTDIR="PHP/php"'
     - 'TESTDIR="PHP/php"'
     - 'TESTDIR="PHP/comet PHP/kumbiaphp PHP/workerman PHP/webman"'
     - 'TESTDIR="PHP/comet PHP/kumbiaphp PHP/workerman PHP/webman"'

+ 14 - 0
frameworks/Nim/basolato/.gitignore

@@ -0,0 +1,14 @@
+# Binaries
+*
+!*.*
+!*/
+
+# Test coverage
+coverage/*
+lcov.info
+
+logs/*
+# config.nims
+*.sqlite3
+*.db
+*.db.bak

+ 40 - 0
frameworks/Nim/basolato/README.md

@@ -0,0 +1,40 @@
+# Basolato Benchmarking Test
+
+### Test Type Implementation Source Code
+
+* [JSON](./app/controllers/benchmark_controller.nim)
+* [PLAINTEXT](./app/controllers/benchmark_controller.nim)
+* [DB](./app/controllers/benchmark_controller.nim)
+* [QUERY](./app/controllers/benchmark_controller.nim)
+* [UPDATE](./app/controllers/benchmark_controller.nim)
+* [FORTUNES](./app/controllers/benchmark_controller.nim)
+
+## Important Libraries
+The tests were run with:
+* [Software](https://github.com/itsumura-h/nim-basolato)
+* [Example](https://github.com/itsumura-h/nim-basolato/tree/master/examples)
+
+## Test URLs
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext
+
+### DB
+
+http://localhost:8080/db
+
+### QUERY
+
+http://localhost:8080/query?queries=
+
+### UPDATE
+
+http://localhost:8080/update?queries=
+
+### FORTUNES
+
+http://localhost:8080/fortunes

+ 81 - 0
frameworks/Nim/basolato/app/controllers/benchmark_controller.nim

@@ -0,0 +1,81 @@
+import json, random, algorithm, cgi, sugar, sequtils
+from strutils import parseInt
+# framework
+import basolato/controller
+import allographer/query_builder
+# view
+import ../../resources/pages/fortune_view
+
+type BenchmarkController* = ref object of Controller
+
+proc newBenchmarkController*(request:Request):BenchmarkController =
+  randomize()
+  return BenchmarkController.newController(request)
+
+
+proc json*(this:BenchmarkController):Response =
+  return render(%*{"message":"Hello, World!"})
+
+proc plainText*(this:BenchmarkController):Response =
+  var headers = newHeaders()
+  headers.set("Content-Type", "text/plain; charset=UTF-8")
+  return render("Hello, World!").setHeader(headers)
+
+proc db*(this:BenchmarkController):Response =
+  let i = rand(1..10000)
+  let response = RDB().table("world").find(i)
+  return render(%*response)
+
+proc query*(this:BenchmarkController):Response =
+  var countNum:int
+  try:
+    countNum = this.request.params["queries"].parseInt()
+  except:
+    countNum = 1
+
+  if countNum < 1:
+    countNum = 1
+  elif countNum > 500:
+    countNum = 500
+
+  var response = newJArray()
+  for _ in 1..countNum:
+    let i = rand(1..10000)
+    let data = RDB().table("world").find(i)
+    response.add(data)
+  return render(%*response)
+
+proc fortune*(this:BenchmarkController):Response =
+  var rows = RDB().table("Fortune").orderBy("message", Asc).get()
+  rows = rows.mapIt(%*{
+    "id": it["id"],
+    "message": xmlEncode(it["message"].getStr)
+  })
+  rows.add(%*{
+    "id": 0,
+    "message": "Additional fortune added at request time."}
+  )
+  rows = rows.sortedByIt(it["message"].getStr)
+  return render(this.view.fortuneView(rows))
+
+proc update*(this:BenchmarkController):Response =
+  var countNum:int
+  try:
+    countNum = this.request.params["queries"].parseInt()
+  except:
+    countNum = 1
+
+  if countNum < 1:
+    countNum = 1
+  elif countNum > 500:
+    countNum = 500
+
+  var response = newJArray()
+  transaction:
+    for _ in 1..countNum:
+        let i = rand(1..10000)
+        let newRandomNumber = rand(1..10000)
+        discard RDB().table("world").find(i)
+        RDB().table("world").where("id", "=", i).update(%*{"randomNumber": newRandomNumber})
+        response.add(%*{"id":i, "randomNumber": newRandomNumber})
+  return render(response)

+ 11 - 0
frameworks/Nim/basolato/app/middlewares/framework_middleware.nim

@@ -0,0 +1,11 @@
+import re
+import basolato/middleware
+import basolato/routing
+from custom_headers_middleware import corsHeader
+
+template framework*() =
+  if request.path.match(re"^(?!.*\.).*$"):
+    checkCsrfToken(request).catch()
+    checkAuthToken(request).catch(ErrorAuthRedirect, "/login")
+    if request.reqMethod == HttpOptions:
+      route(render(""), [corsHeader()])

+ 24 - 0
frameworks/Nim/basolato/basolato.dockerfile

@@ -0,0 +1,24 @@
+FROM nimlang/nim:alpine
+
+ENV PATH $PATH:/root/.nimble/bin
+
+RUN echo http://dl-cdn.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories
+RUN apk update && \
+    apk upgrade --no-cache && \
+    apk add --no-cache \
+        openssh-client \
+        ca-certificates \
+        openssl \
+        pcre \
+        bsd-compat-headers \
+        lcov \
+        sqlite mariadb-dev libpq && \
+    rm /usr/lib/mysqld* -fr && rm /usr/bin/mysql* -fr && \
+    update-ca-certificates
+
+ADD ./ /basolato
+WORKDIR /basolato
+
+RUN nimble install -y
+RUN ducere build
+CMD ./main

+ 30 - 0
frameworks/Nim/basolato/benchmark_config.json

@@ -0,0 +1,30 @@
+{
+  "framework": "basolato",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "query_url": "/queries?queries=",
+        "fortune_url": "/fortunes",
+        "update_url": "/updates?queries=",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "postgres",
+        "framework": "Basolato",
+        "language": "Nim",
+        "flavor": "None",
+        "orm": "Full",
+        "platform": "httpbeast",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "Basolato",
+        "notes": "",
+        "versus": "jester"
+      }
+    }
+  ]
+}

+ 20 - 0
frameworks/Nim/basolato/config.nims

@@ -0,0 +1,20 @@
+import os
+
+# DB Connection
+putEnv("DB_DRIVER", "postgres")
+putEnv("DB_CONNECTION", "tfb-database:5432")
+putEnv("DB_USER", "benchmarkdbuser")
+putEnv("DB_PASSWORD", "benchmarkdbpass")
+putEnv("DB_DATABASE", "hello_world")
+
+# Logging
+putEnv("LOG_IS_DISPLAY", "false")
+putEnv("LOG_IS_FILE", "false")
+putEnv("LOG_DIR", "/basolato/logs")
+
+# Security
+putEnv("SECRET_KEY", "1p>G<bEpKnvD^d/nQ,26#!g~") # 24 length
+putEnv("CSRF_TIME", "525600") # minutes of 1 year
+putEnv("SESSION_TIME", "20160") # minutes of 2 weeks
+putEnv("SESSION_DB", "/basolato/session.db")
+putEnv("IS_SESSION_MEMORY", "false")

+ 19 - 0
frameworks/Nim/basolato/main.nim

@@ -0,0 +1,19 @@
+# framework
+import basolato/routing
+# controller
+import app/controllers/benchmark_controller
+
+settings:
+  port = Port(8080)
+
+routes:
+  # Framework
+  error Http404: http404Route
+  error Exception: exceptionRoute
+
+  get "/json": route(newBenchmarkController(request).json())
+  get "/plaintext": route(newBenchmarkController(request).plainText())
+  get "/db": route(newBenchmarkController(request).db())
+  get "/queries": route(newBenchmarkController(request).query())
+  get "/fortunes": route(newBenchmarkController(request).fortune())
+  get "/updates": route(newBenchmarkController(request).update())

+ 23 - 0
frameworks/Nim/basolato/project.nimble

@@ -0,0 +1,23 @@
+# Package
+
+version       = "0.1.0"
+author        = "Anonymous"
+description   = "A new awesome basolato package"
+license       = "MIT"
+srcDir        = "."
+bin           = @["main"]
+
+backend       = "c"
+
+# Dependencies
+
+requires "nim >= 1.2.4"
+requires "https://github.com/itsumura-h/nim-basolato >= 0.5.5"
+requires "httpbeast >= 0.2.2"
+requires "cligen >= 0.9.41"
+requires "templates >= 0.5"
+requires "bcrypt >= 0.2.1"
+requires "nimAES >= 0.1.2"
+requires "flatdb >= 0.2.4"
+requires "allographer >= 0.9.0"
+requires "faker >= 0.12.1"

+ 32 - 0
frameworks/Nim/basolato/resources/pages/fortune_view.nim

@@ -0,0 +1,32 @@
+import json
+import basolato/view
+
+proc impl(title:string, data:seq[JsonNode]):string = tmpli html"""
+<!DOCTYPE html>
+<html>
+
+<head>
+  <title>$title</title>
+</head>
+
+<body>
+  <table>
+    <tr>
+      <th>id</th>
+      <th>message</th>
+    </tr>
+    $for row in data{
+      <tr>
+        <td>$(row["id"].get)</td>
+        <td>$(row["message"].get)</td>
+      </tr>
+    }
+  </table>
+</body>
+
+</html>
+"""
+
+proc fortuneView*(this:View, data=newSeq[JsonNode]()):string =
+  let title = "Fortunes"
+  return impl(title, data)