diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2022-05-14 19:56:06 +0200 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2022-05-14 19:56:06 +0200 |
commit | e964ec8f74b644d66ca166a7524adcc3a82709c9 (patch) | |
tree | b1a87d6a1333ae87fda5121b1993a050079afa43 | |
parent | 16ef06ffb363b6304d0d5269b30dedbdd07288df (diff) | |
download | macroblog.rs-e964ec8f74b644d66ca166a7524adcc3a82709c9.tar.gz macroblog.rs-e964ec8f74b644d66ca166a7524adcc3a82709c9.tar.bz2 macroblog.rs-e964ec8f74b644d66ca166a7524adcc3a82709c9.zip |
feat: Move code to blog
- Move most logic of the blog to blog.rs, making it easier to test.
- Now the file contains the creation date of the blog post to be parsed.
- Add chrono to parse datetime, so later we can order by date.
- Refactor gitlab pipeline, move `before_script` to a proper place.
-rw-r--r-- | .gitlab-ci.yml | 10 | ||||
-rw-r--r-- | Cargo.lock | 52 | ||||
-rw-r--r-- | Cargo.toml | 7 | ||||
-rw-r--r-- | content/posts/2020-07-14Friz_box_turned_off_DHCP.html (renamed from content/posts/Friz.box_turned_off_DHCP.html) | 0 | ||||
-rw-r--r-- | content/posts/2021-12-26Enable_NFS_on_K3S.html (renamed from content/posts/Enable_NFS_on_K3S.html) | 0 | ||||
-rw-r--r-- | content/posts/2021-12-26K8S_private_gitlab_registry_using_podman.html (renamed from content/posts/K8S_private_gitlab_registry_using_podman.html) | 0 | ||||
-rw-r--r-- | src/blog.rs | 74 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/main.rs | 64 | ||||
-rw-r--r-- | tests/test_blog.rs | 36 | ||||
-rw-r--r-- | tests/test_router.rs | 2 |
11 files changed, 177 insertions, 70 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 12003e9..8cae0ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,14 +1,9 @@ -before_script: - - apt-get update -qy - - apt-get install -y ruby-dev - - gem install dpl - stages: - test - production test: - image: rust:latest + image: rust:alpine stage: test script: - cargo install cargo2junit @@ -25,6 +20,9 @@ production: needs: - test script: + - apt-get update -qy + - apt-get install -y ruby-dev + - gem install dpl - gem install faraday -v 1.8.0 - dpl --provider=heroku --app=$HEROKU_APP --api-key=$HEROKU_API_KEY only: @@ -45,6 +45,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] name = "cpufeatures" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -287,6 +300,7 @@ dependencies = [ name = "macroblog" version = "0.1.0" dependencies = [ + "chrono", "hyper", "regex", "rust-embed", @@ -310,7 +324,7 @@ dependencies = [ "log", "miow", "ntapi", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi", ] @@ -333,6 +347,25 @@ dependencies = [ ] [[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] name = "num_cpus" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -602,6 +635,17 @@ dependencies = [ ] [[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] name = "tokio" version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -740,6 +784,12 @@ dependencies = [ [[package]] name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" @@ -8,7 +8,8 @@ sailfish = "0.4.0" hyper = { version = "0.14", features = ["full"] } tokio = { version = "1", features = ["full"] } regex = "1.5" -rust-embed="6.4.0" +rust-embed = "6.4.0" +chrono = "0.4" [profile.release] opt-level = 'z' @@ -18,5 +19,5 @@ panic = 'abort' strip = true [lib] -name="router" -path="src/router.rs" +name="macroblog" +path="src/lib.rs" diff --git a/content/posts/Friz.box_turned_off_DHCP.html b/content/posts/2020-07-14Friz_box_turned_off_DHCP.html index 569604b..569604b 100644 --- a/content/posts/Friz.box_turned_off_DHCP.html +++ b/content/posts/2020-07-14Friz_box_turned_off_DHCP.html diff --git a/content/posts/Enable_NFS_on_K3S.html b/content/posts/2021-12-26Enable_NFS_on_K3S.html index 09f91e7..09f91e7 100644 --- a/content/posts/Enable_NFS_on_K3S.html +++ b/content/posts/2021-12-26Enable_NFS_on_K3S.html diff --git a/content/posts/K8S_private_gitlab_registry_using_podman.html b/content/posts/2021-12-26K8S_private_gitlab_registry_using_podman.html index 43b8245..43b8245 100644 --- a/content/posts/K8S_private_gitlab_registry_using_podman.html +++ b/content/posts/2021-12-26K8S_private_gitlab_registry_using_podman.html diff --git a/src/blog.rs b/src/blog.rs new file mode 100644 index 0000000..6c190a9 --- /dev/null +++ b/src/blog.rs @@ -0,0 +1,74 @@ +use rust_embed::RustEmbed; +use sailfish::TemplateOnce; +use chrono::NaiveDate; +use regex::{Regex}; +use std::str; + +const BLOG_REGEX: &str = r"(?P<date>[\d]{4}-[\d]{2}-[\d]{2})(?P<title>[a-zA-Z0-9_]*)"; + +#[derive(RustEmbed)] +#[folder = "content/posts/"] +struct PostAsset; + + +#[derive(TemplateOnce)] +#[template(path = "index.html")] +struct IndexTemplate { + posts: Vec<BlogEntry>, +} + +#[derive(TemplateOnce)] +#[template(path = "post.html")] +struct PostTemplate { + content: String, +} + +pub struct BlogEntry { + pub title: String, + pub datetime: NaiveDate, + pub file: String, +} + +impl BlogEntry { + pub fn new(path: &String) -> BlogEntry { + let re = Regex::new(BLOG_REGEX).unwrap(); + let caps = re.captures(path).unwrap(); + let date = &caps["date"]; + let title = str::replace(&caps["title"], "_", " "); + + BlogEntry { + title: String::from(title), + file: String::from(path), + datetime: NaiveDate::parse_from_str(date, "%Y-%m-%d").unwrap() + } + } + + pub fn read_assets() -> Vec<BlogEntry> { + PostAsset::iter() + .map(|e| format!("{}", e)) + .map(|e| BlogEntry::new(&e)) + .collect() + } +} + +fn get_file_content(path: &str) -> String { + let buffer = PostAsset::get(path) + .unwrap() + .data + .into_owned(); + + return String::from_utf8(buffer).unwrap(); +} + + +pub fn render_post_page(path: &String) -> String { + PostTemplate { content: get_file_content(path) } + .render_once() + .unwrap() +} + +pub fn render_index_page() -> String { + IndexTemplate { posts: BlogEntry::read_assets() } + .render_once() + .unwrap() +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..0c69888 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod blog; +pub mod router; diff --git a/src/main.rs b/src/main.rs index 63a5386..ed34713 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,60 +1,11 @@ -pub mod router; use std::convert::Infallible; -use rust_embed::RustEmbed; -use std::{env, str}; +use std::{env}; use std::net::SocketAddr; use hyper::{Body, Request, Response, Server}; use hyper::service::{make_service_fn, service_fn}; -use sailfish::TemplateOnce; -use ::router::Router; - -struct PostEntry { - title: String, - file: String, -} - -#[derive(TemplateOnce)] -#[template(path = "index.html")] -struct IndexTemplate { - posts: Vec<PostEntry>, -} - -#[derive(TemplateOnce)] -#[template(path = "post.html")] -struct PostTemplate { - content: String, -} - -#[derive(RustEmbed)] -#[folder = "content/posts/"] -struct PostAsset; - - -fn get_file_content(path: &str) -> String { - let buffer = PostAsset::get(path) - .unwrap() - .data - .into_owned(); - - return String::from_utf8(buffer).unwrap(); -} - -fn get_post_entry(path: &String) -> PostEntry { - let sub_title = str::replace(path, "_", " "); - let title = str::replace(sub_title.as_str(), ".html", ""); - PostEntry { - title: String::from(title), - file: String::from(path), - } -} - -fn get_post_title() -> Vec<PostEntry> { - PostAsset::iter() - .map(|e| format!("{}", e)) - .map(|e| get_post_entry(&e)) - .collect() -} +use macroblog::router::Router; +use macroblog::blog::{render_index_page, render_post_page}; async fn not_found() -> Result<Response<Body>, Infallible> { @@ -67,10 +18,7 @@ async fn not_found() -> Result<Response<Body>, Infallible> { async fn index() -> Result<Response<Body>, Infallible> { - let files = get_post_title(); - let body = IndexTemplate { posts: files } - .render_once() - .unwrap(); + let body = render_index_page(); let resp: Response<Body> = Response::builder() .status(200) @@ -83,9 +31,7 @@ async fn index() -> Result<Response<Body>, Infallible> { async fn post(path: &String) -> Result<Response<Body>, Infallible> { - let body = PostTemplate { content: get_file_content(path) } - .render_once() - .unwrap(); + let body = render_post_page(path); let resp: Response<Body> = Response::builder() .status(200) diff --git a/tests/test_blog.rs b/tests/test_blog.rs new file mode 100644 index 0000000..31d5725 --- /dev/null +++ b/tests/test_blog.rs @@ -0,0 +1,36 @@ +use macroblog::blog::*; + +use chrono::NaiveDate; + + +#[test] +fn test_create_blog_entry() { + let asset_filename = String::from("2021-12-03Enable_NFS_on_K3S.html"); + let post_date = NaiveDate::from_ymd(2021, 12, 03); + + let blog_entry = BlogEntry::new(&asset_filename); + + assert_eq!(blog_entry.title, "Enable NFS on K3S"); + assert_eq!(blog_entry.datetime, post_date); +} + +#[test] +fn test_read_assets() { + // This test meant to test if all files are parsed correctly + let assets = BlogEntry::read_assets(); + assert!(assets.iter().count() > 1) +} + +#[test] +fn test_render_post_page() { + let path = &String::from("2020-07-14Friz_box_turned_off_DHCP.html"); + let page = render_post_page(path); + assert!(!page.is_empty()); +} + + +#[test] +fn test_render_index_page() { + let page = render_index_page(); + assert!(!page.is_empty()); +} diff --git a/tests/test_router.rs b/tests/test_router.rs index 0158d78..7ebe019 100644 --- a/tests/test_router.rs +++ b/tests/test_router.rs @@ -1,4 +1,4 @@ -use router::{Router}; +use macroblog::router::{Router}; #[test] fn test_router_new_posts() { |