datapipeline 2.0.0: Gem aus dem Projekt etl herausgelöst
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# Kunden seitenweise aus einer REST-API lesen, mit Ländern aus einem zweiten Endpunkt anreichern,
|
||||
# nach CSV und JSON schreiben
|
||||
#
|
||||
# ruby examples/demo_api.rb & # Demo-API starten
|
||||
# bin/etl run examples/rest_lesen.rb [--url=http://127.0.0.1:4567] [--out=tmp]
|
||||
#
|
||||
require 'fileutils'
|
||||
require 'datapipeline'
|
||||
|
||||
API = DataPipeline.params.fetch(:url, 'http://127.0.0.1:4567')
|
||||
AUTH = "Bearer #{ENV.fetch('DEMO_API_TOKEN', 'demo-token')}"
|
||||
out = DataPipeline.params.fetch(:out, 'tmp')
|
||||
FileUtils.mkdir_p(out)
|
||||
|
||||
DataPipeline.new do
|
||||
version 'rest_lesen 1.0'
|
||||
|
||||
# GET /api/kunden?page=1&per_page=3, dann page=2, ... bis eine Seite leer ist
|
||||
# die Zeilen stehen in der Antwort unter "data"; 429/5xx und Netzfehler werden bis zu 3-mal wiederholt
|
||||
kunden = container :rest, url: "#{API}/api/kunden", auth: AUTH,
|
||||
root: 'data', page_param: 'page', params: { 'per_page' => 3 },
|
||||
retries: 3, retry_wait: 0.2
|
||||
|
||||
# derselbe Server, anderer Endpunkt: query hängt den Pfad an die url an (GET /api/laender)
|
||||
stamm = container :rest, url: "#{API}/api", auth: AUTH
|
||||
laender = lookup stamm, query: 'laender', key: 'code', unique: true
|
||||
|
||||
read kunden
|
||||
|
||||
on_error :collect, to: container(:csv, file: "#{out}/api_fehler.csv")
|
||||
validate 'id' => { required: true }, 'umsatz' => { type: :decimal }
|
||||
|
||||
map do |kunde|
|
||||
{
|
||||
'id' => kunde['id'],
|
||||
'name' => kunde['name'],
|
||||
'land' => laender.dig(kunde['land'], 'name') || kunde['land'],
|
||||
'umsatz' => kunde['umsatz'].to_f
|
||||
}
|
||||
end
|
||||
|
||||
write container(:csv, file: "#{out}/api_kunden.csv", columns: %w[id name land umsatz])
|
||||
write container(:json, file: "#{out}/api_kunden.json", pretty: true)
|
||||
|
||||
on_finish { |stats| puts "rest_lesen: #{stats}" }
|
||||
end.run
|
||||
Reference in New Issue
Block a user