datapipeline 2.0.0: Gem aus dem Projekt etl herausgelöst

This commit is contained in:
wkh
2026-10-08 15:30:02 +02:00
commit cce7b03ca9
56 changed files with 5205 additions and 0 deletions
+47
View File
@@ -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