mirror of
https://github.com/lloeki/minimal-rack/
synced 2025-12-06 05:04:40 +01:00
97 lines
1.9 KiB
Ruby
Executable file
97 lines
1.9 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
begin
|
|
require "bundler/inline"
|
|
rescue LoadError => e
|
|
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
|
|
raise e
|
|
end
|
|
|
|
require 'yaml'
|
|
compatibility = YAML.load(File.read('compatibility'))
|
|
|
|
kind = File.basename(__FILE__, '.rb')
|
|
version = ARGV[0] || raise(ArgumentError, 'missing version')
|
|
match = compatibility[kind].select do |e|
|
|
Gem::Requirement.new(e['version']).satisfied_by?(Gem::Version.new(version))
|
|
end.tap do |m|
|
|
if m.empty?
|
|
raise ArgumentError, "unmatched requirement for #{kind}:#{version}"
|
|
elsif !m.one?
|
|
raise ArgumentError, "ambiguous version range for #{kind}:#{version}"
|
|
end
|
|
end.first
|
|
server = ARGV[1] || 'thin'
|
|
|
|
gems = match.fetch('gem', {})
|
|
gemfile(true) do
|
|
source "https://rubygems.org"
|
|
|
|
ruby match['ruby']
|
|
|
|
gem 'grape', "~> #{version}.0"
|
|
gem server unless gems.key?(server)
|
|
gem 'ddtrace'
|
|
|
|
gems.each do |name, requirement|
|
|
gem name, requirement
|
|
end
|
|
end
|
|
|
|
require 'rack'
|
|
require 'grape'
|
|
|
|
class API < Grape::API
|
|
version 'v0', using: :header, vendor: 'hello'
|
|
format :json
|
|
prefix :hello
|
|
|
|
get :world do
|
|
{ hello: 'world' }
|
|
end
|
|
|
|
#resource :hello do
|
|
# route_param :id do
|
|
# get do
|
|
# { hello: 'world' }
|
|
# end
|
|
# end
|
|
#end
|
|
|
|
# mount API::Sub
|
|
# mount API::V1 => '/v1'
|
|
end
|
|
|
|
App = Rack::Builder.new do
|
|
use Datadog::Tracing::Contrib::Rack::TraceMiddleware
|
|
use Datadog::AppSec::Contrib::Rack::RequestMiddleware
|
|
|
|
# precompile routes
|
|
API.compile!
|
|
|
|
run API
|
|
|
|
# sinatra:
|
|
# use Rack::Session::Cookie
|
|
# run Rack::Cascade.new [Web, API]
|
|
end
|
|
|
|
require 'ddtrace'
|
|
|
|
Datadog.configure do |c|
|
|
c.diagnostics.debug = true
|
|
|
|
c.telemetry.enabled = true
|
|
|
|
c.remote.enabled = true
|
|
|
|
c.tracing.enabled = true
|
|
c.tracing.instrument :rack
|
|
c.tracing.instrument :grape
|
|
|
|
c.appsec.enabled = true
|
|
c.appsec.instrument :rack
|
|
end
|
|
|
|
Rack::Server.new(app: App, Host: '0.0.0.0', Port: 3000).start
|
|
|