Skip to content
This repository has been archived by the owner on Aug 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #7 from scoiatael/feature/finish-html
Browse files Browse the repository at this point in the history
Feature/finish html
  • Loading branch information
scoiatael authored Nov 14, 2019
2 parents de046b2 + 2cbfd29 commit e820c44
Show file tree
Hide file tree
Showing 11 changed files with 137 additions and 80 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# Change Log
All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/).

## [1.2.0] - 14.11.2019
### Added
- Sections about language and interests are now properly parsed & added to both JSON and HTML output

### Changed
- Dates are now properly parsed & nicely formatted in HTML output.

## [1.1.1] - 14.11.2019
### Changed
- Internals & CLI entrypoint - now uses `lein export`.
Expand Down
11 changes: 7 additions & 4 deletions TODO.org
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,19 @@
CLOSED: [2019-11-12 Tue 14:33]
** DONE Convert parsed org-mode into resume.json
CLOSED: [2019-11-12 Tue 16:58]
* [50%] Write custom resume.json builder
* [100%] Write custom resume.json builder
** DONE Convert chosen resume format into Clojure template
CLOSED: [2019-11-14 Thu 15:02]
** DONE Embed CSS into HTML
CLOSED: [2019-11-14 Thu 15:07]
** DONE Export static html file
CLOSED: [2019-11-14 Thu 15:12]
** TODO Fix date formatting
** TODO Add languages & interests
** TODO Reword work highlights to work with current theme
** DONE Fix date formatting
CLOSED: [2019-11-14 Thu 19:03]
** DONE Add languages & interests
CLOSED: [2019-11-14 Thu 19:19]
** DONE Reword work highlights to work with current theme
CLOSED: [2019-11-14 Thu 19:42]
* TODO Add PDF export
https://github.com/gered/clj-htmltopdf
* DONE Write static site with stasis
Expand Down
114 changes: 63 additions & 51 deletions org/experience.org
Original file line number Diff line number Diff line change
Expand Up @@ -3,69 +3,74 @@
:FROM: 2014-06-07
:TO: 2019-10-31
:POSITION: Fullstack Developer
Joined as a Junior, left on a path to Seniority after 5 years. In the meantime built through them products with many startups and startup-like companies. Started as a junior backend developer (CoffeeScript, Redis, MongoDB). Gradually worked up to Senior position around 2017.
Joined as a Junior, left on a path to Seniority after 5 years. In the meantime built products with many startups and startup-like companies (listed underneath). Had the chance to take part in explosive growth of the organisation (from 6 to over 150 people).
** One of major car manufacturers
:FROM: 2019-09-01
:TO: 2019-10-31
:POSITION: Freelance researcher
Proof-of-concept for API working in car's head unit, providing information about broadcasts based on car location. Worked solo on:
Update & storage mechanism (Algorithms),
Data cleaning & update simulation (BigQuery, Python, Pandas, PySpark),
Final implementation (Go).
:POSITION: Freelance Researcher / Developer
Proof-of-concept for API working in car's head unit, providing information about broadcasts based on car location.
Designed update & storage mechanism,
Implemented set of embedded binaries with Go,
Cleaned production data & simulated patching process throughout a year,
** Quizzpy
:ICON: https://d33wubrfki0l68.cloudfront.net/b0e95300f043b4d28372f8cf19277df987c936bc/b2032/quizzpy-logo.2aacc600.svg
:FROM: 2018-03-01
:TO: 2019-09-01
:POSITION: Tech Lead / Principle Software Engineer
Live trivia show, targeted for Polish audience. Worked in small cross-competence Scrum team. Focused on:
Architecture & scaling (Event-sourcing, CQRS)
Backend (Elixir, Postgres, Datadog)
Streaming (OBS, Nginx, FFMpeg, RTMP, HLS)
Infrastructure (Ansible, Terraform, AWS [EC2, S3, IAM, VPC, Lambda], Gcp [GKE, Big Query, Cloud SQL, Memory Store, Cloud Functions], Heroku)
Live trivia show, targeted for Polish audience. Worked in small cross-competence Scrum team.
Spearheaded architecture & scaling efforts,
Took part in implementation of backend in Elixir,
Supported streaming pipeline while reducing infrastructure costs,
Converted infrastructure into IaaC model & maintained it using Ansible & Terraform,
Evaluated several Kanban boards to be used by development team (Trello, Taiga, Zenhub),
** Implementation of Holacracy
:ICON: https://images.squarespace-cdn.com/content/5d1239a79c02150001db74d4/1561475648342-TU0F0W6TRID5IAKCKM0E/Holacracy_Primary.png?format=1500w&content-type=image%2Fpng
:FROM: 2018-09-01
:TO: 2019-10-31
:POSITION: Engineering circle Facilitator / Strategy Guardian
Part of initial group which evaluated various frameworks for power division in organisation. Later spearheaded integration of developers into Holacracy, as a framework for structuring company.
:POSITION: Various roles
Part of initial group which evaluated various frameworks for power division in organisation.
Shared knowledge about Holacracy as one of initial mentors,
Spearheaded forming structures around Engineering group as Facilitator, Architect, Estimator and later Strategy Guardian,
** Group Nine Media
:ICON: https://en.wikipedia.org/wiki/Group_Nine_Media#/media/File:Group_Nine_Media_Logo.svg
:FROM: 2016-01-01
:TO: 2018-03-01
:POSITION: Data pipeline Tech Lead
Platform for monitoring & analysis of publishings on social platforms. Tech lead of group which designed & implemented:
Data pipeline (Lambda Architecture),
Warehousing (Go, Ruby, Cassandra),
Anomaly detection (Ruby, Redis, Postgres, Google Spreadsheets API),
Looker integration (Ruby, Postgres),
Data Science batch analysis framework (Python, Spark, Jupyter, Apache Zepplin),
Ingestion (Ruby, Facebook Graph API),
As part of Ops team, used Chef, Nomad, Consul, Hashicorp Vault, Datadog & Docker on OVH.
:POSITION: Data Pipeline Tech Lead
Platform for monitoring & analysis of publishings on social platforms.
Took over PoCs created by AI/ML Engineers, mostly working with CSVs,
Designed initial push into online system based on Lambda architecture,
Lead team of engineers which implemented whole pipeline,
Maintained features for users like Anomaly Detection and Looker integration,
Helped Data Scientists work with over 3TB of data with PySpark, Jupyter and Apache Zeppelin,
Took part in on-call system which helped keep the system online for 2 years,
Implemented and oversaw monitoring using Datadog,
Helped Ops team maintain and extend infrastructure with Chef,
** NowThis
:ICON: https://en.wikipedia.org/wiki/NowThis_News#/media/File:Now_This_Logo_White.svg
:FROM: 2014-10-01
:TO: 2016-01-01
:POSITION: Backend Developer
Custom workflow & automatization platform. Worked part-time as part of several backend groups, co-authored:
Architecture (Event-sourcing, CQRS),
CI/CD pipeline (Jenkins, Docker, Nomad, Bash, Ruby).
Custom workflow & automatization platform. Worked part-time as part of several backend groups.
Helped design architecture based on EventSourcing and CQRS,
Implemented CI/CD pipeline using Ruby and Jenkins,
Helped developers deploy and debug containers using Docker, Hashicorp Nomad & Vault,
** Golem app
:ICON: https://web.archive.org/web/20160318141954im_/http://golemapp.com/static/images/logo.png
:FROM: 2014-06-07
:TO: 2014-09-01
:POSITION: Junior Fullstack Developer
Remote camera control for iOS devices with Galileo. Solely responsible for:
Backend (Coffescript, Node.js, Redis, MongoDB)
Admin panel (Angular 1.0)
Hangouts integration (React)
Deployment (Vagrant, Debian, Fabric)
Remote camera control for iOS devices with Galileo.
Wrote simple backend in Node.js,
Implemented analytics features using MongoDB and Angular 1.0,
Added Hangouts integration with React,
Took care of deployment and maintenance with Fabric on Debian,
* Skills
** Backend
:LEVEL: Senior
Golang
Elixir
Ruby
Node.js (Coffeescript, Typescript, ES6)
Node.js
Postgres
Redis
Cassandra
Expand All @@ -74,32 +79,32 @@
Chef
Ansible
Terraform
Computing Clouds
Computing Clouds (GCP, AWS)
CDNs
Docker / Kubernetes
Networking
** Frontend
:LEVEL: Mid
Javascript (Coffeescript, Typescript, ES6)
Sass
Javascript
Css / Sass
React / Redux
Vue.js
** Big Data
:LEVEL: Mid
Python (PySpark, Pandas, Jupter)
BigQuery
** Architecture
:LEVEL: Mid
EventSourcing
CQRS
DDD
Command Query Responsibility Segregation
Domain-driven design
Lambda architecture
** Delivering products
** Product development
:LEVEL: Mid
Agile development
Jira
Zenhub
Scrum
** Big Data
:LEVEL: Mid
Python
BigQuery
* Education
** Master of Computer Science (2011-2016)
:FROM: 2011-10-01
Expand All @@ -112,7 +117,7 @@
:NAME: Łukasz Czapliński
:LABEL: Web Developer / Architect
:EMAIL: [email protected]
:SUMMARY: I'm a fullstack with a focus on delivering & evolving products, not simply building features according to schedule. I'm open to working both remotely and on-site.
:SUMMARY: I'm a fullstack with focus on delivering & evolving products, not simply building features according to schedule. I'm open to working both remotely and on-site.
** Location
:CITY: Wrocław
:COUNTRY: PL
Expand All @@ -123,12 +128,19 @@
*** Keybase
:USERNAME: scoiatael
:URL: https://keybase.io/scoiatael
** Professional interests
- Networking
- Machine learning and numerical analysis
- Computer graphics / game development
- Formal semantics of programming languages
** Personal
- Windsurfing
- Yachting
- Tabletop and collectible card games
* Interests
** Yachting
Polish skipper degree
** Tabletop and collectible card games
Magic the Gathering
Warhammer 40k
** Windsurfing
* Languages
** Polish
:LEVEL: native
** English
:LEVEL: bilingual
** Spanish
:LEVEL: novice
** German
:LEVEL: novice
3 changes: 2 additions & 1 deletion project.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(defproject resume "1.1.1"
(defproject resume "1.2.0"
:description "Resume-from-org generator"
:url "http://example.com/FIXME"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
Expand All @@ -7,6 +7,7 @@
[cheshire "5.9.0"]
[org.clojure/core.match "0.3.0"]
[selmer "1.12.17"]
[clojure.java-time "0.3.2"]
[stasis "2.5.0"]]
:aliases {"export" ["run" "-m" "resume.core/export"]
"test" ["with-profile" "test" "midje"]}
Expand Down
4 changes: 2 additions & 2 deletions resources/templates/resume.html
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ <h3>Work</h3>
<h4 class="strike-through">
<span>{{work.company}}</span>
<span class="date">
{{work.startDate}} — {{work.endDate}}
{{work.startDate|date:"MMM yyyy"}} — {{work.endDate|date:"MMM yyyy"}}
</span>
</h4>
{% with url=work.website %}
Expand Down Expand Up @@ -179,7 +179,7 @@ <h3>Education</h3>
<h4 class="strike-through">
<span>{{education.institution}}</span>
<span class="date">
{{education.startDate}} — {{education.endDate}}
{{education.startDate|date:"MMM yyyy"}} — {{education.endDate|date:"MMM yyyy"}}
</span>
</h4>
<div class="area">
Expand Down
7 changes: 2 additions & 5 deletions src/resume/core.clj
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
(ns resume.core
(:require [clojure.java.io :as io]
[selmer.parser :as selmer]
[stasis.core :as stasis]
[resume.pages :as pages]))
(:require [resume.pages :as pages]
[stasis.core :as stasis]))

(def export-dir "target/dist")

(defn export []
(selmer/set-resource-path! (io/resource "templates"))
(stasis/empty-directory! export-dir)
(stasis/export-pages pages/all export-dir))
2 changes: 2 additions & 0 deletions src/resume/gen.clj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
org/parse
resume-json/export))

(selmer/set-resource-path! (io/resource "templates"))

(defn resume-html
"Prepare resume.html source"
[]
Expand Down
6 changes: 6 additions & 0 deletions src/resume/pages.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
(ns resume.pages
(:require [cheshire.core :as cheshire]
[cheshire.generate :refer [add-encoder]]
[java-time :as time]
[resume.gen :as gen]))

(add-encoder java.time.LocalDate
(fn [c jsonGenerator]
(.writeString jsonGenerator (time/format "yyyy-MM-dd" c))))

(def all {"/resume.html" (fn [_req] (gen/resume-html))
"/resume.json" (fn [_req] (-> (gen/resume-json) (cheshire/generate-string {:pretty true})))})
35 changes: 28 additions & 7 deletions src/resume/resume_json.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
(ns resume.resume-json)
(ns resume.resume-json
(:require [java-time :as time]))

(defn parse-date
[date]
(time/local-date "yyyy-MM-dd" date))

(defn export-education
"Convert org section about education into resume.json format"
Expand All @@ -8,8 +13,8 @@
area "AREA"
degree "DEGREE"
institution "INSTITUTION"} :options} education]
{:endDate to
:startDate from
{:endDate (parse-date to)
:startDate (parse-date from)
:area area
:studyType degree
:institution institution}))
Expand Down Expand Up @@ -67,18 +72,34 @@
{:summary (first text)
:company name
:position (get options "POSITION")
:startDate (get options "FROM")
:endDate (get options "TO")
:startDate (parse-date (get options "FROM"))
:endDate (parse-date (get options "TO"))
:highlights (rest text)}))

(defn export-interest
"Convert org section about interest into resume.json format"
[interest]
(let [{interest :heading
keywords :text} interest]
{:keywords keywords
:name interest}))

(defn export-language
"Convert org section about language into resume.json format"
[language]
(let [{language :heading
{fluency "LEVEL"} :options} language]
{:fluency fluency
:language language}))

(defn export
"Exports parsed org experience file into resume.json format"
[org]
(let [sections-by-name (sections-into-map org)]
{:basics (->> sections-by-name (#(get % "Basics")) export-basics)
:education (->> sections-by-name (#(get % "Education")) :children (map export-education))
:references []
:skills (->> sections-by-name (#(get % "Skills")) :children (map export-skills))
:awards []
:work (->> sections-by-name (#(get % "Experience")) :children (map export-experience))
:languages (->> sections-by-name (#(get % "Languages")) :children (map export-language))
:interests (->> sections-by-name (#(get % "Interests")) :children (map export-interest))
:meta {:theme :pumpkin}}))
8 changes: 2 additions & 6 deletions src/resume/web.clj
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
(ns resume.web
(:require [clojure.java.io :as io]
[selmer.parser :as selmer]
[resume.pages :as pages]
(:require [resume.pages :as pages]
[stasis.core :as stasis]))

(def app (do
(selmer/set-resource-path! (io/resource "templates"))
(stasis/serve-pages pages/all)))
(def app (stasis/serve-pages pages/all))
20 changes: 16 additions & 4 deletions test/resume/resume_json_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
"AREA" "Software Engineering (incomplete)",
"DEGREE" "Bachelors"
"INSTITUTION" "The University of Queensland"}})
=> {:endDate "2012-01-12"
:startDate "2009-12-12"
=> {:endDate (sut/parse-date "2012-01-12")
:startDate (sut/parse-date "2009-12-12")
:area "Software Engineering (incomplete)"
:studyType "Bachelors"
:institution "The University of Queensland"})
Expand Down Expand Up @@ -47,7 +47,19 @@
=> {:summary "Blockbid is an Australian crypto currency exchange."
:company "Blockbid"
:position "Senior Javascript Developer"
:startDate "2018-03-01"
:endDate "2019-03-01"
:startDate (sut/parse-date "2018-03-01")
:endDate (sut/parse-date "2019-03-01")
:highlights ["React, Apollo, Styled Components"
"Node.js / Rails"]})

(midje/fact "Interests are exported properly"
(sut/export-interest {:heading "Netflix"
:text ["Chilling" "Popcorn"]})
=> {:name "Netflix"
:keywords ["Chilling" "Popcorn"]})

(midje/fact "Languages are exported properly"
(sut/export-language {:heading "KPOP"
:options {"LEVEL" "over 9000"}})
=> {:language "KPOP"
:fluency "over 9000"})

0 comments on commit e820c44

Please sign in to comment.