[rzz] test-gym
change
commit d710726d55c3dae076e081fa6dc0e3b4f43fabd6
author Alpha Chen <alpha@kejadlen.dev>
date
parent 04072139
diff --git a/ansible/docker/rzz/Dockerfile b/ansible/docker/rzz/Dockerfile
new file mode 100644
index 00000000..ba9ef267
--- /dev/null
+++ b/ansible/docker/rzz/Dockerfile
@@ -0,0 +1,13 @@
+FROM arm32v7/ruby:2.7
+
+# throw errors if Gemfile has been modified since Gemfile.lock
+RUN bundle config --global frozen 1
+
+WORKDIR /usr/src/app
+
+COPY Gemfile Gemfile.lock ./
+RUN bundle install
+
+COPY . .
+
+CMD ["rackup", "--host", "0.0.0.0"]
diff --git a/ansible/docker/rzz/Gemfile b/ansible/docker/rzz/Gemfile
new file mode 100644
index 00000000..ac1f8b7e
--- /dev/null
+++ b/ansible/docker/rzz/Gemfile
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
+
+gem "nokogiri"
+gem "roda"
+
+group :development do
+  gem "pry"
+  gem "rake"
+  gem "rerun"
+end
diff --git a/ansible/docker/rzz/Gemfile.lock b/ansible/docker/rzz/Gemfile.lock
new file mode 100644
index 00000000..f5d0face
--- /dev/null
+++ b/ansible/docker/rzz/Gemfile.lock
@@ -0,0 +1,37 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    coderay (1.1.2)
+    ffi (1.12.1)
+    listen (3.2.1)
+      rb-fsevent (~> 0.10, >= 0.10.3)
+      rb-inotify (~> 0.9, >= 0.9.10)
+    method_source (0.9.2)
+    mini_portile2 (2.4.0)
+    nokogiri (1.10.7)
+      mini_portile2 (~> 2.4.0)
+    pry (0.12.2)
+      coderay (~> 1.1.0)
+      method_source (~> 0.9.0)
+    rack (2.1.1)
+    rake (13.0.1)
+    rb-fsevent (0.10.3)
+    rb-inotify (0.10.1)
+      ffi (~> 1.0)
+    rerun (0.13.0)
+      listen (~> 3.0)
+    roda (3.28.0)
+      rack
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  nokogiri
+  pry
+  rake
+  rerun
+  roda
+
+BUNDLED WITH
+   2.1.2
diff --git a/ansible/docker/rzz/Rakefile b/ansible/docker/rzz/Rakefile
new file mode 100644
index 00000000..f14f253d
--- /dev/null
+++ b/ansible/docker/rzz/Rakefile
@@ -0,0 +1,17 @@
+desc "Run RZZ in development mode"
+task :dev do
+  sh "rerun -- rackup"
+end
+
+namespace :docker do
+  TAG = "kejadlen/rzz"
+
+  task :build do
+    sh "docker build --tag #{TAG} ."
+  end
+
+  task push: :build do
+    sh "docker push #{TAG}"
+  end
+end
+
diff --git a/ansible/docker/rzz/config.ru b/ansible/docker/rzz/config.ru
new file mode 100644
index 00000000..12c0fb7b
--- /dev/null
+++ b/ansible/docker/rzz/config.ru
@@ -0,0 +1,3 @@
+require_relative "rzz"
+
+run Rzz::App.freeze.app
diff --git a/ansible/docker/rzz/rzz.rb b/ansible/docker/rzz/rzz.rb
new file mode 100644
index 00000000..57c2ab84
--- /dev/null
+++ b/ansible/docker/rzz/rzz.rb
@@ -0,0 +1,44 @@
+require "digest/sha1"
+require "open-uri"
+
+require "nokogiri"
+require "roda"
+
+module Rzz
+
+  class App < Roda
+    plugin :caching
+
+    route do |r|
+      r.get do
+        r.is "test-gym" do
+          url = "https://elemental.medium.com/feed/"
+          xml = URI.open(url).read
+          r.etag Digest::SHA1.hexdigest(xml)
+
+          doc = Nokogiri::XML(xml)
+          doc
+            .xpath("/rss/channel/item")
+            .select {|item| item.xpath("./category[text()='test-gym']").empty? }
+            .each(&:remove)
+
+          doc
+            .xpath("/rss/channel/item")
+            .each do |item|
+              link = item.at_xpath("./link/text()").content
+              item.at_xpath("./description/text()").content = URI.open(link).read
+            end
+
+          response.headers["Content-Type"] = "text/xml"
+          doc.to_xml
+        end
+      end
+    end
+  end
+
+end
+
+if __FILE__ == $0
+  require "pry"
+  binding.pry
+end