我最近升级我之前构建的COVID Rails仪表板。 在这篇文章中,我描述了动机和升级的细节以及共享代码片段。

每天‬分享‬最新‬软件‬开发‬,Devops,敏捷‬,测试‬以及‬项目‬管理‬最新‬,最热门‬的‬文章‬,每天‬花‬3分钟‬学习‬何乐而不为‬,希望‬大家‬点赞‬,评论,加‬关注‬,你的‬支持‬是我‬最大‬的‬动力‬。

早在2020年, 我写了一个使用Rails 6.0.2和ruby 2.5.1 COVID仪表板 。 给定一个日期范围,它显示一个线图的累积以及增量数据证实,死者,恢复情况。 其数据来源:

  1. COVID-19存储库的数据中心系统科学与工程(CSSE)约翰霍普金斯大学:这个GitHub库提供了一个CSV文件每天与国家层面的累积数据。
  2. 这个网站用来提供印度state-wise统计数据 但不幸的是已经停止操作。 国家级数据只有通过30 - 10月- 2021和可以获得通过REST API以JSON格式。

CSSE每天提供累积数据,而covid19india.org提供每日增量数据。我最近升级应用程序。 在这篇文章中,我描述了动机和升级的细节以及共享代码片段。

目标

该系统有两个 Python 和 Ruby 脚本 生成CSV格式的数据集 。 数据插入到数据库,Rails仪表板访问。

四个生成器脚本:

python3 gdc.py ../COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/04-25-2020.csv > datasets/global_daily_cumulative/04-25-2020.csv

python3 gdd.py datasets/global_daily_cumulative/04-25-2020.csv > datasets/global_daily_delta/04-25-2020.csv

ruby idd.rb 25-Apr-20 > datasets/india_daily_delta/04-25-2020.csv

注意日期格式使用covid19india.org dd-month-yy。

ruby idc.rb 04-25-2020 > datasets/india_daily_cumulative/04-25-2020.csv

daily_all。 rb程序读取所有CSV文件在每个数据集目录,使聚合数据文件整理文件的内容。 例如,在global_daily_cumulative文件夹中所有文件的内容是global_daily_cumulative.csv整理。 主文件中的每一行数据的日期作为第一个字段。 文件名称:

生成的日常文件和四个聚合数据文件都有相同的数据格式:日期,地点,确认,死亡,恢复。

问题是,我必须运行的四个程序一天的数据。 当然,我可以堆一组命令一个星期在脚本文件并运行文件,但它仍然需要手动工作准备。

我曾经将数据插入到PostgreSQL通过使用 psql 通过CSV文件作为参数。 一个典型的命令,如下所示(在Windows上):

PowerShell

"C:\Program Files\PostgreSQL\13\bin\psql.exe" -h localhost -U postgres -d covid19 -c "SET client_encoding TO 'UTF8';" -c "\copy global_daily_cumulative(date, place, confirmed, deaths, recovered) FROM 'E:\Code\Corona2020\covid19\global_daily_cumulative.csv' DELIMITER ',' CSV;"

在Linux上,命令是:

psql -d covid19 -c "SET client_encoding TO 'UTF8';" -c "\copy india_daily_delta(date, place, confirmed, deaths, recovered) FROM '/var/www/datasets/covid19/india_daily_delta.csv' DELIMITER ',' CSV;"

完整的工作流程如下图所示:

corona面板怎么设置(COVID仪表板升级)(1)

有三个手动步骤。 我的目标是要做 的端到端自动化 。 的想法是只做一个git克隆或把我的电脑和运行一个Ruby文件。 就是这样。 同时,我也打算 升级的仪表板的技术堆栈 .

实现

我选择的语言肯定是Ruby,我移植两个Python程序Ruby。 四生成器脚本成为Ruby关联类的业务逻辑调用方法。 同样,我封装psql命令关联 InsertCovidDataInDb 。 global_daily_cumulative插入数据的文件。 csv, global_daily_delta。 csv, india_daily_cumulative。 csv和india_daily_delta。 csv表global_daily_cumulative, global_daily_delta india_daily_delta和india_daily_cumulative分别。

一个关联是一个Ruby类,包括关联的宝石,调用方法,编写业务逻辑。 没有创建一个类的对象,调用“叫”的方法来运行业务逻辑。 使用类似于Java静态方法。 环球数码创意的文件。 rb有很棒的课 GenerateGdcData gdd。 rb已经 GenerateGddData ,国际国内直拨电话。 rb已经 GenerateIddData 最后idc。 rb已经 GenerateIdcData 类。 例如,下面的代码 GenerateGdcData :

Ruby

require 'interactor'brrequire 'date'brrequire 'csv'brbr$indexes_to_read = {}br$indexes_to_read['format1'] = [1,3,4,5]br$indexes_to_read['format2'] = [3,7,8,9]br brclass GenerateGdcDatabr include Interactorbr br def callbr country_data_hash = {}br Dir[context.folder '/*.csv'].each do |file_path|br file_name = File.basename(file_path, ".*")br br # if file_name is before 03-22-2020, file_format = format1 else format2br file_date = Date.new(file_name[6..9].to_i, file_name[0..1].to_i, file_name[3..4].to_i)br file_format = file_date < Date.new(2020, 03, 22) ? "format1" : "format2"br file_date_str = file_date.to_sbr br country_index = $indexes_to_read[file_format][0]br confirmed_index = $indexes_to_read[file_format][1]br deaths_index = $indexes_to_read[file_format][2]br recovered_index = $indexes_to_read[file_format][3]brbr CSV.foreach(file_path, headers: true) do |row|br country = row[country_index]br if country == "Mainland China"br country = "China"br elsif country == "Korea, North"br country = "South Korea"br elsif country == "Korea, South"br country = "South Korea"br elsif country == "Gambia, The"br country = "Gambia"br elsif country == "Bahamas, The"br country = "Bahamas"br elsif country == "The Bahamas"br country = "Bahamas"br elsif country == "Gambia, The"br country = "Gambia"br elsif country == "The Gambia"br country = "Gambia"br endbrbr row[confirmed_index] = row[confirmed_index] ? row[confirmed_index] : 0br row[deaths_index] = row[deaths_index] ? row[deaths_index] : 0br row[recovered_index] = row[recovered_index] ? row[recovered_index] : 0br br confirmed = row[confirmed_index].to_ibr deaths = row[deaths_index].to_ibr recovered = row[recovered_index].to_ibr br if file_format == "format2"br row[0] = row[0] ? row[0] : 0br row[5] = row[5] ? row[5] : 0.0br row[6] = row[6] ? row[6] : 0.0br endbrbr if country_data_hash.has_key? [file_date,country]br country_data_hash[[file_date_str,country]][0] = confirmed if confirmedbr country_data_hash[[file_date_str,country]][1] = deaths if deathsbr country_data_hash[[file_date_str,country]][2] = recovered if recoveredbr elsebr country_data_hash[[file_date_str,country]] = [confirmed, deaths, recovered]br endbr endbr endbr context.gdc = country_data_hashbr endbrend

主程序是在一个新的文件,generate_covid19_data.rb。 它的功能很简单:叫五个扶少团团员。

corona面板怎么设置(COVID仪表板升级)(2)

随着自动化升级,我升级堆栈:即。 从2.5.1 Ruby红宝石3.1.1; Rails从6.0.2 7.0.2.3 importmap 顺风 ; 4.1.3 Chartkick从3.4.2; 最后,从12到14 PostgreSQL。

每当我现有的应用程序升级到Rails 7,我的方法是生成一个示例应用程序和非功能性文件复制到现有的应用程序。 具体地说,这些都是本、自由和app / javascript文件夹。 从那里我做其他的变化取决于哪种包装方法我选择。 在这种情况下,我改变了 webpacker 来 importmap 的,所以我需要确保文件bin / importmap。 rb在场并在application.html.erb javascript_importmap_tags。

如何运行

克隆CSSE GitHub回购。

$ git clone https://github.com/CSSEGISandData/COVID-19.git

克隆存储库。

$ git clone https://github.com/mh-github/covid19.git

创建一个名为covid19在PostgreSQL数据库的数据库。 创建四个表。 的命令是 可以在GitHub从92行开始 .rails更新covid19 / /仪表板/ config /数据库。 yml与数据库用户名、密码和端口号。 在文件insert_covid_data_in_db输入相同的值。 rb。到项目根目录:

$ cd covid19

你需要ruby-3.1.1。 如果你使用数位视讯,安装这个版本和使用。

$ rvm install 3.1.1br$ rvm use 3.1.1

安装 httparty , pg , 很棒的 宝石,如果你没有在你的系统。

$ gem install httparty pg interactor

插入数据到数据库中。

$ ruby generate_covid19_data.rb path/to/COVID-19

去仪表板文件夹:

$ cd rails/dashboard

切换到ruby 3.1.1。

$ rvm use 3.1.1

安装所需的宝石。

$ bundle install

运行服务器。

$ rails s

在浏览器中访问仪表盘http://locahost: 3000。 这是澳大利亚的截图显示的图表。

corona面板怎么设置(COVID仪表板升级)(3)

我把代码捕获数据插入时间。 psql似乎非常快。 以下数字:

表格

时间(秒)

global_daily_cumulative

171502年

3.09

global_daily_delta

171502年

3.087

india_daily_cumulative

21677

0.335

india_daily_delta

21195年

0.323

这些都不是坏的考虑到我的基础设施是我的桌面PC与i5 - 4570 CPU @ 3.20 ghz处理器,20 GB RAM, Windows 10 Pro v21H1, WSL2。 我PostgreSQL在Windows上运行,在WSL-Ubuntu主程序。

结论

无论项目大小,总会有机会的 重构 和自动化。 即使你的程序是一个基本教程类型,其技术堆栈升级到最新版本给实践和学习,你可以应用到你的工作的应用程序

,