diff --git a/pages/index.tsx b/pages/index.tsx
index bf54b81..b0014c0 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -108,8 +108,15 @@ export default function Home() {
Regular PDF
Something to geek out on
-
- This site and the following files are generated from resume.clintp.json which conforms to JSON Resume
+
+ This following files are also available
{/*
diff --git a/resume/Pipfile b/resume/Pipfile
index 4152069..24c6935 100644
--- a/resume/Pipfile
+++ b/resume/Pipfile
@@ -14,6 +14,12 @@ sumy = "*"
py-readability-metrics = "*"
check-jsonschema = "*"
prefect = "*"
+luigi = "*"
+pandas = "*"
+requests = "*"
+qrcode = "*"
+segno = "*"
+qrcode-artistic = "*"
[requires]
python_version = "3.9"
diff --git a/resume/Pipfile.lock b/resume/Pipfile.lock
index 4b84c2d..581af07 100644
--- a/resume/Pipfile.lock
+++ b/resume/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "4210314c375f01206ba83cb645efd86b985642acfa8dc1ca1c0904a63088c23c"
+ "sha256": "bbf1ce650b5d019460eeb80f55b5d9a2c463bbac081c3f060fbaa3fd21c41c61"
},
"pipfile-spec": 6,
"requires": {
@@ -627,6 +627,14 @@
],
"version": "==0.6.2"
},
+ "docutils": {
+ "hashes": [
+ "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6",
+ "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.20.1"
+ },
"email-validator": {
"hashes": [
"sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44",
@@ -1193,6 +1201,20 @@
"markers": "python_version >= '3.6'",
"version": "==29.0.0"
},
+ "lockfile": {
+ "hashes": [
+ "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799",
+ "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"
+ ],
+ "version": "==0.12.2"
+ },
+ "luigi": {
+ "hashes": [
+ "sha256:d3ede04966655c13bc4f473f6390268c62e83c4c4540d78936c4f12496e4f128"
+ ],
+ "index": "pypi",
+ "version": "==3.5.0"
+ },
"lxml": {
"hashes": [
"sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01",
@@ -1520,7 +1542,7 @@
"sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3",
"sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"
],
- "markers": "python_version >= '3.9'",
+ "markers": "python_version < '3.11'",
"version": "==1.26.4"
},
"oauthlib": {
@@ -1603,6 +1625,42 @@
"markers": "python_version >= '3.7'",
"version": "==23.2"
},
+ "pandas": {
+ "hashes": [
+ "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1",
+ "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e",
+ "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f",
+ "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2",
+ "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18",
+ "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae",
+ "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd",
+ "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab",
+ "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430",
+ "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a",
+ "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106",
+ "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5",
+ "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670",
+ "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88",
+ "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b",
+ "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d",
+ "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71",
+ "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5",
+ "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e",
+ "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc",
+ "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30",
+ "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7",
+ "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3",
+ "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a",
+ "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440",
+ "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a",
+ "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042",
+ "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1",
+ "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==2.2.0"
+ },
"pandocfilters": {
"hashes": [
"sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e",
@@ -1957,6 +2015,21 @@
"markers": "python_full_version >= '3.6.8'",
"version": "==3.1.1"
},
+ "pypng": {
+ "hashes": [
+ "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c",
+ "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1"
+ ],
+ "version": "==0.20220715.0"
+ },
+ "python-daemon": {
+ "hashes": [
+ "sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341",
+ "sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5"
+ ],
+ "markers": "python_version >= '3'",
+ "version": "==3.0.1"
+ },
"python-dateutil": {
"hashes": [
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
@@ -2152,6 +2225,24 @@
"markers": "python_version >= '3.6'",
"version": "==25.1.2"
},
+ "qrcode": {
+ "hashes": [
+ "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a",
+ "sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==7.4.2"
+ },
+ "qrcode-artistic": {
+ "hashes": [
+ "sha256:a2aa751a7f0220767f70842cceec206b21f9207478b9612d468273a1f46429ae",
+ "sha256:eb71f12673c89f638cf7252554a74ecbe4a22f1ce15920caa53da75a48c181f4"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.5'",
+ "version": "==3.0.2"
+ },
"qtconsole": {
"hashes": [
"sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b",
@@ -2393,6 +2484,7 @@
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
],
+ "index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==2.31.0"
},
@@ -2605,6 +2697,15 @@
"markers": "python_version < '3.13' and platform_python_implementation == 'CPython'",
"version": "==0.2.8"
},
+ "segno": {
+ "hashes": [
+ "sha256:e90c6ff82c633f757a96d4b1fb06cc932589b5237f33be653f52252544ac64df",
+ "sha256:f23da78b059251c36e210d0cf5bfb1a9ec1604ae6e9f3d42f9a7c16d306d847e"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.5'",
+ "version": "==1.6.1"
+ },
"send2trash": {
"hashes": [
"sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679",
@@ -2726,6 +2827,14 @@
"index": "pypi",
"version": "==0.11.0"
},
+ "tenacity": {
+ "hashes": [
+ "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a",
+ "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==8.2.3"
+ },
"terminado": {
"hashes": [
"sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded",
@@ -2791,11 +2900,11 @@
},
"tqdm": {
"hashes": [
- "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386",
- "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"
+ "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9",
+ "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"
],
"markers": "python_version >= '3.7'",
- "version": "==4.66.1"
+ "version": "==4.66.2"
},
"traitlets": {
"hashes": [
@@ -2829,6 +2938,14 @@
"markers": "python_version >= '3.8'",
"version": "==4.9.0"
},
+ "tzdata": {
+ "hashes": [
+ "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3",
+ "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"
+ ],
+ "markers": "python_version >= '2'",
+ "version": "==2023.4"
+ },
"tzlocal": {
"hashes": [
"sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8",
@@ -2925,11 +3042,11 @@
},
"uvicorn": {
"hashes": [
- "sha256:4b85ba02b8a20429b9b205d015cbeb788a12da527f731811b643fd739ef90d5f",
- "sha256:54898fcd80c13ff1cd28bf77b04ec9dbd8ff60c5259b499b4b12bb0917f22907"
+ "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a",
+ "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"
],
"markers": "python_version >= '3.8'",
- "version": "==0.27.0.post1"
+ "version": "==0.27.1"
},
"wcwidth": {
"hashes": [
diff --git a/resume/__init__.py b/resume/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/resume/build/clintp-qrcode.gif b/resume/build/clintp-qrcode.gif
new file mode 100644
index 0000000..dab48a7
Binary files /dev/null and b/resume/build/clintp-qrcode.gif differ
diff --git a/resume/build/clintp.gif b/resume/build/clintp.gif
new file mode 100644
index 0000000..950261c
Binary files /dev/null and b/resume/build/clintp.gif differ
diff --git a/resume/examples/transform.py b/resume/examples/transform.py
new file mode 100644
index 0000000..5e91a42
--- /dev/null
+++ b/resume/examples/transform.py
@@ -0,0 +1,68 @@
+import luigi
+import json
+import segno
+from segno import helpers
+from urllib.request import urlopen, urlparse
+from PIL import Image
+
+
+class ExtractResume(luigi.Task):
+ output_file = luigi.Parameter(default='resume.clintp.json')
+
+ def run(self):
+ pass
+
+ def output(self):
+ return luigi.LocalTarget(self.output_file)
+
+
+class FetchAndConvertProfileImage(luigi.Task):
+ def requires(self):
+ return {
+ 'resume': ExtractResume()
+ }
+
+ def run(self):
+ resume = json.load(open(self.input()['resume'].path))
+ profile_image = urlopen(resume['basics']['image'])
+
+ image = Image.open(profile_image).quantize(
+ colors=256, method=2).convert('RGB')
+ pixelated = image.resize((40, 40)).resize(image.size, Image.NEAREST)
+
+ pixelated.save(self.output().path)
+
+ def output(self):
+ return luigi.LocalTarget("build/clintp.gif")
+
+
+class GenerateQrCode(luigi.Task):
+ def requires(self):
+ return {
+ 'resume': ExtractResume(),
+ 'profile_image': FetchAndConvertProfileImage()
+ }
+
+ def run(self):
+ # access the resume that was generated in a previous task
+
+ resume = json.load(open(self.input()['resume'].path))
+ # parse the site_url and remove the protocol as it's included for some reason in the qrcode
+
+ parsed_url = urlparse(resume['basics']['url'])
+ url_without_protocol = parsed_url.netloc + parsed_url.path
+
+ qrcode = helpers.make_mecard(name=resume['basics']['name'],
+ email=(resume['basics']['email']),
+ url=url_without_protocol)
+
+ qrcode.to_artistic(background=self.input()['profile_image'].path,
+ target=self.output().path, scale=5)
+
+ def output(self):
+ return luigi.LocalTarget("build/clintp-qrcode.gif")
+
+
+if __name__ == "__main__":
+ # luigi.build([TaskD()], workers=1, local_scheduler=True)
+ luigi.build([GenerateQrCode()], workers=1, local_scheduler=True)
diff --git a/resume/resume.clintp.json b/resume/resume.clintp.json
index 9faab2d..d659bfe 100644
--- a/resume/resume.clintp.json
+++ b/resume/resume.clintp.json
@@ -315,10 +315,6 @@
}
],
"references": [
- {
- "name": "Danny Chin",
- "reference": "It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company."
- }
],
"projects": [
{