Vlad Faust před 6 roky
rodič
revize
dc6ac01506

+ 2 - 2
frameworks/Crystal/onyx/benchmark_config.json

@@ -10,12 +10,12 @@
         "plaintext_url": "/plaintext",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Micro",
+        "classification": "Fullstack",
         "database": "Postgres",
         "framework": "Onyx",
         "language": "Crystal",
         "flavor": "None",
-        "orm": "Micro",
+        "orm": "Full",
         "platform": "None",
         "webserver": "None",
         "os": "Linux",

+ 2 - 2
frameworks/Crystal/onyx/onyx.dockerfile

@@ -1,4 +1,4 @@
-FROM crystallang/crystal:0.27.1
+FROM crystallang/crystal:0.27.2
 
 WORKDIR /onyx
 COPY run.sh run.sh
@@ -7,7 +7,7 @@ COPY shard.yml shard.yml
 
 ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=56&max_pool_size=56&max_idle_pool_size=56
 ENV TEST_HOST tfb-server
-ENV CRYSTAL_ENV production
+ENV CRYSTAL_ENV benchmarking
 
 RUN shards install
 RUN crystal build --release --no-debug src/server_postgres.cr

+ 11 - 7
frameworks/Crystal/onyx/shard.lock

@@ -12,25 +12,29 @@ shards:
     github: gdotdesign/cr-dotenv
     version: 0.1.0
 
+  exception_page:
+    github: crystal-loot/exception_page
+    version: 0.1.2
+
   http-params-serializable:
     github: vladfaust/http-params-serializable
     version: 0.3.0
 
+  kilt:
+    github: jeromegn/kilt
+    version: 0.4.0
+
   onyx:
     github: onyxframework/onyx
-    version: 0.1.2
+    version: 0.3.1
 
   onyx-http:
     github: onyxframework/http
-    version: 0.1.1
-
-  onyx-rest:
-    github: onyxframework/rest
-    version: 0.6.3
+    version: 0.7.1
 
   onyx-sql:
     github: onyxframework/sql
-    version: 0.6.2
+    version: 0.7.1
 
   pg:
     github: will/crystal-pg

+ 6 - 6
frameworks/Crystal/onyx/shard.yml

@@ -1,5 +1,5 @@
 name: onyx
-version: 0.1.0
+version: 0.2.0
 
 authors:
   - Vlad Faust
@@ -12,13 +12,13 @@ license: MIT
 dependencies:
   onyx:
     github: onyxframework/onyx
-    version: ~> 0.1.2
-  onyx-rest:
-    github: onyxframework/rest
-    version: ~> 0.6.2
+    version: ~> 0.3.0
+  onyx-http:
+    github: onyxframework/http
+    version: ~> 0.7.0
   onyx-sql:
     github: onyxframework/sql
-    version: ~> 0.6.2
+    version: ~> 0.7.0
   pg:
     github: will/crystal-pg
     version: ~> 0.15.0

+ 5 - 0
frameworks/Crystal/onyx/src/endpoints/random_id.cr

@@ -0,0 +1,5 @@
+module Endpoints::RandomID
+  def random_id
+    Random.rand(10_000).succ
+  end
+end

+ 24 - 0
frameworks/Crystal/onyx/src/endpoints/worlds/many.cr

@@ -0,0 +1,24 @@
+struct Endpoints::Worlds::Many
+  include Onyx::HTTP::Endpoint
+  include RandomID
+
+  QUERY = Models::World.where("id = ANY(?)", 0).build(true)[0]
+
+  params do
+    query do
+      type queries : String | Int32 = 1
+    end
+  end
+
+  def call
+    queries = params.query.queries.is_a?(String) ? 1 : params.query.queries.as(Int32)
+    ids = queries.clamp(1..500).times.map do
+      random_id
+    end.join(',').try do |s|
+      "{#{s}}"
+    end
+
+    worlds = Onyx.query(Models::World, QUERY, ids)
+    return Views::Worlds.new(worlds)
+  end
+end

+ 11 - 0
frameworks/Crystal/onyx/src/endpoints/worlds/random.cr

@@ -0,0 +1,11 @@
+struct Endpoints::Worlds::Random
+  include Onyx::HTTP::Endpoint
+  include RandomID
+
+  QUERY = Models::World.where(id: 0).build(true)[0]
+
+  def call
+    world = Onyx.query(Models::World, QUERY, random_id).first
+    return Views::World.new(world)
+  end
+end

+ 29 - 0
frameworks/Crystal/onyx/src/endpoints/worlds/update.cr

@@ -0,0 +1,29 @@
+struct Endpoints::Worlds::Update
+  include Onyx::HTTP::Endpoint
+  include RandomID
+
+  QUERY = Models::World.update.set(random_number: 0).where(id: 0).build[0]
+
+  params do
+    query do
+      type queries : String | Int32 = 1
+    end
+  end
+
+  def call
+    queries = params.query.queries.is_a?(String) ? 1 : params.query.queries.as(Int32)
+
+    worlds = Array(Models::World).new
+
+    queries.clamp(1..500).times.each do
+      id, number = {random_id, random_id}
+
+      world = Models::World.new(id: id, random_number: number)
+      worlds << world
+
+      Onyx.exec(QUERY, world.random_number, world.id)
+    end
+
+    return Views::Worlds.new(worlds)
+  end
+end

+ 8 - 0
frameworks/Crystal/onyx/src/models/world.cr

@@ -0,0 +1,8 @@
+class Models::World
+  include Onyx::SQL::Model
+
+  schema world do
+    pkey id : Int32
+    type random_number : Int32, key: "randomnumber"
+  end
+end

+ 8 - 112
frameworks/Crystal/onyx/src/server_postgres.cr

@@ -1,112 +1,10 @@
 require "pg"
 require "onyx/sql"
-require "onyx/rest"
+require "onyx/http"
 
-class World
-  include Onyx::SQL::Model
-
-  schema world do
-    pkey id : Int32
-    type random_number : Int32, key: "randomnumber"
-  end
-end
-
-def random_id
-  Random.rand(10_000).succ
-end
-
-struct Views::World
-  include Onyx::REST::View
-
-  def initialize(@world : ::World)
-  end
-
-  json do
-    object do
-      field "id", @world.id
-      field "randomnumber", @world.random_number
-    end
-  end
-end
-
-struct Views::Worlds
-  include Onyx::REST::View
-
-  def initialize(@worlds : Enumerable(::World))
-  end
-
-  json do
-    array do
-      @worlds.each do |world|
-        Views::World.new(world).to_json(itself)
-      end
-    end
-  end
-end
-
-struct Actions::RandomWorld
-  include Onyx::REST::Action
-
-  QUERY = World.where(id: 0).build(true)[0]
-
-  def call
-    world = Onyx.query(World, QUERY, random_id).first
-    return Views::World.new(world)
-  end
-end
-
-struct Actions::ManyWorlds
-  include Onyx::REST::Action
-
-  QUERY = World.where("id = ANY(?)", 0).build(true)[0]
-
-  params do
-    query do
-      type queries : String | Int32 = 1
-    end
-  end
-
-  def call
-    queries = params.query.queries.is_a?(String) ? 1 : params.query.queries.as(Int32)
-    ids = queries.clamp(1..500).times.map do
-      random_id
-    end.join(',').try do |s|
-      "{#{s}}"
-    end
-
-    worlds = Onyx.query(World, QUERY, ids)
-    return Views::Worlds.new(worlds)
-  end
-end
-
-struct Actions::UpdateWorlds
-  include Onyx::REST::Action
-
-  QUERY = World.update.set(random_number: 0).where(id: 0).build[0]
-
-  params do
-    query do
-      type queries : String | Int32 = 1
-    end
-  end
-
-  def call
-    queries = params.query.queries.is_a?(String) ? 1 : params.query.queries.as(Int32)
-
-    worlds = Array(World).new
-
-    queries.clamp(1..500).times.each do
-      id, number = {random_id, random_id}
-
-      world = World.new(id: id, random_number: number)
-      worlds << world
-
-      Onyx.exec(QUERY, world.random_number, world.id)
-    end
-
-    return Views::Worlds.new(worlds)
-  end
-end
+require "./models/*"
+require "./views/*"
+require "./endpoints/**"
 
 class CustomHandler
   include HTTP::Handler
@@ -124,9 +22,9 @@ Onyx.draw do
     {message: "Hello, World!"}.to_json(env.response)
   end
 
-  get "/db", Actions::RandomWorld
-  get "/queries", Actions::ManyWorlds
-  get "/updates", Actions::UpdateWorlds
+  get "/db", Endpoints::Worlds::Random
+  get "/queries", Endpoints::Worlds::Many
+  get "/updates", Endpoints::Worlds::Update
 
   get "/plaintext" do |env|
     env.response.content_type = "text/plain"
@@ -134,8 +32,6 @@ Onyx.draw do
   end
 end
 
-Onyx.render(:json)
-
 Onyx.listen(ENV["TEST_HOST"], 8080) do
-  handlers.insert(2, CustomHandler.new)
+  handlers.unshift(CustomHandler.new)
 end

+ 13 - 0
frameworks/Crystal/onyx/src/views/world.cr

@@ -0,0 +1,13 @@
+struct Views::World
+  include Onyx::HTTP::View
+
+  def initialize(@world : Models::World)
+  end
+
+  json do
+    object do
+      field "id", @world.id
+      field "randomnumber", @world.random_number
+    end
+  end
+end

+ 8 - 0
frameworks/Crystal/onyx/src/views/worlds.cr

@@ -0,0 +1,8 @@
+struct Views::Worlds
+  include Onyx::HTTP::View
+
+  def initialize(@worlds : Enumerable(Models::World))
+  end
+
+  json @worlds.map { |world| Views::World.new(world) }
+end