diff --git a/c-historico/handler.cr b/c-historico/handler.cr
deleted file mode 100644
index afe6419..0000000
--- a/c-historico/handler.cr
+++ /dev/null
@@ -1,127 +0,0 @@
-require "http/client"
-require "http/headers"
-require "http/request"
-require "ishi/html"
-require "json"
-require "uuid"
-require "db"
-require "pg"
-
-USER = File.read("/var/openfaas/secrets/nombres-user").strip
-PASS = File.read("/var/openfaas/secrets/nombres-pass").strip
-DB_URL = "postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres"
-
-class Handler
- def format_buffer(buffer, canvas_name, title = "")
- # Process the gnuplot output so it works in the page
- #
- # buffer is the Ishi output
- # name is a string to replace for gnuplot_canvas so
- # we can have multiple charts in a page
- # title is added on top of the chart
-
- html = buffer.to_s.split("\n")
- html = html[html.index("")]
- html = "#{title}" + html.join("\n") + %(
-
-
-
-
-
-
-
-
-
- )
- # This ID needs to be unique in case
- # we have 2 charts in the same page
- html.gsub("gnuplot_canvas", canvas_name)
- end
-
- def query(sql, nombre)
- # Runs a SQL query against the database.
- #
- # Returns an array of values [[Year,Count]...]
- # Or nil if there are no results
-
- DB.open(DB_URL) do |cursor|
- cursor.query(sql, nombre) do |result_set|
- result = [] of Tuple(Int32, Int32)
- result_set.each do
- year = result_set.read(Int32)
- contador = result_set.read(Int32)
- result.push({year, contador})
- end
- return result
- end
- end
- # No result, return nil
- nil
- end
-
- nombres = [] of String
-
- def normalize_name(s)
- # Remove diacritics, turn lowercase
- normalized = s.unicode_normalize(:nfkd).chars
- normalized.reject! { |character|
- !character.ascii?
- }.join("").downcase
- end
-
- def run(request : HTTP::Request)
- unless (body = request.body).nil?
- query = JSON.parse(body)
- nombres = query["i"].as_s.split(",").map(&.strip)
- nombres.reject! { |nombre| nombre.size == 0 }
- end
-
- if nombres.nil? || nombres.empty?
- nombres = ["maria", "juan"]
- end
-
- # Remove all diacritics and whatnot
- nombres = nombres.map { |nombre|
- normalize_name nombre
- }
-
- puts "Processing #{nombres}"
-
- buffer = IO::Memory.new
- Ishi.new(buffer) do
- canvas_size(800, 300)
- show_key(true)
- xrange(1922..2015)
- nombres.map { |nombre|
- x = Array(Int32).new
- y = Array(Int32).new
- results = query("SELECT anio::integer, contador::integer FROM nombres WHERE nombre = $1 ORDER BY anio", nombre)
- if results.nil? # No results, all 0s
- x = (1922..2015).to_a
- y = x.map { |_| 0 }
- else # We got results
- values = Hash(Int32, Int32).new(default_value: 0)
- results.map { |row|
- values[row[0]] = row[1]
- }
- (1922..2015).map { |year|
- x << year
- y << values[year] # Defaults to 0, so we have the whole set
- }
- end
- plot(x, y, title: nombre.titleize, style: :lines, linewidth: 3)
- }
- end
- puts "After Ishi"
-
- {
- body: format_buffer(buffer, "historico"),
- status_code: 200,
- headers: HTTP::Headers{"Content-Type" => "text/html"},
- }
- end
-end
diff --git a/c-historico/shard.yml b/c-historico/shard.yml
deleted file mode 100644
index eb1bee6..0000000
--- a/c-historico/shard.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: historico
-version: 0.1.0
-
-dependencies:
- ishi:
- github: toddsundsted/ishi
- pg:
- github: will/crystal-pg
diff --git a/historico/README.md b/historico/README.md
new file mode 100644
index 0000000..18ef2e5
--- /dev/null
+++ b/historico/README.md
@@ -0,0 +1,11 @@
+# Readme for Historico
+
+This is a funko using the Crystal runtime for [FaaSO](https://git.ralsina.me/ralsina/faaso)
+
+## What is Historico
+
+Write here what it is
+
+## How to use Historico
+
+And so on.
diff --git a/historico/__init__.py b/historico/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/historico/funko.cr b/historico/funko.cr
new file mode 100644
index 0000000..a86d2fe
--- /dev/null
+++ b/historico/funko.cr
@@ -0,0 +1,63 @@
+require "json"
+require "kemal"
+require "pg"
+require "pool/connection"
+
+# get credentials from secrets
+
+USER = File.read("/secrets/user").strip
+PASS = File.read("/secrets/pass").strip
+
+# Create a connection pool to the database
+pg = ConnectionPool.new(capacity: 5, timeout: 0.01.seconds) do
+ PG.connect("postgres://#{USER}:#{PASS}@database:5432/nombres")
+end
+
+# Connect to the database and get information about
+# the requested names
+get "/" do |env|
+ # Names are query parameters
+ # Split by commas, capitalize and take the first 5
+ names = env.params.query["names"]
+ .split(",").map(&.strip.capitalize)[..4]
+
+ # Prepare results table
+ results = [] of Array(String)
+ results << ["Año"] + names
+ (1922..2015).each do |anio|
+ results << [anio.to_s]
+ end
+ # Connect using credentials provided
+ pg.connection do |cursor|
+ # Get the information for each name
+ names.map do |name|
+ # Normalize: remove diacritics etc.
+ name = name.unicode_normalize(:nfkd)
+ .chars.reject! { |character|
+ !character.ascii_letter? && (character != ' ')
+ }.join("").downcase
+
+ counter_per_year = {} of Int32 => Int32
+ cursor.query("
+ SELECT anio::integer, contador::integer
+ FROM nombres WHERE nombre = $1", name) do |result_set|
+ result_set.each do
+ counter_per_year[result_set.read(Int32)] = result_set.read(Int32)
+ end
+ end
+ (1922..2015).each do |anio|
+ results[anio - 1921] << counter_per_year.fetch(anio, 0).to_s
+ end
+ end
+ end
+ results.to_json
+end
+
+# The `/ping/` endpoint is configured in the container as a healthcheck
+# You can make it better by checking that your database is responding
+# or whatever checks you think are important
+#
+get "/ping/" do
+ pg.connection.exec("SELECT 42")
+ "OK"
+end
diff --git a/historico/funko.yml b/historico/funko.yml
new file mode 100644
index 0000000..d5d9e85
--- /dev/null
+++ b/historico/funko.yml
@@ -0,0 +1,11 @@
+name: historico
+runtime: kemal
+options:
+ shard_build_options: ""
+ ship_packages: []
+ devel_packages: []
+ healthcheck_options: "--interval=1m --timeout=2s --start-period=2s --retries=3"
+ healthcheck_command: "curl --fail http://localhost:3000/ping || exit 1"
+ copy_from_build:
+ - "public public"
+ - "bin/funko ."
diff --git a/historico/handler.py b/historico/handler.py
deleted file mode 100644
index ca78b3a..0000000
--- a/historico/handler.py
+++ /dev/null
@@ -1,66 +0,0 @@
-import unicodedata
-import urllib
-from collections import defaultdict as ddict
-from dataclasses import dataclass
-from json import loads
-
-import pygal
-import pyrqlite.dbapi2 as dbapi2
-import requests
-
-connection = dbapi2.connect(
- host="10.61.0.1",
- user="root",
- port=4001,
- password="",
-)
-
-
-def remove_accents(input_str):
- nfkd_form = unicodedata.normalize("NFKD", input_str)
- return "".join([c for c in nfkd_form if not unicodedata.combining(c)])
-
-
-def handle(req):
- """handle a request to the function
- Args:
- req (str): request body
-
- {"i": ["nombre1, nombre2"]}
-
- """
- nombres = []
- try:
- nombres = loads(req)
- nombres = nombres["i"].split(",")
- nombres = [remove_accents(x.strip().lower()) for x in nombres]
- nombres = [n for n in nombres if n]
- except Exception:
- pass
-
- if not nombres:
- nombres = ["maria", "juan"]
-
- chart = pygal.Line(
- height=200, fill=True, human_readable=True, show_minor_x_labels=False
- )
- chart.x_labels = [str(x) for x in range(1922, 2015)]
- chart.x_labels_major = [str(x) if x % 10 == 0 else "" for x in range(1922, 2015)]
- for nombre in nombres:
- datos = ddict(int)
- with connection.cursor() as cursor:
- sql = """
- SELECT anio, contador, nombre
- FROM nombres
- WHERE nombre = :nombre
- ORDER BY anio
- """
- cursor.execute(sql, {"nombre": nombre})
- datos.update({r["anio"]: r["contador"] for r in cursor.fetchall()})
- chart.add(nombre.title(), [datos[x] for x in range(1922, 2015)])
-
- chart.x_labels = [str(n) for n in range(1922, 2015)]
- chart.x_labels_major = [str(n) for n in range(1920, 2020, 10)]
-
- # return Response(chart.render(is_unicode=True), mimetype="image/svg+xml")
- return chart.render(is_unicode=True), 200, {"Content-Type": "image/svg+xml"}
diff --git a/historico/public/index.html b/historico/public/index.html
new file mode 100644
index 0000000..2f71980
--- /dev/null
+++ b/historico/public/index.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+