From 844f582aae4e929829265fc53201c25ec6a8e34f Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 13 Sep 2024 22:29:24 +0200 Subject: [PATCH 01/61] Shorten and rephrase English summary --- content.yml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/content.yml b/content.yml index 31e9532..cc8492f 100644 --- a/content.yml +++ b/content.yml @@ -1,5 +1,5 @@ summary: - de: | + de: | # FIXME: Update from English summary below Ich habe im September 2021 das EU-geförderte European Master of Global Studies Studienprogramm absolviert, mit dem Schwerpunkt globale Prozesse der Raumaneignung, Nationenbildung und narrativer Ideologien. @@ -18,20 +18,11 @@ summary: die Schaffung von Bedingungen für eine offene und barrierefreie Wissensproduktion. en: | - I graduated from the EU-funded European Master of Global Studies programme in September 2021 - with a focus on global processes of spatialization, nation-building and narrative ideologies. + Since graduating from the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant analyzing processes of spatialization, inequality and poverty reduction, and collective organization, primarily through the lens of labour market policies. - Since then I helped produce a variety of development research literature, - with a focus on labor market policies, their effects on poverty and collective organization, and multi-dimensional inequality reduction. + In producing a variety of development research literature, I have developed a broad range of skills in data acquisition, organization and analysis, as well as manuscript editing and reference management. In addition to research skills, I have gotten insights into event management, teaching assistance, content creation, system administration and website management. - I have developed a broad range of skills in data acquisition, organization and analysis, - manuscript editing and reference management, - as well as first insights into event management, teaching assistance, content creation and website management. - The range of my academic work has spanned development studies, tourism studies, social protection, American studies and security studies. - - Aside from academic work I am interested in and an active proponent - of free and open software production and - creating the conditions for an open and barrier-free science production. + Aside from my professional work I participate in the development of free and open software and seek to actively set the conditions for creating barrier-free and open science. In my free time I like to work with my hands, such as woodworking, embedded hardware projects and sometimes gardening. experience: - date: From ed31e70a13bb072c60dee0cd235db6b2e38ac60f Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sat, 14 Sep 2024 22:13:05 +0200 Subject: [PATCH 02/61] Add simple contact information to content --- content.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content.yml b/content.yml index cc8492f..298cf0b 100644 --- a/content.yml +++ b/content.yml @@ -1,3 +1,16 @@ +about: + fullname: Marty Oehme + contact: + - text: Körnerstr. 54, 04107 Leipzig, Germany + icon:  + - text: job@martyoeh.me + icon:  + - text: +49 177 377 4949 + icon:  + - text: martyoeh.me + icon:  + - text: github.com/marty-oehme + icon:  summary: de: | # FIXME: Update from English summary below Ich habe im September 2021 das EU-geförderte European Master of Global Studies Studienprogramm absolviert, From 318ea11ac6e3db191d129d9c587d62dd09318706 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sat, 14 Sep 2024 22:13:34 +0200 Subject: [PATCH 03/61] Add simple typst cv replacement --- cv.typ | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 cv.typ diff --git a/cv.typ b/cv.typ new file mode 100644 index 0000000..e1c5ade --- /dev/null +++ b/cv.typ @@ -0,0 +1,135 @@ +#show heading: set text(font: "New Computer Modern") +#show link: underline + +// Uncomment the following lines to adjust the size of text +// The recommend resume text size is from `10pt` to `12pt` +// #set text( +// size: 12pt, +// ) + +// Choose the compiled language through cli by doing +// +// $ typst compile --input lang=de cv.typ +// +#let lang = { + if "lang" in sys.inputs and sys.inputs.lang == "de" { + "de" + } else { + "en" + } +} + +// Feel free to change the margin below to best fit your own CV +#set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: context [ + #set text(8pt) + #text(fill:luma(230))[Marty Oehme] + #set align(right) + #text(fill:luma(230))[#counter(page).display("1",both:false)] + ] +) + +#set par(justify: true) + +#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} + +#let section_header(title) = {[== #title]; horizon_line()}; + +#let section(title: "Section", body) = { + section_header(title); + body +}; + +#let work_item(item: ()) = { + if "client" in item { + [*#item.title.at(lang)*, _#item.client.at(lang)_ #h(1fr)]; + } else { + [*#item.title.at(lang)* #h(1fr)]; + }; + [ _#item.date.at(lang)_ \ ]; + if "bullets" in item { + for bullet in item.bullets { + [- #bullet.at(lang)] + } + } + if "publication" in item { + block(inset: 5%, width: 85%, text(fill:luma(150))[#item.publication.at(lang) \ ]) + }; +} + +#let education_item(item: ()) = { + assert("place" in item and "program" in item and "date" in item, message: "Education items require place, program and date."); + [*#item.place.at(lang)*, #item.program.at(lang) #h(1fr)]; + [ _#item.date.at(lang)_ \ ]; +} + +#let thesis_item(item: ()) = { + assert("type" in item and "title" in item, message: "Thesis items require type and title."); + [*#item.type.at(lang)* #item.title.at(lang) #h(1fr)]; + [#par(item.abstract.at(lang))] +} + +#let skill_item(item: ()) = { + [*#item.at(lang)*: \ ] + for skill in item.content { + [#skill.name.at(lang) (] + for (i, v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + [) \ ] + } +} + +#let resume(contents) = { + [= #contents.about.fullname]; + let contacts = (for c in contents.about.contact { + (c.icon + " " + c.text,) + }) + grid( + columns: (1.5fr, 1fr, 1fr), + gutter: 5pt, + ..contacts + ); + horizon_line(); + if "summary" in contents { + contents.summary.at(lang) + }; + + if "experience" in contents { + section(title: "Professional Experience",{ + for entry in contents.experience { + work_item(item:entry) + } + }) + } + + if "education" in contents { + section(title: "Education",{ + for entry in contents.thesis { + thesis_item(item:entry) + } + for entry in contents.education { + education_item(item:entry) + } + }) + } + + if "skills" in contents { + section(title: "Qualifications",{ + for cat in contents.skills { + skill_item(item:cat) + } + }) + } +} + + +#resume( + yaml("content.yml") +) + From 0ed2aa801cf40587d94660a4fd07bc92f3699d4b Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 08:34:02 +0200 Subject: [PATCH 04/61] Change contact mail address to actual 'contact@martyoeh.me' to be more generalizable. --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 298cf0b..e0a7dab 100644 --- a/content.yml +++ b/content.yml @@ -3,7 +3,7 @@ about: contact: - text: Körnerstr. 54, 04107 Leipzig, Germany icon:  - - text: job@martyoeh.me + - text: contact@martyoeh.me icon:  - text: +49 177 377 4949 icon:  From 50c2900b046b97a36c8f37868af4f7c9650372ea Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 08:34:33 +0200 Subject: [PATCH 05/61] Section headers correctly change language --- cv.typ | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/cv.typ b/cv.typ index e1c5ade..5c2281e 100644 --- a/cv.typ +++ b/cv.typ @@ -71,6 +71,14 @@ [#par(item.abstract.at(lang))] } +#let sel_word_lang(de: "", en:"") = { + if lang == "de" { + de + } else { + en + } +} + #let skill_item(item: ()) = { [*#item.at(lang)*: \ ] for skill in item.content { @@ -101,7 +109,8 @@ }; if "experience" in contents { - section(title: "Professional Experience",{ + let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") + section(title: title, { for entry in contents.experience { work_item(item:entry) } @@ -109,7 +118,8 @@ } if "education" in contents { - section(title: "Education",{ + let title = sel_word_lang(en:"Education", de:"Ausbildung") + section(title: "Education", { for entry in contents.thesis { thesis_item(item:entry) } @@ -120,7 +130,8 @@ } if "skills" in contents { - section(title: "Qualifications",{ + let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") + section(title: "Qualifications", { for cat in contents.skills { skill_item(item:cat) } @@ -128,7 +139,6 @@ } } - #resume( yaml("content.yml") ) From bdf8abfe95392f966700a31b3c442b7b5051939d Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 11:21:02 +0200 Subject: [PATCH 06/61] Add clickable links to header contact information --- content.yml | 4 ++++ cv.typ | 32 +++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/content.yml b/content.yml index e0a7dab..c689421 100644 --- a/content.yml +++ b/content.yml @@ -5,12 +5,16 @@ about: icon:  - text: contact@martyoeh.me icon:  + link: mailto:contact@martyoeh.me - text: +49 177 377 4949 icon:  + link: tel:+491773774949 - text: martyoeh.me icon:  + link: https://martyoeh.me - text: github.com/marty-oehme icon:  + link: https://github.com/marty-oehme summary: de: | # FIXME: Update from English summary below Ich habe im September 2021 das EU-geförderte European Master of Global Studies Studienprogramm absolviert, diff --git a/cv.typ b/cv.typ index 5c2281e..133fbce 100644 --- a/cv.typ +++ b/cv.typ @@ -33,6 +33,22 @@ #set par(justify: true) +#let header(about, columns: (1.5fr, 1fr, 1fr)) = { + [= #about.fullname]; + let contact_fields = (for c in about.contact { + if "link" in c { + ([#c.icon ~ #link(c.link)[#c.text]],) + } else { + ([#c.icon ~ #c.text],) + } + }) + grid( + columns: columns, + gutter: 5pt, + ..contact_fields + ); +} + #let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} #let section_header(title) = {[== #title]; horizon_line()}; @@ -93,20 +109,14 @@ } } + #let resume(contents) = { - [= #contents.about.fullname]; - let contacts = (for c in contents.about.contact { - (c.icon + " " + c.text,) - }) - grid( - columns: (1.5fr, 1fr, 1fr), - gutter: 5pt, - ..contacts - ); - horizon_line(); + header(contents.about) if "summary" in contents { + section(title:"", { contents.summary.at(lang) - }; + }) + }; if "experience" in contents { let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") From a345d36611d2128c26d4bd09bc4ceb93f06fd347 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 11:21:38 +0200 Subject: [PATCH 07/61] Rephrase english summary --- content.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content.yml b/content.yml index c689421..486734b 100644 --- a/content.yml +++ b/content.yml @@ -35,11 +35,11 @@ summary: die Schaffung von Bedingungen für eine offene und barrierefreie Wissensproduktion. en: | - Since graduating from the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant analyzing processes of spatialization, inequality and poverty reduction, and collective organization, primarily through the lens of labour market policies. + Since graduating from the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant analyzing processes inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies. - In producing a variety of development research literature, I have developed a broad range of skills in data acquisition, organization and analysis, as well as manuscript editing and reference management. In addition to research skills, I have gotten insights into event management, teaching assistance, content creation, system administration and website management. + Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. In addition to research skills, I have gotten insights into event management, teaching assistance, content creation, system administration and website management. Aside from professional work I foster the development of free and open software and barrier-free and open science. - Aside from my professional work I participate in the development of free and open software and seek to actively set the conditions for creating barrier-free and open science. In my free time I like to work with my hands, such as woodworking, embedded hardware projects and sometimes gardening. + I am always happy to receive opportunities to further my in-depth expertise in these topics, in addition to a broad range of applicable skills. experience: - date: From 372dee59cc73d58f14aeeaff808e71c79a407300 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 11:22:02 +0200 Subject: [PATCH 08/61] Expand footer to more details and full name --- cv.typ | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/cv.typ b/cv.typ index 133fbce..3730a71 100644 --- a/cv.typ +++ b/cv.typ @@ -19,16 +19,41 @@ } } +#let _columns_3(left_body, center_body, right_body) = { + block[ + #box(width: 1fr)[ + #align(left)[#left_body] + ] + #box(width: 1fr)[ + #align(center)[#center_body] + ] + #box(width: 1fr)[ + #align(right)[#right_body] + ] + ] +} + // Feel free to change the margin below to best fit your own CV #set page( paper: "a4", margin: (x: 0.9cm, y: 1.3cm), - footer: context [ - #set text(8pt) - #text(fill:luma(230))[Marty Oehme] - #set align(right) - #text(fill:luma(230))[#counter(page).display("1",both:false)] - ] + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display("[month repr:long] [day], [year]")] + ][ + #smallcaps[ + Marty Oehme +// #sym.dot.c +// CV + ] + ][ + #counter(page).display() + ] + ], ) #set par(justify: true) From 28b63a6f1715c9eda366d2b101bf7bed62b9f4bb Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 11:31:41 +0200 Subject: [PATCH 09/61] Add compatibility options for smartypants and latex Convert en/em-dashes and escaped ampersands. --- cv.typ | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cv.typ b/cv.typ index 3730a71..85e2bf2 100644 --- a/cv.typ +++ b/cv.typ @@ -1,6 +1,11 @@ #show heading: set text(font: "New Computer Modern") #show link: underline +// smartypants and latex compatibility +#show "--": [#sym.dash.en] +#show "---": [#sym.dash.em] +#show "\&": [#sym.amp] + // Uncomment the following lines to adjust the size of text // The recommend resume text size is from `10pt` to `12pt` // #set text( From 656c3e37d338978e0c7f04a3381d2a5f89a13d3a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 12:35:30 +0200 Subject: [PATCH 10/61] Remove commented text size --- cv.typ | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cv.typ b/cv.typ index 85e2bf2..f0345c3 100644 --- a/cv.typ +++ b/cv.typ @@ -6,12 +6,6 @@ #show "---": [#sym.dash.em] #show "\&": [#sym.amp] -// Uncomment the following lines to adjust the size of text -// The recommend resume text size is from `10pt` to `12pt` -// #set text( -// size: 12pt, -// ) - // Choose the compiled language through cli by doing // // $ typst compile --input lang=de cv.typ From 698ef628b25ec728265b4ff03d9480338258c87a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:53:40 +0200 Subject: [PATCH 11/61] Rename client to place in work experience To start generalizing cv entries, since every 'work' has a place, whether it is a client or not. --- content.yml | 99 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/content.yml b/content.yml index 486734b..b4d104c 100644 --- a/content.yml +++ b/content.yml @@ -46,8 +46,11 @@ experience: de: 2024 en: 2024 title: - de: Co-Autor, Formalisierung und sozialer Schutz, World Development - en: Co-Author, Formalization and social protection, World Development + de: Co-Autor, Formalisierung und sozialer Schutz + en: Co-Author, Formalization and social protection + place: + de: World Development + en: World Development publication: de: 'Torm, N., \& Oehme, M. (2024). Social protection and formalization in low-and middle-income countries: A scoping review of the literature. World Development, 181.' en: 'Torm, N., \& Oehme, M. (2024). Social protection and formalization in low-and middle-income countries: A scoping review of the literature. World Development, 181.' @@ -61,12 +64,12 @@ experience: - date: de: 2023--2024 en: 2023--2024 - client: - de: ILO - en: ILO title: de: Externer Forscher, Ungleichheiten auf dem Arbeitsmarkt en: External researcher, Inequalities on the Labour market + place: + de: ILO + en: ILO publication: de: ILO (angenommen). Addressing Inequalities in the World of Work. en: ILO (forthcoming). Addressing Inequalities in the World of Work. @@ -81,8 +84,11 @@ experience: de: 2023 en: 2023 title: - de: Consultant, Forschungsarbeit für nachhaltige Beschaffung in internationaler Logistik, Refinter Consulting - en: Consultant, Research on sustainable procurement in international logistics, Refinter Consulting + de: Consultant, Forschungsarbeit für nachhaltige Beschaffung in internationaler Logistik + en: Consultant, Research on sustainable procurement in international logistics + place: + en: Refinter Consulting + de: Refinter Consulting bullets: - de: Qualitative Gegenüberstellung verschiedener Forschungsperspektiven im Lieferkettenmanagement en: Qualitative comparison of various research strands within supply chain management @@ -93,12 +99,12 @@ experience: - date: de: 2022 en: 2022 - client: - de: Universität Roskilde - en: Roskilde University title: de: Consultant, Datenbankforschung internationale Hilfsgelder en: Consultant, Database research international aid funds + place: + de: Universität Roskilde + en: Roskilde University bullets: - de: Präsentation zu Einblick in digitaler Forschung in Datenbanken und Kodierungssystemen en: Presentation of introduction to digital research in databases and coding systems @@ -109,12 +115,12 @@ experience: - date: de: 2022 en: 2022 - client: - de: Universität Roskilde - en: Roskilde University title: de: Redaktionsarbeit, Soziale Absicherung und Widerstandsfähigkeit en: Editorial work, Social Protection and Resilience, Roskilde University + place: + de: Universität Roskilde + en: Roskilde University publication: de: 'Torm, N., Gundertofte, C. M., \& Thur, G. E. (2022). Social Protection and Resilience during COVID-19: An Interdisciplinary Analysis of the Role of Informal Worker Associations in Kenya. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 6.' en: 'Torm, N., Gundertofte, C. M., \& Thur, G. E. (2022). Social Protection and Resilience during COVID-19: An Interdisciplinary Analysis of the Role of Informal Worker Associations in Kenya. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 6.' @@ -128,16 +134,16 @@ experience: - date: de: 2022 en: 2022 - client: - de: UNU-WIDER - en: UNU-WIDER title: de: Forschungsassistenz, Entwicklungsprojekte zur Reduzierung Ungleichheitstrends en: Research Assistant, Development projects to reduce inequality trends + place: + de: UNU-WIDER + en: UNU-WIDER publication: de: Niño-Zarazúa, M., \& Morabito, C. (angenommen). Assessing the potential distributional impacts of development interventions. UNU-WIDER. en: Niño-Zarazúa, M., \& Morabito, C. (forthcoming). Assessing the potential distributional impacts of development interventions. UNU-WIDER. - bullets: + bullets: # TODO: add numerical description of quantity of data (>2mil. datapoints) - de: Sammlung, Verarbeitung und Bereinigung von 4 quantitativen Datensätzen, u.a. der UN Ungleichheitstrends en: Collected, processed, and cleaned 4 datasets, including UN World inequality trends - de: Durchführen einer beschreibenden Analyse von Ungleichheitstrends und -treibern in 4 Ländern @@ -148,12 +154,12 @@ experience: - date: de: 2022 en: 2022 - client: - de: ILO - en: ILO title: de: Consultant, Review Verknüpfung sozialer Schutz, Produktivität und Formalisierung en: Consultant, Social Protection, Productivity and Formalization Nexus Review + place: + de: ILO + en: ILO publication: de: "Torm, N. (forthcoming). The Social Protection, Productivity and Formalization Nexus among low- and middle- income countries: A Scoping Review of the Literature. International Labour Office." en: "Torm, N. (forthcoming). The Social Protection, Productivity and Formalization Nexus among low- and middle- income countries: A Scoping Review of the Literature. International Labour Office." @@ -167,12 +173,12 @@ experience: - date: de: 2022 en: 2022 - client: - de: Universität Roskilde - en: Roskilde University title: de: Consultant, Review Arbeitsmarktpolitiken in Asien und dem Pazifik en: Consultant, Labour Market Policies Review in Asia and the Pacific + place: + de: Universität Roskilde + en: Roskilde University publication: de: 'Niño-Zarazúa, M., \& Torm, N. (2022). Active Labour Market Policies in Asia and the Pacific: A review of the literature. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 4.' en: 'Niño-Zarazúa, M., \& Torm, N. (2022). Active Labour Market Policies in Asia and the Pacific: A review of the literature. Roskilde Universitet. SECO Working Paper Series Vol. 2022 No. 4.' @@ -184,12 +190,12 @@ experience: - date: de: 2021 en: 2021 - client: - de: Universität Roskilde - en: Roskilde University title: de: Forschungsassistenz, informelle Organisierung und Absicherung en: Research Assistant, informal organization and social security + place: + de: Universität Roskilde + en: Roskilde University publication: de: Riisgaard, L. (2020). Worker Organisation and Social Protection amongst Informal Petty Traders in Tanzania. Roskilde Universitet. CAE Working Paper No. 2020:4 en: Riisgaard, L. (2020). Worker Organisation and Social Protection amongst Informal Petty Traders in Tanzania. Roskilde Universitet. CAE Working Paper No. 2020:4 @@ -203,12 +209,12 @@ experience: - date: de: 2021 en: 2021 - client: - de: Universität Roskilde - en: Roskilde University title: de: Redaktionsassistenz, SPIWORK-Projekt en: Editorial Assistant, SPIWORK Project + place: + de: Universität Roskilde + en: Roskilde University publication: de: 'Riisgaard, L., Mitullah, W.V., \& Torm, N. (Eds.). (2021). Social Protection and Informal Workers in Sub-Saharan Africa: Lived Realities and Associational Experiences from Tanzania and Kenya (1st ed.). Routledge.' en: 'Riisgaard, L., Mitullah, W.V., \& Torm, N. (Ed.). (2021). Social Protection and Informal Workers in Sub-Saharan Africa: Lived Realities and Associational Experiences from Tanzania and Kenya (1st ed.). Routledge.' @@ -223,8 +229,11 @@ experience: de: 2018--2019 en: 2018--2019 title: - de: Akademische Hilfskraft, Institut für Amerikastudien, Universität Leipzig - en: Academic Assistant, Institute of American Studies, University of Leipzig + de: Akademische Hilfskraft, Institut für Amerikastudien + en: Academic Assistant, Institute of American Studies + place: + de: Universität Leipzig + en: University of Leipzig bullets: - de: Digitalisierung und Aufbereitung von Unterrichts- und Forschungsmaterialien en: Digitized and optimized teaching and research materials @@ -236,8 +245,11 @@ experience: de: 2017--2019 en: 2017--2019 title: - de: Studentische Hilfskraft, Professor Crister S. Garrett, Universität Leipzig - en: Student Assistant, Professor Crister S. Garrett, University of Leipzig + de: Studentische Hilfskraft, Professor Crister S. Garrett + en: Student Assistant, Professor Crister S. Garrett + place: + de: Universität Leipzig + en: University of Leipzig bullets: - de: Digitalisierung und Bearbeitung ausgewählter Arbeitsmaterialien en: Digitized and prepared selected working material @@ -249,8 +261,11 @@ experience: de: 2018 en: 2018 title: - de: Lehrassistenz, Transatlantische Sommerschule Cultures of Security, Universität Leipzig - en: Teaching Assistant, Trans Atlantic Summer School Cultures of Security, University of Leipzig + de: Lehrassistenz, Transatlantische Sommerschule Cultures of Security + en: Teaching Assistant, Trans Atlantic Summer School Cultures of Security + place: + de: Universität Leipzig + en: University of Leipzig bullets: - de: Vorbereitung, Organisation und Umsetzung von Lehrveranstaltungen und Events en: Prepared, organized, and implemented schedule for teaching and events @@ -262,8 +277,11 @@ experience: de: 2017--2018 en: 2017--2018 title: - de: Content-Management, Bachelor Plus/Alumni-System, Universität Leipzig - en: Content Management, Bachelor Plus/Alumni System, University of Leipzig + de: Content-Management, Bachelor Plus/Alumni-System + en: Content Management, Bachelor Plus/Alumni System + place: + de: Universität Leipzig + en: University of Leipzig bullets: - de: Gemeinsame Erstellung und Strukturierung von Inhalten im Content-Management-System von Wordpress en: Co-created and structured content in Wordpress content management system @@ -275,8 +293,11 @@ experience: de: 2014--2018 en: 2014--2018 title: - de: Verkaufsassistent und Eventhelfer für historische Märkte, Heureka Gastronomie - en: Sales Assistant and Event Support for Historical Markets, Heureka Gastronomy + de: Verkaufsassistent und Eventhelfer für historische Märkte + en: Sales Assistant and Event Support for Historical Markets + place: + de: Heureka Gastronomie + en: Heureka Gastronomy bullets: - de: Betreuung mehrerer Verkaufsstände, darunter Glühwein und Getränke, Grillstände und Handbrote en: Managed multiple sales stands, including mulled wine and beverages, grill, and handbread stands From 25d9e7ce13d85e66a276a9a089072f3ad87fc0a9 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:55:12 +0200 Subject: [PATCH 12/61] Rename thesis and education to title and place To fit the generalized entry scheme. The only issue I have is to have the actual 'title' of the thesis in the 'place' field which feels very unwieldy. --- content.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/content.yml b/content.yml index b4d104c..4903eee 100644 --- a/content.yml +++ b/content.yml @@ -310,7 +310,7 @@ education: - place: de: Universität Leipzig, Deutschland en: University of Leipzig, Germany - program: + title: de: European Master of Global Studies, MA en: European Master of Global Studies, MA date: @@ -319,7 +319,7 @@ education: - place: de: Universität Roskilde, Dänemark en: Roskilde University, Denmark - program: + title: de: Global Studies, MSc en: Global Studies, MSc date: @@ -328,7 +328,7 @@ education: - place: de: Universität Leipzig, Deutschland en: University of Leipzig, Germany - program: + title: de: Amerikanistik, BA en: American Studies, BA date: @@ -337,7 +337,7 @@ education: - place: de: HTWK Leipzig, Deutschland en: HTWK Leipzig, Deutschland - program: + title: de: Medieninformatik, BSc (nicht abgeschlossen) en: Media Computer Science, BSc (not completed) date: @@ -345,13 +345,13 @@ education: en: 2015 thesis: - - type: + - title: de: Master Thesis en: Master Thesis - title: - de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism" - en: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism" - abstract: + place: + de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism." + en: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism." + abstract: # TODO: Rephrase this complete abstract since it's not worded well de: Unter Verwendung einer theoretischen Grundlage von Macht wurden die Mechanismen der Konsensbildung bei der Produktion von Räumen im Ökotourismus analysiert. Durch die Anwendung kritischer Diskursanalyse auf die Fallstudie Namibia wurden verschiedene Arten der Wertschöpfung zwischen ökonomischen und erfahrungsbasierten Werten im Tourismus untersucht. en: Used a theoretical basis of power to analyze the mechanisms of consensus shaping the production of ecotourism space. Utilizing critical discourse analysis on the case study of Namibia, it explored various means of value production between economic and experiential values in tourism. From d518eb908769319aea23ab9431fe09cda23a5cab Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:55:55 +0200 Subject: [PATCH 13/61] Extract volunteering from qualifications They deserve their own sections, now that I have volunteered for over a year. --- content.yml | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/content.yml b/content.yml index 4903eee..94bf167 100644 --- a/content.yml +++ b/content.yml @@ -355,6 +355,38 @@ thesis: de: Unter Verwendung einer theoretischen Grundlage von Macht wurden die Mechanismen der Konsensbildung bei der Produktion von Räumen im Ökotourismus analysiert. Durch die Anwendung kritischer Diskursanalyse auf die Fallstudie Namibia wurden verschiedene Arten der Wertschöpfung zwischen ökonomischen und erfahrungsbasierten Werten im Tourismus untersucht. en: Used a theoretical basis of power to analyze the mechanisms of consensus shaping the production of ecotourism space. Utilizing critical discourse analysis on the case study of Namibia, it explored various means of value production between economic and experiential values in tourism. +volunteering: + - title: + de: ZeitRaum + en: ZeitRaum + date: + de: 2023--2024 + en: 2023--2024 + place: + de: Heizhaus e.V. + en: Heizhaus association + bullets: + - de: Vermittlung digitaler Kompetenzen im Alter + en: Transferring Digital Competence in Aging + - de: Wöchentlicher Workshop zur Entwicklung von Selbstvertrauen und Kompetenz mit Smartphones + en: Weekly workshop on developing confidence and competence with smartphones + - de: Personalisierte technische Hilfsmeetings und technische Support-Beratungen + en: Personalized tech assistance appointments and technical support consultations + - title: + de: Verpixelt + en: Verpixelt + date: + de: 2023 + en: 2023 + place: + de: Urban Souls e.V. + en: Urban Souls association + bullets: + - de: Technische Assistenz zur Vermittlung digitaler Kompetenzen + en: Technical assistance for conveying digital competencies + - de: IT und Event Organisationsunterstützung + en: IT and event management services + skills: - de: Digitales Toolset en: Digital toolset @@ -427,22 +459,6 @@ skills: en: GIMP - de: Adobe Suite en: Adobe suite - # Add date information for volunteer work - - de: Ehrenamt - en: Volunteering work - content: - - name: - de: Verpixelt, Urban Souls e.V. - en: Verpixelt, Urban Souls association - items: - - de: technische Assistenz zur Vermittlung digitaler Kompetenzen - en: technical assistance for conveying digital competencies - - name: - de: ZeitRaum, Heizhaus e.V. - en: ZeitRaum, Heizhaus association - items: - - de: Vermittlung digitaler Kompetenzen im Alter, Workshop und Fragestunde - en: Transferring Digital Competence in Aging, Workshop and individual sessions - de: Sprachen en: Languages content: From e53d5ca3864520f33a4b8ba64e3c3af94bc1d9fa Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 15 Sep 2024 17:56:18 +0200 Subject: [PATCH 14/61] Refactor typst cv generation to make use of generalized entries --- cv.typ | 142 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/cv.typ b/cv.typ index f0345c3..6db32f4 100644 --- a/cv.typ +++ b/cv.typ @@ -32,31 +32,6 @@ ] } -// Feel free to change the margin below to best fit your own CV -#set page( - paper: "a4", - margin: (x: 0.9cm, y: 1.3cm), - footer: [ - #set text( - fill: luma(200), - size: 8pt, - ) - #_columns_3[ - #smallcaps[#datetime.today().display("[month repr:long] [day], [year]")] - ][ - #smallcaps[ - Marty Oehme -// #sym.dot.c -// CV - ] - ][ - #counter(page).display() - ] - ], -) - -#set par(justify: true) - #let header(about, columns: (1.5fr, 1fr, 1fr)) = { [= #about.fullname]; let contact_fields = (for c in about.contact { @@ -73,41 +48,63 @@ ); } -#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} +#let subdued(body) = { + block(inset: 5%, width: 85%, text(fill:luma(150), body)) +} -#let section_header(title) = {[== #title]; horizon_line()}; - -#let section(title: "Section", body) = { - section_header(title); - body -}; - -#let work_item(item: ()) = { - if "client" in item { - [*#item.title.at(lang)*, _#item.client.at(lang)_ #h(1fr)]; - } else { - [*#item.title.at(lang)* #h(1fr)]; - }; - [ _#item.date.at(lang)_ \ ]; +#let entry(item: ()) = { + if "title" in item { + [*#item.title.at(lang)*] + } + if "place" in item { + if "title" in item { + [, ] + } + [_#item.place.at(lang)_] + } + [#h(1fr)] + if "date" in item { + [ _#item.date.at(lang)_ \ ] + } if "bullets" in item { for bullet in item.bullets { [- #bullet.at(lang)] } } if "publication" in item { - block(inset: 5%, width: 85%, text(fill:luma(150))[#item.publication.at(lang) \ ]) + subdued[#item.publication.at(lang) \ ] }; + if "abstract" in item { + subdued[#item.abstract.at(lang) \ ] + } } -#let education_item(item: ()) = { - assert("place" in item and "program" in item and "date" in item, message: "Education items require place, program and date."); - [*#item.place.at(lang)*, #item.program.at(lang) #h(1fr)]; +#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} + +#let section_header(title) = {[== #title]; horizon_line()}; + +#let section(title: "Section", entries: (), body) = { + section_header(title); + if body == none or body == [] { + for e in entries { + entry(item:e) + } + } else { + body + } +}; + +// Slightly re-styled entry with PLACE first and TITLE second +#let education_entry(item: ()) = { + assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date."); + [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)]; [ _#item.date.at(lang)_ \ ]; } -#let thesis_item(item: ()) = { - assert("type" in item and "title" in item, message: "Thesis items require type and title."); - [*#item.type.at(lang)* #item.title.at(lang) #h(1fr)]; +// Restyled entry with PLACE not emphasized like usual, and no date but an abstract +#let thesis_entry(item: ()) = { + assert("title" in item and "place" in item, message: "Thesis items require type and title."); + [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)]; [#par(item.abstract.at(lang))] } @@ -119,6 +116,7 @@ } } +// Old-style presentation of skills and qualifications, to be overhauled #let skill_item(item: ()) = { [*#item.at(lang)*: \ ] for skill in item.content { @@ -133,9 +131,35 @@ } } - #let resume(contents) = { + // Feel free to change the margin below to best fit your own CV + set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display("[month repr:long] [day], [year]")] + ][ + #smallcaps[ + // FIXME: Source from about.fullname variable + Marty Oehme + // #sym.dot.c + // CV + ] + ][ + #counter(page).display() + ] + ], + ) + + set par(justify: true) + header(contents.about) + if "summary" in contents { section(title:"", { contents.summary.at(lang) @@ -144,23 +168,17 @@ if "experience" in contents { let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") - section(title: title, { - for entry in contents.experience { - work_item(item:entry) - } - }) - } + section(title: title, entries:contents.experience)[] + } if "education" in contents { let title = sel_word_lang(en:"Education", de:"Ausbildung") - section(title: "Education", { - for entry in contents.thesis { - thesis_item(item:entry) - } - for entry in contents.education { - education_item(item:entry) - } - }) + section(title: title, entries:contents.thesis + contents.education)[] + } + + if "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + section(title: title, entries:contents.volunteering)[] } if "skills" in contents { From 43549c1f53c2421e33f25105a45ecc45b8530fee Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 15:57:08 +0200 Subject: [PATCH 15/61] Fix master thesis german translation --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 94bf167..af0d62e 100644 --- a/content.yml +++ b/content.yml @@ -346,7 +346,7 @@ education: thesis: - title: - de: Master Thesis + de: Masterarbeit en: Master Thesis place: de: "Re-Evaluating Nature's Gifts: Economic and Experiential Value Productions in Namibia's Ecotourism." From 5df8458b72b2db8a15fcacc16743ea1bc5df6973 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 17:50:30 +0200 Subject: [PATCH 16/61] Add sidebar to document --- cv.typ | 179 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 126 insertions(+), 53 deletions(-) diff --git a/cv.typ b/cv.typ index 6db32f4..445986c 100644 --- a/cv.typ +++ b/cv.typ @@ -17,6 +17,13 @@ "en" } } +#let sel_word_lang(de: "", en:"") = { + if lang == "de" { + de + } else { + en + } +} #let _columns_3(left_body, center_body, right_body) = { block[ @@ -108,31 +115,34 @@ [#par(item.abstract.at(lang))] } -#let sel_word_lang(de: "", en:"") = { - if lang == "de" { - de - } else { - en - } -} - -// Old-style presentation of skills and qualifications, to be overhauled -#let skill_item(item: ()) = { - [*#item.at(lang)*: \ ] - for skill in item.content { - [#skill.name.at(lang) (] - for (i, v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] +// skill-specific entry, changing its style for sidebar +#let skill_item(item: (), is_sidebar: false) = { + let side_list(body) = if is_sidebar {list(body)} else {par(body)} + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i,v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } } - } - [) \ ] + if not is_sidebar [)] + }) } } -#let resume(contents) = { - // Feel free to change the margin below to best fit your own CV +#let cv(contents) = { + set text(lang: lang) + + let date_formatting = { + if lang == "de" { + "[day]. [month repr:long] [year]" + } else { + "[month repr:long] [day], [year]" + } + } set page( paper: "a4", margin: (x: 0.9cm, y: 1.3cm), @@ -142,14 +152,9 @@ size: 8pt, ) #_columns_3[ - #smallcaps[#datetime.today().display("[month repr:long] [day], [year]")] + #smallcaps[#datetime.today().display(date_formatting)] ][ - #smallcaps[ - // FIXME: Source from about.fullname variable - Marty Oehme - // #sym.dot.c - // CV - ] + #smallcaps[#contents.about.fullname] ][ #counter(page).display() ] @@ -160,38 +165,106 @@ header(contents.about) - if "summary" in contents { - section(title:"", { - contents.summary.at(lang) - }) - }; + let body = { + if "summary" in contents { + section(title:"", { + contents.summary.at(lang) + }) + }; - if "experience" in contents { - let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") - section(title: title, entries:contents.experience)[] + if "experience" in contents { + let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") + section(title: title, entries:contents.experience)[] + } + + if "education" in contents { + let title = sel_word_lang(en:"Education", de:"Ausbildung") + section(title: title, entries:contents.thesis + contents.education)[] + } + + if "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + section(title: title, entries:contents.volunteering)[] + } + + if "skills" in contents { + let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") + section(title: title, { + skill_item(item:contents.skills) + }) + } + + if "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + section(title: title, { + skill_item(item:contents.languages) + }) + } } - if "education" in contents { - let title = sel_word_lang(en:"Education", de:"Ausbildung") - section(title: title, entries:contents.thesis + contents.education)[] - } - - if "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - section(title: title, entries:contents.volunteering)[] - } - - if "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") - section(title: "Qualifications", { - for cat in contents.skills { - skill_item(item:cat) + let sidebar = { + if "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + [== #title] + for e in contents.volunteering { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] } - }) + } + + if "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + [== #title] + skill_item(item:contents.languages, is_sidebar: true) + [\ ] + } + + if "skills" in contents { + let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse") + [== #title] + skill_item(item:contents.skills, is_sidebar: true) + } } + + let margin = 1pt + grid( + columns: (2fr, 1fr), + block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, { + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt) + ), + ) + }) + body + }), + { + v(20pt) + set block(inset: (left: 20 * margin, right: 20 * margin)) + show heading: it => align(right, upper(it)) + set list(marker: "") + show list: it => { + set par(justify: false) + align(right, block(it)) + } + sidebar + } + ) + } -#resume( +#cv( yaml("content.yml") ) From 097cd1263d738340d8284e74ea48d62077fa54cb Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 17 Sep 2024 17:51:39 +0200 Subject: [PATCH 17/61] Decouple languages from skills Both retain the same yaml structure but are not tightly coupled anymore (like volunteering before). --- content.yml | 198 ++++++++++++++++++++++++++++------------------------ 1 file changed, 106 insertions(+), 92 deletions(-) diff --git a/content.yml b/content.yml index af0d62e..de8980c 100644 --- a/content.yml +++ b/content.yml @@ -388,95 +388,109 @@ volunteering: en: IT and event management services skills: - - de: Digitales Toolset - en: Digital toolset - content: - - name: - de: Versionskontrollsoftware - en: Version control software - items: - - de: Git - en: git - - name: - de: Office-Suite - en: Office suite - items: - - de: Excel - en: Excel - - de: Word - en: Word - - de: Access - en: Access - - name: - de: Autorensoftware - en: Authoring software - items: - - de: LaTeX - en: LaTeX - - de: Pandoc - en: pandoc - - de: Quarto - en: quarto - - name: - de: Web Content Management - en: Web content management - items: - - de: Wordpress - en: Wordpress - - de: Hugo - en: Hugo - - de: Flask - en: Flask - - de: Astro - en: Astro - - de: HTML - en: HTML - - de: CSS - en: CSS - - de: JavaScript - en: JavaScript - - name: - de: Datenanalyse - en: Data Analysis - items: - - de: Python Pandas - en: Python pandas - - de: Plotly - en: Plotly - - name: - de: Datenmanagement - en: Data engineering - items: - - de: Web-Scraping/-Crawling - en: Web-scraping/-crawling - - de: SQL - en: SQL - - name: - de: Design Software - en: Design software - items: - - de: GIMP - en: GIMP - - de: Adobe Suite - en: Adobe suite - - de: Sprachen - en: Languages - content: - - name: - de: Deutsch - en: German - items: - - de: Muttersprache - en: native - - name: - de: Englisch - en: English - items: - - de: fließend - en: fluent - - name: - de: Französisch - en: French - items: - - de: Grundkenntnisse - en: basics + - name: + de: Autorensoftware + en: Authoring software + items: + - de: LaTeX + en: LaTeX + - de: Typst + en: Typst + - de: Quarto + en: Quarto + - de: Pandoc + en: Pandoc + - name: + de: Datenmanagement + en: Data engineering + items: + - de: SQL + en: SQL + - de: Web-Scraping & Crawling + en: Web-scraping & crawling + - name: + de: Datenanalyse + en: Data analysis + items: + - de: Python Pandas & Polars + en: Python Pandas & Polars + - de: Seaborn + en: Seaborn + - name: + de: Programmieren + en: Programming + items: + - de: Python + en: Python + - de: Go + en: Go + - de: Bash + en: Bash + - de: Lua + en: Lua + - name: + de: Versionskontrollsoftware + en: Version control software + items: + - de: Git + en: Git + - de: Jujutsu + en: Jujutsu + - de: Fossil + en: Fossil + - name: + de: Office-Suite + en: Office suite + items: + - de: Excel + en: Excel + - de: Word + en: Word + - de: Access + en: Access + - name: + de: Web Content Management + en: Web content management + items: + - de: Wordpress + en: Wordpress + - de: Hugo + en: Hugo + - de: Flask + en: Flask + - de: Astro + en: Astro + - de: HTML + en: HTML + - de: CSS + en: CSS + - de: JavaScript + en: JavaScript + - name: + de: Design Software + en: Design software + items: + - de: GIMP + en: GIMP + - de: Adobe Suite + en: Adobe suite + +languages: + - name: + de: Deutsch + en: German + items: + - de: Muttersprache + en: native + - name: + de: Englisch + en: English + items: + - de: fließend + en: fluent + - name: + de: Französisch + en: French + items: + - de: Grundkenntnisse + en: basics From f19fd2540c79e55508b56bf7067c5526cf284a04 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:15:45 +0200 Subject: [PATCH 18/61] Add resume with sidebar style --- resume.typ | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 resume.typ diff --git a/resume.typ b/resume.typ new file mode 100644 index 0000000..0d51e04 --- /dev/null +++ b/resume.typ @@ -0,0 +1,291 @@ +#show heading: set text(font: "New Computer Modern") +#show link: underline + +// smartypants and latex compatibility +#show "--": [#sym.dash.en] +#show "---": [#sym.dash.em] +#show "\&": [#sym.amp] + +// Choose the compiled language through cli by doing +// +// $ typst compile --input lang=de cv.typ +// +#let lang = { + if "lang" in sys.inputs and sys.inputs.lang == "de" { + "de" + } else { + "en" + } +} +#let sel_word_lang(de: "", en:"") = { + if lang == "de" { + de + } else { + en + } +} + +#let _columns_3(left_body, center_body, right_body) = { + block[ + #box(width: 1fr)[ + #align(left)[#left_body] + ] + #box(width: 1fr)[ + #align(center)[#center_body] + ] + #box(width: 1fr)[ + #align(right)[#right_body] + ] + ] +} + +#let header(about, columns: (1.5fr, 1fr, 1fr)) = { + [= #about.fullname]; + let contact_fields = (for c in about.contact { + if "link" in c { + ([#c.icon ~ #link(c.link)[#c.text]],) + } else { + ([#c.icon ~ #c.text],) + } + }) + grid( + columns: columns, + gutter: 5pt, + ..contact_fields + ); +} + +#let subdued(body) = { + block(inset: 5%, width: 85%, text(fill:luma(150), body)) +} + +#let freelance_by_client(experience:()) = { + let by_client = (:) + for item in experience { + let client = item.place.at(lang) + if client not in by_client { + by_client.insert(client, ()) + } + by_client.at(client).push((item.title.at(lang), item.date.at(lang) )) + } + + for (client, jobs) in by_client { + [*#client*:] + for j in jobs { + [- #j.at(0) #h(1fr) #j.at(1)] + } + } +} + +#let entry(item: ()) = { + if "title" in item { + [*#item.title.at(lang)*] + } + if "place" in item { + if "title" in item { + [, ] + } + [_#item.place.at(lang)_] + } + [#h(1fr)] + if "date" in item { + [ _#item.date.at(lang)_ \ ] + } + if "bullets" in item { + for bullet in item.bullets { + [- #bullet.at(lang)] + } + } + if "publication" in item { + subdued[#item.publication.at(lang) \ ] + }; + if "abstract" in item { + subdued[#item.abstract.at(lang) \ ] + } +} + +#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} + +#let section_header(title) = {[== #title]; horizon_line()}; + +#let section(title: "Section", entries: (), body) = { + section_header(title); + if body == none or body == [] { + for e in entries { + entry(item:e) + } + } else { + body + } +}; + +// Slightly re-styled entry with PLACE first and TITLE second +#let education_entry(item: ()) = { + assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date."); + [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)]; + [ _#item.date.at(lang)_ \ ]; +} + +// Restyled entry with PLACE not emphasized like usual, and no date but an abstract +#let thesis_entry(item: ()) = { + assert("title" in item and "place" in item, message: "Thesis items require type and title."); + [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)]; + [#par(item.abstract.at(lang))] +} + +// skill-specific entry, changing its style for sidebar +#let skill_item(item: (), is_sidebar: false) = { + let side_list(body) = if is_sidebar {list(body)} else {par(body)} + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i,v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + if not is_sidebar [)] + }) + } +} + +#let resume(contents) = { + set text(lang: lang) + + let date_formatting = { + if lang == "de" { + "[day]. [month repr:long] [year]" + } else { + "[month repr:long] [day], [year]" + } + } + set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display(date_formatting)] + ][ + #smallcaps[#contents.about.fullname] + ][ + #counter(page).display() + ] + ], + ) + + set par(justify: true) + + header(contents.about) + + let body = { +// if "summary" in contents { +// section(title:"", { +// contents.summary.at(lang) +// }) +// }; + + if "experience" in contents { + let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") + section(title: title)[] + freelance_by_client(experience:contents.experience) + + } + + if "education" in contents { + let title = sel_word_lang(en:"Education", de:"Ausbildung") + section(title: title, entries:contents.thesis + contents.education)[] + } + +// if "volunteering" in contents { +// let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") +// section(title: title, entries:contents.volunteering)[] +// } +// +// if "skills" in contents { +// let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") +// section(title: title, { +// skill_item(item:contents.skills) +// }) +// } +// +// if "languages" in contents { +// let title = sel_word_lang(en:"Languages", de:"Sprachen") +// section(title: title, { +// skill_item(item:contents.languages) +// }) +// } + } + + let sidebar = { + if "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + [== #title] + for e in contents.volunteering { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } + } + + if "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + [== #title] + skill_item(item:contents.languages, is_sidebar: true) + [\ ] + } + + if "skills" in contents { + let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse") + [== #title] + skill_item(item:contents.skills, is_sidebar: true) + } + } + + let margin = 1pt + grid( + columns: (2fr, 1fr), + block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, { + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt) + ), + ) + }) + body + }), + align(right, block(fill: luma(250), width: 90%, + { + v(20pt) + set block(inset: (left: 20 * margin, right: 20 * margin)) + show heading: it => align(right, upper(it)) + set list(marker: "") + show list: it => { + set par(justify: false) + align(right, block(it)) + } + sidebar + })) + ) + +} + +#resume( + yaml("content.yml") +) + From 7a503d61fbef8e61bc8fcb5d650eecbe082428a4 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:21:03 +0200 Subject: [PATCH 19/61] Allow setting sidebar or not for cv --- cv.typ | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/cv.typ b/cv.typ index 445986c..89bb34c 100644 --- a/cv.typ +++ b/cv.typ @@ -133,7 +133,7 @@ } } -#let cv(contents) = { +#let cv(contents, use_sidebar: false) = { set text(lang: lang) let date_formatting = { @@ -182,23 +182,25 @@ section(title: title, entries:contents.thesis + contents.education)[] } - if "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - section(title: title, entries:contents.volunteering)[] - } + if not use_sidebar { + if "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + section(title: title, entries:contents.volunteering)[] + } - if "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") - section(title: title, { - skill_item(item:contents.skills) - }) - } + if "skills" in contents { + let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") + section(title: title, { + skill_item(item:contents.skills) + }) + } - if "languages" in contents { - let title = sel_word_lang(en:"Languages", de:"Sprachen") - section(title: title, { - skill_item(item:contents.languages) - }) + if "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + section(title: title, { + skill_item(item:contents.languages) + }) + } } } @@ -228,6 +230,10 @@ } } + if not use_sidebar { + body + return + } let margin = 1pt grid( columns: (2fr, 1fr), @@ -264,7 +270,7 @@ } -#cv( +#cv.with(use_sidebar: false)( yaml("content.yml") ) From f6730e38ceff2f1da1f277b1e7e86c8ff83b885c Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 19 Sep 2024 17:31:55 +0200 Subject: [PATCH 20/61] Update summary texts --- content.yml | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/content.yml b/content.yml index de8980c..a02f5fe 100644 --- a/content.yml +++ b/content.yml @@ -15,31 +15,20 @@ about: - text: github.com/marty-oehme icon:  link: https://github.com/marty-oehme + summary: - de: | # FIXME: Update from English summary below - Ich habe im September 2021 das EU-geförderte European Master of Global Studies Studienprogramm absolviert, - mit dem Schwerpunkt globale Prozesse der Raumaneignung, Nationenbildung und narrativer Ideologien. + de: | + Seit dem Abschluss des EU-geförderten European Master of Global Studies Erasmus Mundus Programms im Jahr 2021 habe ich als selbstständiger Forschungsberater gearbeitet und mich auf Prozesse der Ungleichheit und der Armutsreduktion, sowie deren räumliche Dimensionierung und kollektive Organisation konzentriert, hauptsächlich betrachtet durch das Prisma der Arbeitsmarktpolitik. - Seitdem habe ich die Produktion verschiedener Entwicklungs-Forschungsliteratur unterstützt, - mit einem Fokus auf Arbeitsmarktpolitiken, ihren Auswirkungen auf Armut und kollektive Organisation, - sowie multi-dimensionaler Ungleichheitsreduktion. - - Ich besitze ein breites Spektrum an Fähigkeiten in Datenerfassung, -organisation und -analyse, - Manuskriptbearbeitung und Literaturverwaltung, - und konnte erste Einblicke in Veranstaltungsmanagement, Lehrassistenz, Website-verwaltung und -inhaltserstellung gewinnen. - Der Rahmen meiner akademischen Arbeit erstreckt sich über Entwicklungsstudien, sozialen Schutz, Öko-Tourismus, und Arbeitsmarktstudien. - - Abseits meiner professionellen Tätigkeiten interessiere ich mich für, - und befürworte aktiv, - die Produktion von freier und offener Software sowie - die Schaffung von Bedingungen für eine offene und barrierefreie Wissensproduktion. + Durch die Erstellung der entwickelnden Forschungsliteratur habe ich ein breites Spektrum an Fähigkeiten im Bereich der Datenerfassung, Organisation und Visualisierung entwickelt, sowie Erfahrungen in Manuskriptbearbeitung und Referenzmanagement erworben. Zusätzlich habe ich Einblicke in Event Management, Lehrassistentenarbeit, Content Creation, Systemadministration und Website-Management gewonnen. Jenseits meines beruflichen Engagements fördere ich den Aufbau freier und offener Software und Offener Wissenschaft ohne Barrieren. + Ich bin offen für Gelegenheiten, die meine Expertise in diesen Bereichen vertiefen, jedoch auch für solche, die meine Kenntnisbereiche erweitern. en: | - Since graduating from the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant analyzing processes inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies. + Since completing the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant focused on processes of inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies. - Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. In addition to research skills, I have gotten insights into event management, teaching assistance, content creation, system administration and website management. Aside from professional work I foster the development of free and open software and barrier-free and open science. + Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. Additionally, I have gained insights into event management, teaching assistance, content creation, system administration and website management. Beyond professional work I foster the development of free and open software and open science without barriers. - I am always happy to receive opportunities to further my in-depth expertise in these topics, in addition to a broad range of applicable skills. + I welcome opportunities to deepen my expertise in these topics, in addition to those expanding my range of applicable skills. experience: - date: From c0678dbdf3e0dd5c4892ef731e7e7c23a072c751 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 26 Sep 2024 11:14:03 +0200 Subject: [PATCH 21/61] Remove leftover quarto generation files --- _quarto.yml | 15 - poetry.lock | 2295 ------------------------------------- processing/__init__.py | 0 processing/content.py | 92 -- processing/yml.py | 9 - pyproject.toml | 22 - resume_de.qmd | 47 - resume_en.qmd | 51 - templates/jb2resume.latex | 103 -- templates/letter.latex | 645 ----------- 10 files changed, 3279 deletions(-) delete mode 100644 _quarto.yml delete mode 100644 poetry.lock delete mode 100644 processing/__init__.py delete mode 100644 processing/content.py delete mode 100644 processing/yml.py delete mode 100644 pyproject.toml delete mode 100644 resume_de.qmd delete mode 100644 resume_en.qmd delete mode 100644 templates/jb2resume.latex delete mode 100644 templates/letter.latex diff --git a/_quarto.yml b/_quarto.yml deleted file mode 100644 index add6a10..0000000 --- a/_quarto.yml +++ /dev/null @@ -1,15 +0,0 @@ -project: - output-dir: _output - -format: - html: default - pdf: - latex-auto-mk: false - pdf-engine: tectonic - template: templates/jb2resume.latex - include-in-header: - - text: | - \usepackage{xcolor} - -execute: - echo: false diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index ca53cc8..0000000 --- a/poetry.lock +++ /dev/null @@ -1,2295 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "appnope" -version = "0.1.4" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = ">=3.6" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - -[[package]] -name = "argon2-cffi" -version = "23.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, - {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["argon2-cffi[tests,typing]", "tox (>4)"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] -tests = ["hypothesis", "pytest"] -typing = ["mypy"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] - -[[package]] -name = "arrow" -version = "1.3.0" -description = "Better dates & times for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, -] - -[package.dependencies] -python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" - -[package.extras] -doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] - -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - -[[package]] -name = "async-lru" -version = "2.0.4" -description = "Simple LRU cache for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, - {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, -] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "babel" -version = "2.15.0" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, -] - -[package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] - -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "bleach" -version = "6.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] - -[[package]] -name = "certifi" -version = "2024.2.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "comm" -version = "0.2.2" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -optional = false -python-versions = ">=3.8" -files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, -] - -[package.dependencies] -traitlets = ">=4" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "debugpy" -version = "1.8.1" -description = "An implementation of the Debug Adapter Protocol for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, - {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, - {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, - {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, - {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, - {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, - {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, - {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, - {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, - {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, - {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, - {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, - {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, - {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, - {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, - {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, - {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, - {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, - {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, - {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, - {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, - {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, -] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = ">=3.5" -files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - -[[package]] -name = "fastjsonschema" -version = "2.19.1" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, - {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "fqdn" -version = "1.5.1" -description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -optional = false -python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -files = [ - {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, - {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, -] - -[[package]] -name = "greenlet" -version = "3.0.3" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "ipykernel" -version = "6.29.4" -description = "IPython Kernel for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=24" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "ipython" -version = "8.24.0" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.10" -files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt-toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} - -[package.extras] -all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] -kernel = ["ipykernel"] -matplotlib = ["matplotlib"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] - -[[package]] -name = "ipywidgets" -version = "8.1.3" -description = "Jupyter interactive widgets" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, - {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.11,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.11,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "isoduration" -version = "20.11.0" -description = "Operations with ISO 8601 durations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, - {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, -] - -[package.dependencies] -arrow = ">=0.15.0" - -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "json5" -version = "0.9.25" -description = "A Python implementation of the JSON5 data format." -optional = false -python-versions = ">=3.8" -files = [ - {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, - {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, -] - -[[package]] -name = "jsonpointer" -version = "2.4" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, -] - -[[package]] -name = "jsonschema" -version = "4.22.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} -rpds-py = ">=0.7.1" -uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - -[[package]] -name = "jupyter" -version = "1.0.0" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -optional = false -python-versions = "*" -files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, -] - -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -nbconvert = "*" -notebook = "*" -qtconsole = "*" - -[[package]] -name = "jupyter-client" -version = "8.6.2" -description = "Jupyter protocol implementation and client libraries" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, -] - -[package.dependencies] -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -description = "Jupyter terminal console" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, - {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, -] - -[package.dependencies] -ipykernel = ">=6.14" -ipython = "*" -jupyter-client = ">=7.0.0" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -prompt-toolkit = ">=3.0.30" -pygments = "*" -pyzmq = ">=17" -traitlets = ">=5.4" - -[package.extras] -test = ["flaky", "pexpect", "pytest"] - -[[package]] -name = "jupyter-core" -version = "5.7.2" -description = "Jupyter core package. A base package on which Jupyter projects rely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, - {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-events" -version = "0.10.0" -description = "Jupyter Event System library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, - {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, -] - -[package.dependencies] -jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} -python-json-logger = ">=2.0.4" -pyyaml = ">=5.3" -referencing = "*" -rfc3339-validator = "*" -rfc3986-validator = ">=0.1.1" -traitlets = ">=5.3" - -[package.extras] -cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] -test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] - -[[package]] -name = "jupyter-lsp" -version = "2.2.5" -description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, - {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, -] - -[package.dependencies] -jupyter-server = ">=1.1.2" - -[[package]] -name = "jupyter-server" -version = "2.14.0" -description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server-2.14.0-py3-none-any.whl", hash = "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210"}, - {file = "jupyter_server-2.14.0.tar.gz", hash = "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677"}, -] - -[package.dependencies] -anyio = ">=3.1.0" -argon2-cffi = ">=21.1" -jinja2 = ">=3.0.3" -jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.9.0" -jupyter-server-terminals = ">=0.4.4" -nbconvert = ">=6.4.4" -nbformat = ">=5.3.0" -overrides = ">=5.0" -packaging = ">=22.0" -prometheus-client = ">=0.9" -pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} -pyzmq = ">=24" -send2trash = ">=1.8.2" -terminado = ">=0.8.3" -tornado = ">=6.2.0" -traitlets = ">=5.6.0" -websocket-client = ">=1.7" - -[package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.3" -description = "A Jupyter Server Extension Providing Terminals." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, - {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, -] - -[package.dependencies] -pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} -terminado = ">=0.8.3" - -[package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] - -[[package]] -name = "jupyterlab" -version = "4.2.1" -description = "JupyterLab computational environment" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab-4.2.1-py3-none-any.whl", hash = "sha256:6ac6e3827b3c890e6e549800e8a4f4aaea6a69321e2240007902aa7a0c56a8e4"}, - {file = "jupyterlab-4.2.1.tar.gz", hash = "sha256:a10fb71085a6900820c62d43324005046402ffc8f0fde696103e37238a839507"}, -] - -[package.dependencies] -async-lru = ">=1.0.0" -httpx = ">=0.25.0" -ipykernel = ">=6.5.0" -jinja2 = ">=3.0.3" -jupyter-core = "*" -jupyter-lsp = ">=2.0.0" -jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2" -packaging = "*" -tornado = ">=6.2.0" -traitlets = "*" - -[package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] -test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=8,<10)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -description = "Pygments theme using JupyterLab CSS variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, - {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, -] - -[[package]] -name = "jupyterlab-server" -version = "2.27.2" -description = "A set of server components for JupyterLab and JupyterLab like applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_server-2.27.2-py3-none-any.whl", hash = "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43"}, - {file = "jupyterlab_server-2.27.2.tar.gz", hash = "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27"}, -] - -[package.dependencies] -babel = ">=2.10" -jinja2 = ">=3.0.3" -json5 = ">=0.9.0" -jsonschema = ">=4.18.0" -jupyter-server = ">=1.21,<3" -packaging = ">=21.3" -requests = ">=2.31" - -[package.extras] -docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] -openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.11" -description = "Jupyter interactive widgets for JupyterLab" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, - {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, -] - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mistune" -version = "3.0.2" -description = "A sane and fast Markdown parser with useful plugins and renderers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, -] - -[[package]] -name = "msgpack" -version = "1.0.8" -description = "MessagePack serializer" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, -] - -[[package]] -name = "nbclient" -version = "0.10.0" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, - {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1" -traitlets = ">=5.4" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.16.4" -description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = "!=5.0.0" -defusedxml = "*" -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<4" -nbclient = ">=0.5.0" -nbformat = ">=5.7" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -tinycss2 = "*" -traitlets = ">=5.1" - -[package.extras] -all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["pyqtwebengine (>=5.15)"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] -webpdf = ["playwright"] - -[[package]] -name = "nbformat" -version = "5.10.4" -description = "The Jupyter Notebook format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, - {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, -] - -[package.dependencies] -fastjsonschema = ">=2.15" -jsonschema = ">=2.6" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -description = "Patch asyncio to allow nested event loops" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, - {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, -] - -[[package]] -name = "notebook" -version = "7.2.0" -description = "Jupyter Notebook - A web-based notebook environment for interactive computing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "notebook-7.2.0-py3-none-any.whl", hash = "sha256:b4752d7407d6c8872fc505df0f00d3cae46e8efb033b822adacbaa3f1f3ce8f5"}, - {file = "notebook-7.2.0.tar.gz", hash = "sha256:34a2ba4b08ad5d19ec930db7484fb79746a1784be9e1a5f8218f9af8656a141f"}, -] - -[package.dependencies] -jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.2.0,<4.3" -jupyterlab-server = ">=2.27.1,<3" -notebook-shim = ">=0.2,<0.3" -tornado = ">=6.2.0" - -[package.extras] -dev = ["hatch", "pre-commit"] -docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -description = "A shim layer for notebook traits and config" -optional = false -python-versions = ">=3.7" -files = [ - {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, - {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, -] - -[package.dependencies] -jupyter-server = ">=1.8,<3" - -[package.extras] -test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] - -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - -[[package]] -name = "packaging" -version = "24.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, -] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -description = "Utilities for writing pandoc filters in python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, - {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, -] - -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - -[[package]] -name = "prometheus-client" -version = "0.20.0" -description = "Python client for the Prometheus monitoring system." -optional = false -python-versions = ">=3.8" -files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, -] - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.45" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, - {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "psutil" -version = "5.9.8" -description = "Cross-platform lib for process and system monitoring in Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pygments" -version = "2.18.0" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pynvim" -version = "0.4.3" -description = "Python client to neovim" -optional = false -python-versions = "*" -files = [ - {file = "pynvim-0.4.3.tar.gz", hash = "sha256:3a795378bde5e8092fbeb3a1a99be9c613d2685542f1db0e5c6fd467eed56dff"}, -] - -[package.dependencies] -greenlet = "*" -msgpack = ">=0.5.0" - -[package.extras] -pyuv = ["pyuv (>=1.0.0)"] -test = ["pytest (>=3.4.0)"] - -[[package]] -name = "pyperclip" -version = "1.8.2" -description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -optional = false -python-versions = "*" -files = [ - {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, -] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pywinpty" -version = "2.0.13" -description = "Pseudo terminal support for Windows from Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "pyzmq" -version = "26.0.3" -description = "Python bindings for 0MQ" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "qtconsole" -version = "5.5.2" -description = "Jupyter Qt console" -optional = false -python-versions = ">=3.8" -files = [ - {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, - {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -jupyter-client = ">=4.1" -jupyter-core = "*" -packaging = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.4.0" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.4.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false -python-versions = ">=3.7" -files = [ - {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, - {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] - -[[package]] -name = "referencing" -version = "0.35.1" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - -[[package]] -name = "requests" -version = "2.32.2" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, - {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -description = "Pure python rfc3986 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, - {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, -] - -[[package]] -name = "rpds-py" -version = "0.18.1" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, -] - -[[package]] -name = "send2trash" -version = "1.8.3" -description = "Send file to trash natively under Mac OS X, Windows and Linux" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, - {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, -] - -[package.extras] -nativelib = ["pyobjc-framework-Cocoa", "pywin32"] -objc = ["pyobjc-framework-Cocoa"] -win32 = ["pywin32"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[[package]] -name = "terminado" -version = "0.18.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, - {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, -] - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} -tornado = ">=6.1.0" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] -typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] - -[[package]] -name = "tinycss2" -version = "1.3.0" -description = "A tiny CSS parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["pytest", "ruff"] - -[[package]] -name = "tornado" -version = "6.4" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20240316" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, -] - -[[package]] -name = "typing-extensions" -version = "4.12.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, -] - -[[package]] -name = "uri-template" -version = "1.3.0" -description = "RFC 6570 URI Template Processor" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, - {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, -] - -[package.extras] -dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] - -[[package]] -name = "urllib3" -version = "2.2.1" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - -[[package]] -name = "webcolors" -version = "1.13" -description = "A library for working with the color formats defined by HTML and CSS." -optional = false -python-versions = ">=3.7" -files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, -] - -[package.extras] -docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.11" -description = "Jupyter interactive widgets for Jupyter Notebook" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, - {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "997e9dca94362e72d183a8fb0b49d6ef13c867f1c8628ed706b64b889a74e025" diff --git a/processing/__init__.py b/processing/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/processing/content.py b/processing/content.py deleted file mode 100644 index a5609c9..0000000 --- a/processing/content.py +++ /dev/null @@ -1,92 +0,0 @@ -from typing import Any - - -def summary_to_md(data: dict[str, Any], lang: str = "en", headline: str = ""): - if "summary" not in data: - return "" - md = f"{headline}\n\n {data['summary'][lang]}\n\n" - - return md - - -def _publication_md(publication: str, subdued: bool): - md = "> " - if subdued: - md += "\\textcolor{publication}{" - md += publication - if subdued: - md += "}" - return f"{md}\n\n" - - -def experience_to_md( - data: dict[str, Any], - lang: str = "en", - headline: str = "", - subdued_publications: bool = True, # slightly off-color presentation - bulletpoints_show: bool = True, # display detailed bulletpoints per job -): - if "experience" not in data: - return "" - - md = f"{headline}\n\n" - md += "\\definecolor{publication}{rgb}{0.5,0.5,0.5}\n\n" - for exp in data["experience"]: - client = exp["client"][lang] if "client" in exp else "" - title = exp["title"][lang] if "title" in exp else "" - md += ( - # new python 3.12 f-string embedding niceness - f"## {title}{f", {client}" if client else ""}\\hfill{exp['date'][lang]}\n\n" - ) - - if "publication" in exp: - md += _publication_md(exp["publication"][lang], subdued_publications) - - if bulletpoints_show: - for point in exp["bullets"]: - md += f"* {point[lang]}\n" - md += "\n\n" - - return md - - -def thesis_to_md(data: dict[str, Any], lang: str = "en"): - md = "" - for thesis in data["thesis"]: - md += f"{thesis['type'][lang]}\n" - md += f": {thesis['title'][lang]}\n" - md += f": {thesis['abstract'][lang]}\n" - return f"{md}\n" - - -def education_to_md( - data: dict[str, Any], lang: str = "en", headline: str = "", thesis: bool = True -): - if "education" not in data: - return "" - - md = f"{headline}\n\n" - - if thesis and "thesis" in data: - md += thesis_to_md(data, lang) - - for edu in data["education"]: - md += ( - f"{edu['place'][lang]}\n\n: {edu['program'][lang]}; {edu['date'][lang]}\n\n" - ) - - return md - - -def qualifications_to_md(data: dict[str, Any], lang: str = "en", headline: str = ""): - if "skills" not in data: - return "" - - md = f"{headline}\n\n" - for skillset in data["skills"]: - md += f"{skillset[lang]}\n\n" - for content in skillset["content"]: - md += f": {content['name'][lang]} ({', '.join([item[lang] for item in content['items']])})\n" - md += "\n" - - return md diff --git a/processing/yml.py b/processing/yml.py deleted file mode 100644 index 4f3f7f4..0000000 --- a/processing/yml.py +++ /dev/null @@ -1,9 +0,0 @@ -import yaml - -DEFAULT_FILE = "content.yml" - - -def parse(fname: str = DEFAULT_FILE): - with open(fname, mode="rb") as f: - return yaml.safe_load(f) - diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 2326f7d..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,22 +0,0 @@ -[tool.poetry] -name = "resume" -version = "0.1.0" -description = "My personal curriculum vitae" -authors = ["Marty Oehme "] -license = "GPLv3" -packages = [ - { include = "processing"} -] - -[tool.poetry.dependencies] -python = "^3.11" -PyYAML = "^6.0" -jupyter = "^1.0.0" - -[tool.poetry.group.dev.dependencies] -pynvim = "^0.4.3" -pyperclip = "^1.8.2" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/resume_de.qmd b/resume_de.qmd deleted file mode 100644 index c6c848b..0000000 --- a/resume_de.qmd +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Lebenslauf -subtitle: Marty Oehme -name: Marty Oehme -lang: de -left-column: - - "Email: [marty.oehme@gmail.com](mailto:marty.oehme@gmail.com)" - - "Telefon: +49 177 377 4949" -right-column: - - "Homepage: [http://martyoeh.me/](http://martyoeh.me/)" - - "GitHub: [https://github.com/marty-oehme/](https://github.com/marty-oehme/)" - - 'Stand: \today' ---- - -```{python} -from processing import yml, content -from IPython.display import Markdown - -data = yml.parse("content.yml") -lang = "de" -``` - -```{python} -#| label: summary -display(Markdown(content.summary_to_md(data, headline="# Zusammenfassung", lang=lang))) -``` - -```{python} -#| label: prof experience -display( - Markdown(content.experience_to_md(data, headline="# Berufserfahrung", lang=lang)) -) -``` - -```{python} -#| label: education -display(Markdown(content.education_to_md(data, headline="# Ausbildung", lang=lang))) -``` - -```{python} -#| label: qualifications -display( - Markdown( - content.qualifications_to_md(data, headline="# Qualifikationen", lang=lang) - ) -) -``` diff --git a/resume_en.qmd b/resume_en.qmd deleted file mode 100644 index ccabc17..0000000 --- a/resume_en.qmd +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Curriculum Vitae -subtitle: Marty Oehme -name: Marty Oehme -lang: en -left-column: - - "Email: [marty.oehme@gmail.com](mailto:marty.oehme@gmail.com)" - - "Mobile: +49 177 377 4949" -right-column: - - "Homepage: [http://martyoeh.me/](http://martyoeh.me/)" - - "GitHub: [https://github.com/marty-oehme/](https://github.com/marty-oehme/)" - - 'Last Updated: \today' ---- - -```{python} -from processing import yml, content -from IPython.display import Markdown - -data = yml.parse("content.yml") -lang = "en" -``` - -```{python} -#| label: summary -display(Markdown(content.summary_to_md(data, headline="# Summary", lang=lang))) -``` - -```{python} -#| label: prof experience -display( - Markdown( - content.experience_to_md( - data, - headline="# Professional experience", - lang=lang, - ) - ) -) -``` - -```{python} -#| label: education -display(Markdown(content.education_to_md(data, headline="# Education", lang=lang))) -``` - -```{python} -#| label: qualifications -display( - Markdown(content.qualifications_to_md(data, headline="# Qualifications", lang=lang)) -) -``` diff --git a/templates/jb2resume.latex b/templates/jb2resume.latex deleted file mode 100644 index d57eeb5..0000000 --- a/templates/jb2resume.latex +++ /dev/null @@ -1,103 +0,0 @@ -% LaTeX Resume Pandoc Template jb2resume.latex -% -% Copyright (c) 2016-2017, John Bokma -% Based on Jason Blevins' LaTeX CV Template; -% http://jblevins.org/projects/cv-template/ -% -% GitHub: https://github.com/john-bokma/resume-pandoc - -\documentclass[$if(fontsize)$$fontsize$$else$10pt$endif$,letterpaper]{article} - -\usepackage{hyperref} -\usepackage{geometry} -\usepackage{enumitem} -\usepackage{underscore} -\usepackage[parfill]{parskip} -\usepackage{lmodern} -\usepackage[svgnames]{xcolor} -\usepackage[utf8]{inputenc} - -% Your name on the resume -\def\name{$name$} - -% The following metadata will show up in the PDF properties -\hypersetup{ - colorlinks = true, - urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$, - linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$, - pdfauthor = {\name}, - pdfkeywords = {$keywords$}, - pdftitle = {\name: Curriculum Vitae}, - pdfsubject = {Curriculum Vitae}, - pdfpagemode = UseNone -} - -\geometry{ - left=0.5in, - top=0.5in, - right=0.5in, -} -\renewcommand{\baselinestretch}{1} - -% Fix for "! Undefined control sequence. \tightlist", -% see: https://github.com/osener/markup.rocks/issues/4 -% I have this issue with Pandoc 1.17.2 -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} - -% Page number is top right, and it is possible to control the rest of -% the header. -\pagestyle{myheadings} -\markright{\name} -\thispagestyle{empty} - -% Custom section fonts -\usepackage{sectsty} -$if(section-color)$ -\sectionfont{\color{$section-color$}\sffamily\bfseries\Large} -$else$ -\sectionfont{\rmfamily\mdseries\Large} -$endif$ -\subsectionfont{\rmfamily\mdseries\itshape\large} - -% Section numbers or not (default) -$if(numbersections)$ -\setcounter{secnumdepth}{5} -$else$ -\setcounter{secnumdepth}{0} -$endif$ - -% By putting an empty \item[] at the start of the list, the list -% starts on a new line. -\setlist[itemize]{leftmargin=1em,label={--},before=\item[]} - -\setlist[description]{leftmargin=0em, style=sameline} - -% Don't use monospace font for URLs -\urlstyle{same} - -\begin{document} - -% Place name at left -$if(name-color)$ -{\huge\color{$name-color$}\sffamily\bfseries \name} -$else$ -{\huge \name} -$endif$ - -\bigskip - -$if(left-column)$ -\begin{minipage}[t]{0.495\textwidth} - $for(left-column)$$left-column$$sep$ \\ $endfor$ -\end{minipage} % Don't use empty lines after \end and the next \begin{minipage}. -$endif$ -$if(right-column)$ -\begin{minipage}[t]{0.495\textwidth} - $for(right-column)$$right-column$$sep$ \\ $endfor$ -\end{minipage} -$endif$ - -$body$ - -\end{document} diff --git a/templates/letter.latex b/templates/letter.latex deleted file mode 100644 index b96e5a3..0000000 --- a/templates/letter.latex +++ /dev/null @@ -1,645 +0,0 @@ -% -% Options for packages loaded elsewhere -% -% taken with gratitude from: -% https://github.com/benedictdudel/pandoc-letter-din5008 -% -\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref} -\PassOptionsToPackage{hyphens}{url} -$if(colorlinks)$ -\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor} -$endif$ -$if(CJKmainfont)$ -\PassOptionsToPackage{space}{xeCJK} -$endif$ -% -\documentclass[ -$if(fontsize)$ - $fontsize$, -$endif$ -$if(papersize)$ - $papersize$paper, -$endif$ -$if(beamer)$ - ignorenonframetext, -$if(handout)$ - handout, -$endif$ -$if(aspectratio)$ - aspectratio=$aspectratio$, -$endif$ -$endif$ -$for(classoption)$ - $classoption$$sep$, -$endfor$ -]{scrlttr2} -$if(beamer)$ -$if(background-image)$ -\usebackgroundtemplate{% - \includegraphics[width=\paperwidth]{$background-image$}% -} -$endif$ -\usepackage{pgfpages} -\setbeamertemplate{caption}[numbered] -\setbeamertemplate{caption label separator}{: } -\setbeamercolor{caption name}{fg=normal text.fg} -\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$ -$for(beameroption)$ -\setbeameroption{$beameroption$} -$endfor$ -% Prevent slide breaks in the middle of a paragraph -\widowpenalties 1 10000 -\raggedbottom -$if(section-titles)$ -\setbeamertemplate{part page}{ - \centering - \begin{beamercolorbox}[sep=16pt,center]{part title} - \usebeamerfont{part title}\insertpart\par - \end{beamercolorbox} -} -\setbeamertemplate{section page}{ - \centering - \begin{beamercolorbox}[sep=12pt,center]{part title} - \usebeamerfont{section title}\insertsection\par - \end{beamercolorbox} -} -\setbeamertemplate{subsection page}{ - \centering - \begin{beamercolorbox}[sep=8pt,center]{part title} - \usebeamerfont{subsection title}\insertsubsection\par - \end{beamercolorbox} -} -\AtBeginPart{ - \frame{\partpage} -} -\AtBeginSection{ - \ifbibliography - \else - \frame{\sectionpage} - \fi -} -\AtBeginSubsection{ - \frame{\subsectionpage} -} -$endif$ -$endif$ -$if(beamerarticle)$ -\usepackage{beamerarticle} % needs to be loaded first -$endif$ -\usepackage{amsmath,amssymb} -$if(linestretch)$ -\usepackage{setspace} -$endif$ -\usepackage{iftex} -\ifPDFTeX - \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} - \usepackage[utf8]{inputenc} - \usepackage{textcomp} % provide euro and other symbols -\else % if luatex or xetex -$if(mathspec)$ - \ifXeTeX - \usepackage{mathspec} % this also loads fontspec - \else - \usepackage{unicode-math} % this also loads fontspec - \fi -$else$ - \usepackage{unicode-math} % this also loads fontspec -$endif$ - \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme - \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} -\fi -$if(fontfamily)$ -$else$ -$-- Set default font before Beamer theme so the theme can override it -\usepackage{lmodern} -$endif$ -$-- Set Beamer theme before user font settings so they can override theme -$if(beamer)$ -$if(theme)$ -\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$} -$endif$ -$if(colortheme)$ -\usecolortheme{$colortheme$} -$endif$ -$if(fonttheme)$ -\usefonttheme{$fonttheme$} -$endif$ -$if(mainfont)$ -\usefonttheme{serif} % use mainfont rather than sansfont for slide text -$endif$ -$if(innertheme)$ -\useinnertheme{$innertheme$} -$endif$ -$if(outertheme)$ -\useoutertheme{$outertheme$} -$endif$ -$endif$ -$-- User font settings (must come after default font and Beamer theme) -$if(fontfamily)$ -\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} -$endif$ -\ifPDFTeX\else - % xetex/luatex font selection -$if(mainfont)$ - \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} -$endif$ -$if(sansfont)$ - \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} -$endif$ -$if(monofont)$ - \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$} -$endif$ -$for(fontfamilies)$ - \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$} -$endfor$ -$if(mathfont)$ -$if(mathspec)$ - \ifXeTeX - \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} - \else - \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} - \fi -$else$ - \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} -$endif$ -$endif$ -$if(CJKmainfont)$ - \ifXeTeX - \usepackage{xeCJK} - \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} - \fi -$endif$ -$if(luatexjapresetoptions)$ - \ifLuaTeX - \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset} - \fi -$endif$ -$if(CJKmainfont)$ - \ifLuaTeX - \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec} - \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} - \fi -$endif$ -\fi -$if(zero-width-non-joiner)$ -%% Support for zero-width non-joiner characters. -\makeatletter -\def\zerowidthnonjoiner{% - % Prevent ligatures and adjust kerning, but still support hyphenating. - \texorpdfstring{% - \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}% - \ifvmode\else\nobreak\hskip\z@skip\fi}{}% - }{}% -} -\makeatother -\ifPDFTeX - \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner} -\else - \catcode`^^^^200c=\active - \protected\def ^^^^200c{\zerowidthnonjoiner} -\fi -%% End of ZWNJ support -$endif$ -% Use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -\IfFileExists{microtype.sty}{% use microtype if available - \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype} - \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} -$if(indent)$ -$else$ -\makeatletter -\@ifundefined{KOMAClassName}{% if non-KOMA class - \IfFileExists{parskip.sty}{% - \usepackage{parskip} - }{% else - \setlength{\parindent}{0pt} - \setlength{\parskip}{6pt plus 2pt minus 1pt}} -}{% if KOMA class - \KOMAoptions{parskip=half}} -\makeatother -$endif$ -$if(verbatim-in-note)$ -\usepackage{fancyvrb} -$endif$ -\usepackage{xcolor} -$if(geometry)$ -$if(beamer)$ -\geometry{$for(geometry)$$geometry$$sep$,$endfor$} -$else$ -\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} -$endif$ -$endif$ -$if(beamer)$ -\newif\ifbibliography -$endif$ -$if(listings)$ -\usepackage{listings} -\newcommand{\passthrough}[1]{#1} -\lstset{defaultdialect=[5.3]Lua} -\lstset{defaultdialect=[x86masm]Assembler} -$endif$ -$if(lhs)$ -\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} -$endif$ -$if(highlighting-macros)$ -$highlighting-macros$ -$endif$ -$if(tables)$ -\usepackage{longtable,booktabs,array} -$if(multirow)$ -\usepackage{multirow} -$endif$ -\usepackage{calc} % for calculating minipage widths -$if(beamer)$ -\usepackage{caption} -% Make caption package work with longtable -\makeatletter -\def\fnum@table{\tablename~\thetable} -\makeatother -$else$ -% Correct order of tables after \paragraph or \subparagraph -\usepackage{etoolbox} -\makeatletter -\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} -\makeatother -% Allow footnotes in longtable head/foot -\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} -\makesavenoteenv{longtable} -$endif$ -$endif$ -$if(graphics)$ -\usepackage{graphicx} -\makeatletter -\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} -\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} -\makeatother -% Scale images if necessary, so that they will not overflow the page -% margins by default, and it is still possible to overwrite the defaults -% using explicit options in \includegraphics[width, height, ...]{} -\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} -% Set default figure placement to htbp -\makeatletter -\def\fps@figure{htbp} -\makeatother -$endif$ -$if(svg)$ -\usepackage{svg} -$endif$ -$if(strikeout)$ -$-- also used for underline -\usepackage{soul} -$endif$ -\setlength{\emergencystretch}{3em} % prevent overfull lines -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} -$if(numbersections)$ -\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} -$else$ -\setcounter{secnumdepth}{-\maxdimen} % remove section numbering -$endif$ -$if(beamer)$ -$else$ -$if(block-headings)$ -% Make \paragraph and \subparagraph free-standing -\ifx\paragraph\undefined\else - \let\oldparagraph\paragraph - \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} -\fi -\ifx\subparagraph\undefined\else - \let\oldsubparagraph\subparagraph - \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} -\fi -$endif$ -$endif$ -$if(pagestyle)$ -\pagestyle{$pagestyle$} -$endif$ -$if(csl-refs)$ -\newlength{\cslhangindent} -\setlength{\cslhangindent}{1.5em} -\newlength{\csllabelwidth} -\setlength{\csllabelwidth}{3em} -\newlength{\cslentryspacingunit} % times entry-spacing -\setlength{\cslentryspacingunit}{\parskip} -\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing - {% don't indent paragraphs - \setlength{\parindent}{0pt} - % turn on hanging indent if param 1 is 1 - \ifodd #1 - \let\oldpar\par - \def\par{\hangindent=\cslhangindent\oldpar} - \fi - % set entry spacing - \setlength{\parskip}{#2\cslentryspacingunit} - }% - {} -\usepackage{calc} -\newcommand{\CSLBlock}[1]{#1\hfill\break} -\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}} -\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break} -\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} -$endif$ -$if(lang)$ -\ifLuaTeX -\usepackage[bidi=basic]{babel} -\else -\usepackage[bidi=default]{babel} -\fi -$if(babel-lang)$ -\babelprovide[main,import]{$babel-lang$} -$endif$ -$for(babel-otherlangs)$ -\babelprovide[import]{$babel-otherlangs$} -$endfor$ -% get rid of language-specific shorthands (see #6817): -\let\LanguageShortHands\languageshorthands -\def\languageshorthands#1{} -$endif$ -$for(header-includes)$ -$header-includes$ -$endfor$ -\ifLuaTeX - \usepackage{selnolig} % disable illegal ligatures -\fi -$if(dir)$ -\ifPDFTeX - \TeXXeTstate=1 - \newcommand{\RL}[1]{\beginR #1\endR} - \newcommand{\LR}[1]{\beginL #1\endL} - \newenvironment{RTL}{\beginR}{\endR} - \newenvironment{LTR}{\beginL}{\endL} -\fi -$endif$ -$if(natbib)$ -\usepackage[$natbiboptions$]{natbib} -\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} -$endif$ -$if(biblatex)$ -\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} -$for(bibliography)$ -\addbibresource{$bibliography$} -$endfor$ -$endif$ -$if(nocite-ids)$ -\nocite{$for(nocite-ids)$$it$$sep$, $endfor$} -$endif$ -$if(csquotes)$ -\usepackage{csquotes} -$endif$ -\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}} -\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available -\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$} -$if(links-as-notes)$ -% Make links footnotes instead of hotlinks: -\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}} -$endif$ -$if(verbatim-in-note)$ -\VerbatimFootnotes % allow verbatim text in footnotes -$endif$ -\hypersetup{ -$if(title-meta)$ - pdftitle={$title-meta$}, -$endif$ -$if(author-meta)$ - pdfauthor={$author-meta$}, -$endif$ -$if(lang)$ - pdflang={$lang$}, -$endif$ -$if(subject)$ - pdfsubject={$subject$}, -$endif$ -$if(keywords)$ - pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$}, -$endif$ -$if(colorlinks)$ - colorlinks=true, - linkcolor={$if(linkcolor)$$linkcolor$$else$Maroon$endif$}, - filecolor={$if(filecolor)$$filecolor$$else$Maroon$endif$}, - citecolor={$if(citecolor)$$citecolor$$else$Blue$endif$}, - urlcolor={$if(urlcolor)$$urlcolor$$else$Blue$endif$}, -$else$ -$if(boxlinks)$ -$else$ - hidelinks, -$endif$ -$endif$ - pdfcreator={LaTeX via pandoc}} - -$if(title)$ -\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} -$endif$ -$if(subtitle)$ -$if(beamer)$ -$else$ -\usepackage{etoolbox} -\makeatletter -\providecommand{\subtitle}[1]{% add subtitle to \maketitle - \apptocmd{\@title}{\par {\large #1 \par}}{}{} -} -\makeatother -$endif$ -\subtitle{$subtitle$} -$endif$ -\author{$for(author)$$author$$sep$ \and $endfor$} -\date{$date$} -$if(beamer)$ -$if(institute)$ -\institute{$for(institute)$$institute$$sep$ \and $endfor$} -$endif$ -$if(titlegraphic)$ -\titlegraphic{\includegraphics{$titlegraphic$}} -$endif$ -$if(logo)$ -\logo{\includegraphics{$logo$}} -$endif$ -$endif$ - -% OVERRIDES -\newkomavar{opening} -\newkomavar{closing} - -\KOMAoptions{fromemail=false} -\KOMAoptions{fromfax=false} -\KOMAoptions{fromlogo=false} -\KOMAoptions{frommobilephone=false} -\KOMAoptions{fromphone=false} -\KOMAoptions{fromurl=false} -\KOMAoptions{fromalign=right} - -\setkomavar{opening}{Sehr geehrte Damen und Herren,} -\setkomavar{closing}{Mit freundlichen Grüßen} -\setkomavar*{enclseparator}{Anlagen} - -$for(letteroption)$ -\LoadLetterOption{$letteroption$} -$endfor$ - -$if(addresseeimage)$\setkomavar{addresseeimage}{$addresseeimage$}$endif$ -$if(backaddress)$\setkomavar{backaddress}{$backaddress$}\KOMAoptions{backaddress=true}$endif$ -$if(backaddressseparator)$\setkomavar{backaddressseparator}{$backaddressseparator$}$endif$ -$if(ccseparator)$\setkomavar{ccseparator}{$ccseparator$}$endif$ -$if(customer)$\setkomavar{customer}{$customer$}$endif$ -% $if(date)$\setkomavar{date}{$date$}$endif$ -$if(emailseparator)$\setkomavar{emailseparator}{$emailseparator$}$endif$ -$if(enclseparator)$\setkomavar{enclseparator}{$enclseparator$}$endif$ -$if(faxseparator)$\setkomavar{faxseparator}{$faxseparator$}$endif$ -$if(firstfoot)$\setkomavar{firstfoot}{$firstfoot$}$endif$ -$if(firsthead)$\setkomavar{firsthead}{$firsthead$}$endif$ -$if(fromaddress)$\setkomavar{fromaddress}{$fromaddress$}$endif$ -$if(frombank)$\setkomavar{frombank}{$frombank$}$endif$ -$if(fromemail)$\setkomavar{fromemail}{$fromemail$}\KOMAoptions{fromemail=true}$endif$ -$if(fromfax)$\setkomavar{fromfax}{$fromfax$}\KOMAoptions{fromfax=true}$endif$ -$if(fromlogo)$\setkomavar{fromlogo}{$fromlogo$}\KOMAoptions{fromlogo=true}$endif$ -$if(frommobilephone)$\setkomavar{frommobilephone}{$frommobilephone$}\KOMAoptions{frommobilephone=true}$endif$ -$if(fromname)$\setkomavar{fromname}{$fromname$}$endif$ -$if(fromphone)$\setkomavar{fromphone}{$fromphone$}\KOMAoptions{fromphone=true}$endif$ -$if(fromurl)$\setkomavar{fromurl}{$fromurl$}\KOMAoptions{fromurl=true}$endif$ -$if(fromzipcode)$\setkomavar{fromzipcode}{$fromzipcode$}$endif$ -$if(invoice)$\setkomavar{invoice}{$invoice$}$endif$ -$if(location)$\setkomavar{location}{$location$}$endif$ -$if(myref)$\setkomavar{myref}{$myref$}$endif$ -$if(nextfoot)$\setkomavar{nextfoot}{$nextfoot$}$endif$ -$if(nexthead)$\setkomavar{nexthead}{$nexthead$}$endif$ -$if(phoneseparator)$\setkomavar{phoneseparator}{$phoneseparator$}$endif$ -$if(place)$\setkomavar{place}{$place$}$endif$ -$if(placeseparator)$\setkomavar{placeseparator}{$placeseparator$}$endif$ -$if(PPdatamatrix)$\setkomavar{PPdatamatrix}{$PPdatamatrix$}$endif$ -$if(PPcode)$\setkomavar{PPcode}{$PPcode$}$endif$ -$if(signature)$\setkomavar{signature}{$signature$}\renewcommand*{\raggedsignature}{\raggedright}$endif$ -$if(specialmail)$\setkomavar{specialmail}{$specialmail$}$endif$ -$if(subject)$\setkomavar{subject}{$subject$}$endif$ -$if(subjectseparator)$\setkomavar{placeseparator}{$placeseparator$}$endif$ -$if(title)$\setkomavar{title}{$title$}$endif$ -$if(toaddress)$\setkomavar{toaddress}{$toaddress$}\KOMAoptions{toaddress=true}$endif$ -$if(toname)$\setkomavar{toname}{$toname$}\KOMAoptions{toname=true}$endif$ -$if(yourmail)$\setkomavar{yourmail}{$yourmail$}$endif$ -$if(yourref)$\setkomavar{yourref}{$yourref$}$endif$ -$if(zipcodeseparator)$\setkomavar{zipcodeseparator}{$zipcodeseparator$}$endif$ -$if(enclseparator)$\setkomavar{enclseparator}{$enclseparator$}$endif$ -$if(fromalign)$\KOMAoptions{fromalign=$fromalign$}$endif$ -$if(customername)$\setkomavar*{customer}{$customername$}$endif$ -% $if(datename)$\setkomavar*{date}{$datename$}$endif$ -$if(invoicename)$\setkomavar*{invoice}{$invoicename$}$endif$ -$if(myrefname)$\setkomavar*{myref}{$myrefname$}$endif$ -$if(yourmailname)$\setkomavar*{yourmail}{$yourmailname$}$endif$ -$if(yourrefname)$\setkomavar*{yourref}{$yourrefname$}$endif$ -$if(opening)$\setkomavar{opening}{$opening$}$endif$ -$if(closing)$\setkomavar{closing}{$closing$}$endif$ -$if(enclseparator)$\setkomavar*{enclseparator}{$enclseparator$}$endif$ -% END OVERRIDES - -\begin{document} -$if(has-frontmatter)$ -\frontmatter -$endif$ -$if(title)$ -$if(beamer)$ -\frame{\titlepage} -$else$ -\maketitle -$endif$ -$if(abstract)$ -\begin{abstract} -$abstract$ -\end{abstract} -$endif$ -$endif$ - -$for(include-before)$ -$include-before$ - -$endfor$ -$if(toc)$ -$if(toc-title)$ -\renewcommand*\contentsname{$toc-title$} -$endif$ -$if(beamer)$ -\begin{frame}[allowframebreaks] -$if(toc-title)$ - \frametitle{$toc-title$} -$endif$ - \tableofcontents[hideallsubsections] -\end{frame} -$else$ -{ -$if(colorlinks)$ -\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$} -$endif$ -\setcounter{tocdepth}{$toc-depth$} -\tableofcontents -} -$endif$ -$endif$ -$if(lof)$ -\listoffigures -$endif$ -$if(lot)$ -\listoftables -$endif$ -$if(linestretch)$ -\setstretch{$linestretch$} -$endif$ -$if(has-frontmatter)$ -\mainmatter -$endif$ - -% OVERRIDES -\begin{letter}{% -$sendto$ -} -\opening{\usekomavar{opening}} -% END OVERRIDES -$body$ -% OVERRIDES -\closing{\usekomavar{closing}} -$if(ps)$\ps{$ps$}$endif$ -$if(encl)$\encl{$encl$}$endif$ -% END OVERRIDES - -$if(has-frontmatter)$ -\backmatter -$endif$ -$if(natbib)$ -$if(bibliography)$ -$if(biblio-title)$ -$if(has-chapters)$ -\renewcommand\bibname{$biblio-title$} -$else$ -\renewcommand\refname{$biblio-title$} -$endif$ -$endif$ -$if(beamer)$ -\begin{frame}[allowframebreaks]{$biblio-title$} - \bibliographytrue -$endif$ - \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} -$if(beamer)$ -\end{frame} -$endif$ - -$endif$ -$endif$ -$if(biblatex)$ -$if(beamer)$ -\begin{frame}[allowframebreaks]{$biblio-title$} - \bibliographytrue - \printbibliography[heading=none] -\end{frame} -$else$ -\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ -$endif$ - -$endif$ -$for(include-after)$ -$include-after$ - -$endfor$ -% OVERRIDES -$if(cc)$ -\cc{$cc$} -$endif$ -\end{letter} -% END OVERRIDES -\end{document} From 3181a18b8cb62bbb99e42809fb121031746659b7 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 26 Sep 2024 11:14:16 +0200 Subject: [PATCH 22/61] Update Makefile for typst --- Makefile | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 49166a6..de980ec 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,14 @@ -.PHONY: clean +.PHONY: clean all -all: resume_*.qmd templates/jb2resume.latex letter.qmd templates/letter.latex - poetry run quarto render +all: clean cv resume letter -cv: resume_de.qmd resume_en.qmd templates/jb2resume.latex - poetry run quarto render resume_de.qmd resume_en.qmd +cv: cv.typ + typst compile --input lang=en cv.typ build/cv_en.pdf + typst compile --input lang=de cv.typ build/cv_de.pdf + +resume: resume.typ + typst compile --input lang=en resume.typ build/resume_en.pdf + typst compile --input lang=de resume.typ build/resume_de.pdf letter: letter.qmd templates/letter.latex poetry run quarto render letter.qmd From 4b63eed9e44330acd7b7c585d26ab004f04b29b5 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 26 Sep 2024 11:15:01 +0200 Subject: [PATCH 23/61] Update skills order, job capitalizations --- content.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content.yml b/content.yml index a02f5fe..c862e1a 100644 --- a/content.yml +++ b/content.yml @@ -180,8 +180,8 @@ experience: de: 2021 en: 2021 title: - de: Forschungsassistenz, informelle Organisierung und Absicherung - en: Research Assistant, informal organization and social security + de: Forschungsassistenz, Informelle Organisierung und Absicherung + en: Research Assistant, Informal Organization and Social Security place: de: Universität Roskilde en: Roskilde University @@ -199,8 +199,8 @@ experience: de: 2021 en: 2021 title: - de: Redaktionsassistenz, SPIWORK-Projekt - en: Editorial Assistant, SPIWORK Project + de: Redakteur, Soziale Absicherung informeller Arbeiter (SPIWORK) + en: Editorial Assistant, Social Protection of Informal Workers (SPIWORK) place: de: Universität Roskilde en: Roskilde University @@ -377,6 +377,16 @@ volunteering: en: IT and event management services skills: + - name: + de: Office-Suite + en: Office suite + items: + - de: Excel + en: Excel + - de: Word + en: Word + - de: Access + en: Access - name: de: Autorensoftware en: Authoring software @@ -427,16 +437,6 @@ skills: en: Jujutsu - de: Fossil en: Fossil - - name: - de: Office-Suite - en: Office suite - items: - - de: Excel - en: Excel - - de: Word - en: Word - - de: Access - en: Access - name: de: Web Content Management en: Web content management @@ -447,8 +447,8 @@ skills: en: Hugo - de: Flask en: Flask - - de: Astro - en: Astro + # - de: Astro + # en: Astro - de: HTML en: HTML - de: CSS From 6f5d5ee378da8af615daf44cb6e835a8658026db Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Thu, 26 Sep 2024 11:15:30 +0200 Subject: [PATCH 24/61] Add bottom sidebar margin --- resume.typ | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resume.typ b/resume.typ index 0d51e04..6babff7 100644 --- a/resume.typ +++ b/resume.typ @@ -271,7 +271,7 @@ }), align(right, block(fill: luma(250), width: 90%, { - v(20pt) + v(15pt) set block(inset: (left: 20 * margin, right: 20 * margin)) show heading: it => align(right, upper(it)) set list(marker: "") @@ -280,6 +280,7 @@ align(right, block(it)) } sidebar + v(15pt) })) ) From 9d4c195ce9dc22b6b56accdb7c915cc7dbc70857 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 09:59:42 +0100 Subject: [PATCH 25/61] Fix spelling issue --- content.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content.yml b/content.yml index c862e1a..b9d98ec 100644 --- a/content.yml +++ b/content.yml @@ -26,7 +26,7 @@ summary: en: | Since completing the EU-funded European Master of Global Studies Erasmus Mundus programme in 2021, I have acted as a research consultant focused on processes of inequality and poverty reduction, spatialization and collective organization, primarily through the lens of labour market policies. - Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. Additionally, I have gained insights into event management, teaching assistance, content creation, system administration and website management. Beyond professional work I foster the development of free and open software and open science without barriers. + Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. Additionally, I have gained insights into event management, teaching assistance, content creation, system and web administration. Beyond professional work I strive to foster the development of free and open software and open science without barriers. I welcome opportunities to deepen my expertise in these topics, in addition to those expanding my range of applicable skills. @@ -55,7 +55,7 @@ experience: en: 2023--2024 title: de: Externer Forscher, Ungleichheiten auf dem Arbeitsmarkt - en: External researcher, Inequalities on the Labour market + en: External researcher, Inequalities on the labour market place: de: ILO en: ILO From 1ea7afdaa5c2dd9b5f5e193c53d3656ee5003822 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 10:00:25 +0100 Subject: [PATCH 26/61] Fix page counter for typst update --- cv.typ | 2 +- resume.typ | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cv.typ b/cv.typ index 89bb34c..b56bc08 100644 --- a/cv.typ +++ b/cv.typ @@ -156,7 +156,7 @@ ][ #smallcaps[#contents.about.fullname] ][ - #counter(page).display() + #context counter(page).display() ] ], ) diff --git a/resume.typ b/resume.typ index 6babff7..f878a17 100644 --- a/resume.typ +++ b/resume.typ @@ -174,7 +174,7 @@ ][ #smallcaps[#contents.about.fullname] ][ - #counter(page).display() + #context counter(page).display() ] ], ) From 484ea7512eca1d2d48a0a3f47406f87fc4650037 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 10:01:13 +0100 Subject: [PATCH 27/61] Update Makefile for typst letter --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index de980ec..365449f 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,9 @@ resume: resume.typ typst compile --input lang=en resume.typ build/resume_en.pdf typst compile --input lang=de resume.typ build/resume_de.pdf -letter: letter.qmd templates/letter.latex - poetry run quarto render letter.qmd +letter: letter.typ + typst compile --input lang=en letter.typ build/letter_en.pdf + typst compile --input lang=de letter.typ build/letter_de.pdf clean: rm -f *CV.aux *CV.bcf *CV.log *CV.out *CV.run.xml *CV.pdf short_CV.tex long_CV.tex *CV.bbl *CV.blg *yaml_CV.md From a81276f89bfbff2f3ceb9f5620f13a36c608708c Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:06:17 +0100 Subject: [PATCH 28/61] Add separation by experience type --- resume.typ | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/resume.typ b/resume.typ index f878a17..9c006fd 100644 --- a/resume.typ +++ b/resume.typ @@ -59,14 +59,16 @@ block(inset: 5%, width: 85%, text(fill:luma(150), body)) } -#let freelance_by_client(experience:()) = { +#let by_client(experience:()) = { let by_client = (:) + for item in experience { let client = item.place.at(lang) if client not in by_client { by_client.insert(client, ()) + } - by_client.at(client).push((item.title.at(lang), item.date.at(lang) )) + by_client.at(client).push( (item.title.at(lang), item.date.at(lang)) ) } for (client, jobs) in by_client { @@ -77,6 +79,23 @@ } } +#let by_experience_type(type:(), experience:()) = { + let by_ty = (:) + for (id, desc) in type { + let matching_exp_items = (); + // for item in experience { + // [itemtypeid: #item.typeid, id: #id] + // if item.typeid == id { + // matching_exp_items.push(item) + // } + // } + let matching_exp_items = experience.filter(item => + int(item.typeid) == int(id)) + [=== _#desc.at(lang)_] + by_client(experience: matching_exp_items) + } +} + #let entry(item: ()) = { if "title" in item { [*#item.title.at(lang)*] @@ -193,8 +212,7 @@ if "experience" in contents { let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") section(title: title)[] - freelance_by_client(experience:contents.experience) - + by_experience_type(experience: contents.experience, type: contents.experience_types) } if "education" in contents { @@ -229,7 +247,7 @@ for e in contents.volunteering { [ - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ + #par(e.bullets.at(0).at(lang)) \ ] } } From 03acad7a44f0e06b2201d13910a7d556626cd5b9 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:07:14 +0100 Subject: [PATCH 29/61] Add experience types to data --- content.yml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/content.yml b/content.yml index b9d98ec..7c5889f 100644 --- a/content.yml +++ b/content.yml @@ -30,8 +30,17 @@ summary: I welcome opportunities to deepen my expertise in these topics, in addition to those expanding my range of applicable skills. +experience_types: + 1: + de: Selbstständiger Schriftsteller Forschung + en: Independent research consultant + 2: + de: Honorararbeit + en: Salaried work + experience: - - date: + - typeid: 1 + date: de: 2024 en: 2024 title: @@ -53,6 +62,7 @@ experience: - date: de: 2023--2024 en: 2023--2024 + typeid: 1 title: de: Externer Forscher, Ungleichheiten auf dem Arbeitsmarkt en: External researcher, Inequalities on the labour market @@ -72,6 +82,7 @@ experience: - date: de: 2023 en: 2023 + typeid: 1 title: de: Consultant, Forschungsarbeit für nachhaltige Beschaffung in internationaler Logistik en: Consultant, Research on sustainable procurement in international logistics @@ -88,6 +99,7 @@ experience: - date: de: 2022 en: 2022 + typeid: 1 title: de: Consultant, Datenbankforschung internationale Hilfsgelder en: Consultant, Database research international aid funds @@ -104,6 +116,7 @@ experience: - date: de: 2022 en: 2022 + typeid: 1 title: de: Redaktionsarbeit, Soziale Absicherung und Widerstandsfähigkeit en: Editorial work, Social Protection and Resilience, Roskilde University @@ -123,6 +136,7 @@ experience: - date: de: 2022 en: 2022 + typeid: 1 title: de: Forschungsassistenz, Entwicklungsprojekte zur Reduzierung Ungleichheitstrends en: Research Assistant, Development projects to reduce inequality trends @@ -143,6 +157,7 @@ experience: - date: de: 2022 en: 2022 + typeid: 1 title: de: Consultant, Review Verknüpfung sozialer Schutz, Produktivität und Formalisierung en: Consultant, Social Protection, Productivity and Formalization Nexus Review @@ -162,6 +177,7 @@ experience: - date: de: 2022 en: 2022 + typeid: 1 title: de: Consultant, Review Arbeitsmarktpolitiken in Asien und dem Pazifik en: Consultant, Labour Market Policies Review in Asia and the Pacific @@ -179,6 +195,7 @@ experience: - date: de: 2021 en: 2021 + typeid: 1 title: de: Forschungsassistenz, Informelle Organisierung und Absicherung en: Research Assistant, Informal Organization and Social Security @@ -198,6 +215,7 @@ experience: - date: de: 2021 en: 2021 + typeid: 1 title: de: Redakteur, Soziale Absicherung informeller Arbeiter (SPIWORK) en: Editorial Assistant, Social Protection of Informal Workers (SPIWORK) @@ -217,6 +235,7 @@ experience: - date: de: 2018--2019 en: 2018--2019 + typeid: 2 title: de: Akademische Hilfskraft, Institut für Amerikastudien en: Academic Assistant, Institute of American Studies @@ -233,6 +252,7 @@ experience: - date: de: 2017--2019 en: 2017--2019 + typeid: 2 title: de: Studentische Hilfskraft, Professor Crister S. Garrett en: Student Assistant, Professor Crister S. Garrett @@ -249,6 +269,7 @@ experience: - date: de: 2018 en: 2018 + typeid: 2 title: de: Lehrassistenz, Transatlantische Sommerschule Cultures of Security en: Teaching Assistant, Trans Atlantic Summer School Cultures of Security @@ -265,6 +286,7 @@ experience: - date: de: 2017--2018 en: 2017--2018 + typeid: 2 title: de: Content-Management, Bachelor Plus/Alumni-System en: Content Management, Bachelor Plus/Alumni System @@ -281,6 +303,7 @@ experience: - date: de: 2014--2018 en: 2014--2018 + typeid: 2 title: de: Verkaufsassistent und Eventhelfer für historische Märkte en: Sales Assistant and Event Support for Historical Markets From cfa3e8a625a7d7659ec6fb536eade332a6a062f3 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:27:42 +0100 Subject: [PATCH 30/61] Allow manually overriding main or sidebar sections --- README.md | 45 ++++++++++++++++++++++++++++++++++++++++ resume.typ | 61 +++++++++++++++++++++++++++--------------------------- 2 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae62ba2 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# Data-driven CV & resume + +My personal CV and resume files, automatically generated from a multi-lingual +yaml data file. + +The CV contains a full run-down of my educational and job experience to date, +while the resume is more compact, reduced to a single page +and can be tailored for a specific job area or expertise. + +Is called like the following: + +```typst +#resume( + yaml("content.yml"), + main: ("experience", "education", "volunteering", "skills", "languages"), + sidebar: ("volunteering", "skills") +) +``` + +This is the default invocation, though sidebar and main body sections can be exchanged at will. + +TODO: + +- [x] move double-resume sources (per langauge) to a variable or similar +- [x] separate volunteering from skills section +- [_] one function per skill section +- [_] resume prep: + - [ ] make experience groupable by client / short version + - [ ] enable display/hiding of sections/entries by tags? + +- [x] migrate to typst template? +- [x] ! Fix german summary to be like English summary +- [_] generalized entry? + Would have 'title', 'place', 'date', 'type'/'tags' + potential + 'publication', 'bullets' + +## Typst-driven branch + +- [x] Fix publication '\&'s +- [x] Fix en-dash/em-dash (e.g. in years) +- [x] Producable from yaml content +- [x] Can be switched between Ger/En +- [x] Try sidebar version + - [ ] Generalize sidebar version through abstraction/extractions +- [ ] unify items: experience/education/(thesis?) diff --git a/resume.typ b/resume.typ index 9c006fd..ce523d0 100644 --- a/resume.typ +++ b/resume.typ @@ -170,7 +170,7 @@ } } -#let resume(contents) = { +#let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { set text(lang: lang) let date_formatting = { @@ -203,48 +203,48 @@ header(contents.about) let body = { -// if "summary" in contents { -// section(title:"", { -// contents.summary.at(lang) -// }) -// }; + if "summary" in main and "summary" in contents { + section(title:"", { + contents.summary.at(lang) + }) + } - if "experience" in contents { + if "experience" in main and "experience" in contents { let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") section(title: title)[] by_experience_type(experience: contents.experience, type: contents.experience_types) } - if "education" in contents { + if "education" in main and "education" in contents { let title = sel_word_lang(en:"Education", de:"Ausbildung") section(title: title, entries:contents.thesis + contents.education)[] } -// if "volunteering" in contents { -// let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") -// section(title: title, entries:contents.volunteering)[] -// } -// -// if "skills" in contents { -// let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") -// section(title: title, { -// skill_item(item:contents.skills) -// }) -// } -// -// if "languages" in contents { -// let title = sel_word_lang(en:"Languages", de:"Sprachen") -// section(title: title, { -// skill_item(item:contents.languages) -// }) -// } + if "volunteering" in main and "volunteering" in contents { + let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") + section(title: title, entries:contents.volunteering)[] + } + + if "skills" in main and "skills" in contents { + let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") + section(title: title, { + skill_item(item:contents.skills) + }) + } + + if "languages" in main and "languages" in contents { + let title = sel_word_lang(en:"Languages", de:"Sprachen") + section(title: title, { + skill_item(item:contents.languages) + }) + } } let sidebar = { - if "volunteering" in contents { + if "volunteering" in sidebar and "volunteering" in contents { let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") [== #title] - for e in contents.volunteering { + for e in contents.at("volunteering") { [ - *#e.title.at(lang)* (#e.date.at(lang)) #par(e.bullets.at(0).at(lang)) \ @@ -252,14 +252,14 @@ } } - if "languages" in contents { + if "languages" in sidebar and "languages" in contents { let title = sel_word_lang(en:"Languages", de:"Sprachen") [== #title] skill_item(item:contents.languages, is_sidebar: true) [\ ] } - if "skills" in contents { + if "skills" in sidebar and "skills" in contents { let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse") [== #title] skill_item(item:contents.skills, is_sidebar: true) @@ -307,4 +307,3 @@ #resume( yaml("content.yml") ) - From 64dffb43d659439d0ea9ba2ac94bd25c0554957a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:29:21 +0100 Subject: [PATCH 31/61] Fix english spellink HTWK country --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 7c5889f..0086afc 100644 --- a/content.yml +++ b/content.yml @@ -348,7 +348,7 @@ education: en: 2018 - place: de: HTWK Leipzig, Deutschland - en: HTWK Leipzig, Deutschland + en: HTWK Leipzig, Germany title: de: Medieninformatik, BSc (nicht abgeschlossen) en: Media Computer Science, BSc (not completed) From 18df7051e7b054e24f1ff5a747293978b625e2f7 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:30:12 +0100 Subject: [PATCH 32/61] Format with typstyle --- cv.typ | 444 +++++++++++++++++++++++++----------------------- resume.typ | 486 ++++++++++++++++++++++++++++------------------------- 2 files changed, 491 insertions(+), 439 deletions(-) diff --git a/cv.typ b/cv.typ index b56bc08..518cd71 100644 --- a/cv.typ +++ b/cv.typ @@ -11,266 +11,290 @@ // $ typst compile --input lang=de cv.typ // #let lang = { - if "lang" in sys.inputs and sys.inputs.lang == "de" { - "de" - } else { - "en" - } + if "lang" in sys.inputs and sys.inputs.lang == "de" { + "de" + } else { + "en" + } } -#let sel_word_lang(de: "", en:"") = { - if lang == "de" { - de - } else { - en - } +#let sel_word_lang(de: "", en: "") = { + if lang == "de" { + de + } else { + en + } } #let _columns_3(left_body, center_body, right_body) = { - block[ - #box(width: 1fr)[ - #align(left)[#left_body] - ] - #box(width: 1fr)[ - #align(center)[#center_body] - ] - #box(width: 1fr)[ - #align(right)[#right_body] - ] + block[ + #box(width: 1fr)[ + #align(left)[#left_body] ] + #box(width: 1fr)[ + #align(center)[#center_body] + ] + #box(width: 1fr)[ + #align(right)[#right_body] + ] + ] } #let header(about, columns: (1.5fr, 1fr, 1fr)) = { - [= #about.fullname]; - let contact_fields = (for c in about.contact { - if "link" in c { - ([#c.icon ~ #link(c.link)[#c.text]],) - } else { - ([#c.icon ~ #c.text],) - } - }) - grid( - columns: columns, - gutter: 5pt, - ..contact_fields - ); + [= #about.fullname] + let contact_fields = ( + for c in about.contact { + if "link" in c { + ([#c.icon ~ #link(c.link)[#c.text]],) + } else { + ([#c.icon ~ #c.text],) + } + } + ) + grid( + columns: columns, + gutter: 5pt, + ..contact_fields + ) } #let subdued(body) = { - block(inset: 5%, width: 85%, text(fill:luma(150), body)) + block(inset: 5%, width: 85%, text(fill: luma(150), body)) } #let entry(item: ()) = { + if "title" in item { + [*#item.title.at(lang)*] + } + if "place" in item { if "title" in item { - [*#item.title.at(lang)*] + [, ] } - if "place" in item { - if "title" in item { - [, ] - } - [_#item.place.at(lang)_] - } - [#h(1fr)] - if "date" in item { - [ _#item.date.at(lang)_ \ ] - } - if "bullets" in item { - for bullet in item.bullets { - [- #bullet.at(lang)] - } - } - if "publication" in item { - subdued[#item.publication.at(lang) \ ] - }; - if "abstract" in item { - subdued[#item.abstract.at(lang) \ ] + [_#item.place.at(lang)_] + } + [#h(1fr)] + if "date" in item { + [ _#item.date.at(lang)_ \ ] + } + if "bullets" in item { + for bullet in item.bullets { + [- #bullet.at(lang)] } + } + if "publication" in item { + subdued[#item.publication.at(lang) \ ] + } + if "abstract" in item { + subdued[#item.abstract.at(lang) \ ] + } } -#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} +#let horizon_line() = { + v(-3pt) + line(length: 100%) + v(-5pt) +} -#let section_header(title) = {[== #title]; horizon_line()}; +#let section_header(title) = { + [== #title] + horizon_line() +}; #let section(title: "Section", entries: (), body) = { - section_header(title); - if body == none or body == [] { - for e in entries { - entry(item:e) - } - } else { - body + section_header(title) + if body == none or body == [] { + for e in entries { + entry(item: e) } + } else { + body + } }; // Slightly re-styled entry with PLACE first and TITLE second #let education_entry(item: ()) = { - assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date."); - [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)]; - [ _#item.date.at(lang)_ \ ]; + assert( + "place" in item and "title" in item and "date" in item, + message: "Education items require place, program and date.", + ) + [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)] + [ _#item.date.at(lang)_ \ ] } // Restyled entry with PLACE not emphasized like usual, and no date but an abstract #let thesis_entry(item: ()) = { - assert("title" in item and "place" in item, message: "Thesis items require type and title."); - [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)]; - [#par(item.abstract.at(lang))] + assert("title" in item and "place" in item, message: "Thesis items require type and title.") + [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] + [#par(item.abstract.at(lang))] } // skill-specific entry, changing its style for sidebar #let skill_item(item: (), is_sidebar: false) = { - let side_list(body) = if is_sidebar {list(body)} else {par(body)} - for skill in item { - side_list({ - [*#skill.name.at(lang)*] - if is_sidebar [\ ] else [ (] - for (i,v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] - } - } - if not is_sidebar [)] - }) - } + let side_list(body) = if is_sidebar { list(body) } else { par(body) } + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i, v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + if not is_sidebar [)] + }) + } } #let cv(contents, use_sidebar: false) = { - set text(lang: lang) + set text(lang: lang) - let date_formatting = { - if lang == "de" { - "[day]. [month repr:long] [year]" - } else { - "[month repr:long] [day], [year]" - } + let date_formatting = { + if lang == "de" { + "[day]. [month repr:long] [year]" + } else { + "[month repr:long] [day], [year]" } - set page( - paper: "a4", - margin: (x: 0.9cm, y: 1.3cm), - footer: [ - #set text( - fill: luma(200), - size: 8pt, - ) - #_columns_3[ - #smallcaps[#datetime.today().display(date_formatting)] - ][ - #smallcaps[#contents.about.fullname] - ][ - #context counter(page).display() - ] - ], - ) + } + set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display(date_formatting)] + ][ + #smallcaps[#contents.about.fullname] + ][ + #context counter(page).display() + ] + ], + ) - set par(justify: true) + set par(justify: true) - header(contents.about) + header(contents.about) - let body = { - if "summary" in contents { - section(title:"", { - contents.summary.at(lang) - }) - }; - - if "experience" in contents { - let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") - section(title: title, entries:contents.experience)[] - } - - if "education" in contents { - let title = sel_word_lang(en:"Education", de:"Ausbildung") - section(title: title, entries:contents.thesis + contents.education)[] - } - - if not use_sidebar { - if "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - section(title: title, entries:contents.volunteering)[] - } - - if "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") - section(title: title, { - skill_item(item:contents.skills) - }) - } - - if "languages" in contents { - let title = sel_word_lang(en:"Languages", de:"Sprachen") - section(title: title, { - skill_item(item:contents.languages) - }) - } - } + let body = { + if "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) } - let sidebar = { - if "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - [== #title] - for e in contents.volunteering { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } - } + if "experience" in contents { + let title = sel_word_lang(en: "Professional Experience", de: "Berufserfahrung") + section(title: title, entries: contents.experience)[] + } - if "languages" in contents { - let title = sel_word_lang(en:"Languages", de:"Sprachen") - [== #title] - skill_item(item:contents.languages, is_sidebar: true) - [\ ] - } - - if "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse") - [== #title] - skill_item(item:contents.skills, is_sidebar: true) - } + if "education" in contents { + let title = sel_word_lang(en: "Education", de: "Ausbildung") + section(title: title, entries: contents.thesis + contents.education)[] } if not use_sidebar { - body - return - } - let margin = 1pt - grid( - columns: (2fr, 1fr), - block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, { - set block(above: 10pt) - show heading.where(level: 1): it => style(s => { - let h = text(size: 18pt, upper(it)) - let dim = measure(h, s) - stack( - dir: ltr, - h, - place( - dy: 7pt, - dx: 10pt, - horizon + left, - line(stroke: accent-color, length: 100% - dim.width - 10pt) - ), - ) - }) - body - }), - { - v(20pt) - set block(inset: (left: 20 * margin, right: 20 * margin)) - show heading: it => align(right, upper(it)) - set list(marker: "") - show list: it => { - set par(justify: false) - align(right, block(it)) - } - sidebar - } - ) + if "volunteering" in contents { + let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + section(title: title, entries: contents.volunteering)[] + } + if "skills" in contents { + let title = sel_word_lang(en: "Qualifications", de: "Qualifikationen") + section( + title: title, + { + skill_item(item: contents.skills) + }, + ) + } + + if "languages" in contents { + let title = sel_word_lang(en: "Languages", de: "Sprachen") + section( + title: title, + { + skill_item(item: contents.languages) + }, + ) + } + } + } + + let sidebar = { + if "volunteering" in contents { + let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + [== #title] + for e in contents.volunteering { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } + } + + if "languages" in contents { + let title = sel_word_lang(en: "Languages", de: "Sprachen") + [== #title] + skill_item(item: contents.languages, is_sidebar: true) + [\ ] + } + + if "skills" in contents { + let title = sel_word_lang(en: "Qualifications", de: "Kenntnisse") + [== #title] + skill_item(item: contents.skills, is_sidebar: true) + } + } + + if not use_sidebar { + body + return + } + let margin = 1pt + grid( + columns: (2fr, 1fr), + block( + outset: 0pt, + inset: (top: 0.4 * margin, right: 0pt, rest: margin), + stroke: none, + width: 100%, + { + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt), + ), + ) + }) + body + }, + ), + { + v(20pt) + set block(inset: (left: 20 * margin, right: 20 * margin)) + show heading: it => align(right, upper(it)) + set list(marker: "") + show list: it => { + set par(justify: false) + align(right, block(it)) + } + sidebar + }, + ) } -#cv.with(use_sidebar: false)( - yaml("content.yml") -) +#cv.with(use_sidebar: false)(yaml("content.yml")) diff --git a/resume.typ b/resume.typ index ce523d0..27938a0 100644 --- a/resume.typ +++ b/resume.typ @@ -11,283 +11,312 @@ // $ typst compile --input lang=de cv.typ // #let lang = { - if "lang" in sys.inputs and sys.inputs.lang == "de" { - "de" - } else { - "en" - } + if "lang" in sys.inputs and sys.inputs.lang == "de" { + "de" + } else { + "en" + } } -#let sel_word_lang(de: "", en:"") = { - if lang == "de" { - de - } else { - en - } +#let sel_word_lang(de: "", en: "") = { + if lang == "de" { + de + } else { + en + } } #let _columns_3(left_body, center_body, right_body) = { - block[ - #box(width: 1fr)[ - #align(left)[#left_body] - ] - #box(width: 1fr)[ - #align(center)[#center_body] - ] - #box(width: 1fr)[ - #align(right)[#right_body] - ] + block[ + #box(width: 1fr)[ + #align(left)[#left_body] ] + #box(width: 1fr)[ + #align(center)[#center_body] + ] + #box(width: 1fr)[ + #align(right)[#right_body] + ] + ] } #let header(about, columns: (1.5fr, 1fr, 1fr)) = { - [= #about.fullname]; - let contact_fields = (for c in about.contact { - if "link" in c { - ([#c.icon ~ #link(c.link)[#c.text]],) - } else { - ([#c.icon ~ #c.text],) - } - }) - grid( - columns: columns, - gutter: 5pt, - ..contact_fields - ); + [= #about.fullname] + let contact_fields = ( + for c in about.contact { + if "link" in c { + ([#c.icon ~ #link(c.link)[#c.text]],) + } else { + ([#c.icon ~ #c.text],) + } + } + ) + grid( + columns: columns, + gutter: 5pt, + ..contact_fields + ) } #let subdued(body) = { - block(inset: 5%, width: 85%, text(fill:luma(150), body)) + block(inset: 5%, width: 85%, text(fill: luma(150), body)) } -#let by_client(experience:()) = { - let by_client = (:) +#let by_client(experience: ()) = { + let by_client = (:) - for item in experience { - let client = item.place.at(lang) - if client not in by_client { - by_client.insert(client, ()) - - } - by_client.at(client).push( (item.title.at(lang), item.date.at(lang)) ) + for item in experience { + let client = item.place.at(lang) + if client not in by_client { + by_client.insert(client, ()) } + by_client.at(client).push((item.title.at(lang), item.date.at(lang))) + } - for (client, jobs) in by_client { - [*#client*:] - for j in jobs { - [- #j.at(0) #h(1fr) #j.at(1)] - } + for (client, jobs) in by_client { + [*#client*:] + for j in jobs { + [- #j.at(0) #h(1fr) #j.at(1)] } + } } -#let by_experience_type(type:(), experience:()) = { - let by_ty = (:) - for (id, desc) in type { - let matching_exp_items = (); - // for item in experience { - // [itemtypeid: #item.typeid, id: #id] - // if item.typeid == id { - // matching_exp_items.push(item) - // } - // } - let matching_exp_items = experience.filter(item => - int(item.typeid) == int(id)) - [=== _#desc.at(lang)_] - by_client(experience: matching_exp_items) - } +#let by_experience_type(type: (), experience: ()) = { + let by_ty = (:) + for (id, desc) in type { + let matching_exp_items = () + // for item in experience { + // [itemtypeid: #item.typeid, id: #id] + // if item.typeid == id { + // matching_exp_items.push(item) + // } + // } + let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) + [=== _#desc.at(lang)_] + by_client(experience: matching_exp_items) + } } #let entry(item: ()) = { + if "title" in item { + [*#item.title.at(lang)*] + } + if "place" in item { if "title" in item { - [*#item.title.at(lang)*] + [, ] } - if "place" in item { - if "title" in item { - [, ] - } - [_#item.place.at(lang)_] - } - [#h(1fr)] - if "date" in item { - [ _#item.date.at(lang)_ \ ] - } - if "bullets" in item { - for bullet in item.bullets { - [- #bullet.at(lang)] - } - } - if "publication" in item { - subdued[#item.publication.at(lang) \ ] - }; - if "abstract" in item { - subdued[#item.abstract.at(lang) \ ] + [_#item.place.at(lang)_] + } + [#h(1fr)] + if "date" in item { + [ _#item.date.at(lang)_ \ ] + } + if "bullets" in item { + for bullet in item.bullets { + [- #bullet.at(lang)] } + } + if "publication" in item { + subdued[#item.publication.at(lang) \ ] + } + if "abstract" in item { + subdued[#item.abstract.at(lang) \ ] + } } -#let horizon_line() = {v(-3pt); line(length: 100%); v(-5pt)} +#let horizon_line() = { + v(-3pt) + line(length: 100%) + v(-5pt) +} -#let section_header(title) = {[== #title]; horizon_line()}; +#let section_header(title) = { + [== #title] + horizon_line() +}; #let section(title: "Section", entries: (), body) = { - section_header(title); - if body == none or body == [] { - for e in entries { - entry(item:e) - } - } else { - body + section_header(title) + if body == none or body == [] { + for e in entries { + entry(item: e) } + } else { + body + } }; // Slightly re-styled entry with PLACE first and TITLE second #let education_entry(item: ()) = { - assert("place" in item and "title" in item and "date" in item, message: "Education items require place, program and date."); - [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)]; - [ _#item.date.at(lang)_ \ ]; + assert( + "place" in item and "title" in item and "date" in item, + message: "Education items require place, program and date.", + ) + [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)] + [ _#item.date.at(lang)_ \ ] } // Restyled entry with PLACE not emphasized like usual, and no date but an abstract #let thesis_entry(item: ()) = { - assert("title" in item and "place" in item, message: "Thesis items require type and title."); - [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)]; - [#par(item.abstract.at(lang))] + assert("title" in item and "place" in item, message: "Thesis items require type and title.") + [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] + [#par(item.abstract.at(lang))] } // skill-specific entry, changing its style for sidebar #let skill_item(item: (), is_sidebar: false) = { - let side_list(body) = if is_sidebar {list(body)} else {par(body)} - for skill in item { - side_list({ - [*#skill.name.at(lang)*] - if is_sidebar [\ ] else [ (] - for (i,v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] - } - } - if not is_sidebar [)] - }) - } + let side_list(body) = if is_sidebar { list(body) } else { par(body) } + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i, v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + if not is_sidebar [)] + }) + } } #let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { - set text(lang: lang) + set text(lang: lang) - let date_formatting = { - if lang == "de" { - "[day]. [month repr:long] [year]" - } else { - "[month repr:long] [day], [year]" - } + let date_formatting = { + if lang == "de" { + "[day]. [month repr:long] [year]" + } else { + "[month repr:long] [day], [year]" } - set page( - paper: "a4", - margin: (x: 0.9cm, y: 1.3cm), - footer: [ - #set text( - fill: luma(200), - size: 8pt, - ) - #_columns_3[ - #smallcaps[#datetime.today().display(date_formatting)] - ][ - #smallcaps[#contents.about.fullname] - ][ - #context counter(page).display() - ] - ], - ) + } + set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display(date_formatting)] + ][ + #smallcaps[#contents.about.fullname] + ][ + #context counter(page).display() + ] + ], + ) - set par(justify: true) + set par(justify: true) - header(contents.about) + header(contents.about) - let body = { - if "summary" in main and "summary" in contents { - section(title:"", { - contents.summary.at(lang) - }) - } - - if "experience" in main and "experience" in contents { - let title = sel_word_lang(en:"Professional Experience", de:"Berufserfahrung") - section(title: title)[] - by_experience_type(experience: contents.experience, type: contents.experience_types) - } - - if "education" in main and "education" in contents { - let title = sel_word_lang(en:"Education", de:"Ausbildung") - section(title: title, entries:contents.thesis + contents.education)[] - } - - if "volunteering" in main and "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - section(title: title, entries:contents.volunteering)[] - } - - if "skills" in main and "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Qualifikationen") - section(title: title, { - skill_item(item:contents.skills) - }) - } - - if "languages" in main and "languages" in contents { - let title = sel_word_lang(en:"Languages", de:"Sprachen") - section(title: title, { - skill_item(item:contents.languages) - }) - } + let body = { + if "summary" in main and "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) } - let sidebar = { - if "volunteering" in sidebar and "volunteering" in contents { - let title = sel_word_lang(en:"Volunteer Work", de:"Ehrenamt") - [== #title] - for e in contents.at("volunteering") { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } - } - - if "languages" in sidebar and "languages" in contents { - let title = sel_word_lang(en:"Languages", de:"Sprachen") - [== #title] - skill_item(item:contents.languages, is_sidebar: true) - [\ ] - } - - if "skills" in sidebar and "skills" in contents { - let title = sel_word_lang(en:"Qualifications", de:"Kenntnisse") - [== #title] - skill_item(item:contents.skills, is_sidebar: true) - } + if "experience" in main and "experience" in contents { + let title = sel_word_lang(en: "Professional Experience", de: "Berufserfahrung") + section(title: title)[] + by_experience_type(experience: contents.experience, type: contents.experience_types) } - let margin = 1pt - grid( - columns: (2fr, 1fr), - block(outset: 0pt, inset: (top: 0.4 * margin, right: 0pt, rest: margin), stroke: none, width: 100%, { - set block(above: 10pt) - show heading.where(level: 1): it => style(s => { - let h = text(size: 18pt, upper(it)) - let dim = measure(h, s) - stack( - dir: ltr, - h, - place( - dy: 7pt, - dx: 10pt, - horizon + left, - line(stroke: accent-color, length: 100% - dim.width - 10pt) - ), - ) - }) - body - }), - align(right, block(fill: luma(250), width: 90%, + if "education" in main and "education" in contents { + let title = sel_word_lang(en: "Education", de: "Ausbildung") + section(title: title, entries: contents.thesis + contents.education)[] + } + + if "volunteering" in main and "volunteering" in contents { + let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + section(title: title, entries: contents.volunteering)[] + } + + if "skills" in main and "skills" in contents { + let title = sel_word_lang(en: "Qualifications", de: "Qualifikationen") + section( + title: title, + { + skill_item(item: contents.skills) + }, + ) + } + + if "languages" in main and "languages" in contents { + let title = sel_word_lang(en: "Languages", de: "Sprachen") + section( + title: title, + { + skill_item(item: contents.languages) + }, + ) + } + } + + let sidebar = { + if "volunteering" in sidebar and "volunteering" in contents { + let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + [== #title] + for e in contents.at("volunteering") { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } + } + + if "languages" in sidebar and "languages" in contents { + let title = sel_word_lang(en: "Languages", de: "Sprachen") + [== #title] + skill_item(item: contents.languages, is_sidebar: true) + [\ ] + } + + if "skills" in sidebar and "skills" in contents { + let title = sel_word_lang(en: "Qualifications", de: "Kenntnisse") + [== #title] + skill_item(item: contents.skills, is_sidebar: true) + } + } + + let margin = 1pt + grid( + columns: (2fr, 1fr), + block( + outset: 0pt, + inset: (top: 0.4 * margin, right: 0pt, rest: margin), + stroke: none, + width: 100%, + { + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt), + ), + ) + }) + body + }, + ), + align( + right, + block( + fill: luma(250), + width: 90%, { v(15pt) set block(inset: (left: 20 * margin, right: 20 * margin)) @@ -297,13 +326,12 @@ set par(justify: false) align(right, block(it)) } - sidebar + sidebar v(15pt) - })) - ) - + }, + ), + ), + ) } -#resume( - yaml("content.yml") -) +#resume(yaml("content.yml")) From 0beef3934b28a0eb7019a6627a986599b944073b Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:39:28 +0100 Subject: [PATCH 33/61] Hide unused experience types --- resume.typ | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/resume.typ b/resume.typ index 27938a0..873fd28 100644 --- a/resume.typ +++ b/resume.typ @@ -83,14 +83,11 @@ #let by_experience_type(type: (), experience: ()) = { let by_ty = (:) for (id, desc) in type { - let matching_exp_items = () - // for item in experience { - // [itemtypeid: #item.typeid, id: #id] - // if item.typeid == id { - // matching_exp_items.push(item) - // } - // } let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) + if matching_exp_items.len() == 0 { + return + } + [=== _#desc.at(lang)_] by_client(experience: matching_exp_items) } From c36a5cde83ab3beb667e871264885b1d9fa0c3fd Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:39:43 +0100 Subject: [PATCH 34/61] Remove sel_word_lang function --- resume.typ | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/resume.typ b/resume.typ index 873fd28..6176dc6 100644 --- a/resume.typ +++ b/resume.typ @@ -17,13 +17,6 @@ "en" } } -#let sel_word_lang(de: "", en: "") = { - if lang == "de" { - de - } else { - en - } -} #let _columns_3(left_body, center_body, right_body) = { block[ @@ -220,23 +213,23 @@ } if "experience" in main and "experience" in contents { - let title = sel_word_lang(en: "Professional Experience", de: "Berufserfahrung") + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) section(title: title)[] by_experience_type(experience: contents.experience, type: contents.experience_types) } if "education" in main and "education" in contents { - let title = sel_word_lang(en: "Education", de: "Ausbildung") + let title = (en: "Education", de: "Ausbildung").at(lang) section(title: title, entries: contents.thesis + contents.education)[] } if "volunteering" in main and "volunteering" in contents { - let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) section(title: title, entries: contents.volunteering)[] } if "skills" in main and "skills" in contents { - let title = sel_word_lang(en: "Qualifications", de: "Qualifikationen") + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) section( title: title, { @@ -246,7 +239,7 @@ } if "languages" in main and "languages" in contents { - let title = sel_word_lang(en: "Languages", de: "Sprachen") + let title = (en: "Languages", de: "Sprachen").at(lang) section( title: title, { @@ -258,7 +251,7 @@ let sidebar = { if "volunteering" in sidebar and "volunteering" in contents { - let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) [== #title] for e in contents.at("volunteering") { [ @@ -269,14 +262,14 @@ } if "languages" in sidebar and "languages" in contents { - let title = sel_word_lang(en: "Languages", de: "Sprachen") + let title = (en: "Languages", de: "Sprachen").at(lang) [== #title] skill_item(item: contents.languages, is_sidebar: true) [\ ] } if "skills" in sidebar and "skills" in contents { - let title = sel_word_lang(en: "Qualifications", de: "Kenntnisse") + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) [== #title] skill_item(item: contents.skills, is_sidebar: true) } From 8788c0a647412e586addf242822dd214be4a9d17 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 28 Jan 2025 21:43:33 +0100 Subject: [PATCH 35/61] Update content slightly --- content.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/content.yml b/content.yml index 0086afc..93b6526 100644 --- a/content.yml +++ b/content.yml @@ -37,6 +37,9 @@ experience_types: 2: de: Honorararbeit en: Salaried work + 3: + de: Gewerbeschein + en: Trade license experience: - typeid: 1 @@ -304,6 +307,7 @@ experience: de: 2014--2018 en: 2014--2018 typeid: 2 + hidden: true # TODO: Allow hiding entries like this? title: de: Verkaufsassistent und Eventhelfer für historische Märkte en: Sales Assistant and Event Support for Historical Markets @@ -350,8 +354,8 @@ education: de: HTWK Leipzig, Deutschland en: HTWK Leipzig, Germany title: - de: Medieninformatik, BSc (nicht abgeschlossen) - en: Media Computer Science, BSc (not completed) + de: Medieninformatik, BSc (nicht abg.) + en: Media Computer Science, BSc (not compl.) date: de: 2015 en: 2015 From ddf5f0d9bd187fb1c824d0be5a227469e5005e21 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:14:47 +0100 Subject: [PATCH 36/61] Update address --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 93b6526..b53b598 100644 --- a/content.yml +++ b/content.yml @@ -1,7 +1,7 @@ about: fullname: Marty Oehme contact: - - text: Körnerstr. 54, 04107 Leipzig, Germany + - text: Pichelsdorfer Str. 133, 13595 Berlin, Germany icon:  - text: contact@martyoeh.me icon:  From cfaba8e9547a6add63f9d9023a078eedf8f6bb59 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:15:12 +0100 Subject: [PATCH 37/61] Move AFD research project up above Roskilde projects --- content.yml | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/content.yml b/content.yml index b53b598..4d459d2 100644 --- a/content.yml +++ b/content.yml @@ -99,6 +99,27 @@ experience: en: Analysis of procurement sub-processes as linear, cyclic and decision-oriented models - de: Klare Abgrenzung der Antriebe und Hindernisse für die Erreichung von Nachhaltigkeit in der Beschaffung en: Clear delineation of primary drivers and barriers of achieving sustainability in procurement + - date: + de: 2022 + en: 2022 + typeid: 1 + title: + de: Forschungsassistenz, Entwicklungsprojekte zur Reduzierung Ungleichheitstrends + en: Research Assistant, Development projects to reduce inequality trends + place: + de: UNU-WIDER + en: UNU-WIDER + publication: + de: Niño-Zarazúa, M., \& Morabito, C. (angenommen). Assessing the potential distributional impacts of development interventions. UNU-WIDER. + en: Niño-Zarazúa, M., \& Morabito, C. (forthcoming). Assessing the potential distributional impacts of development interventions. UNU-WIDER. + bullets: # TODO: add numerical description of quantity of data (>2mil. datapoints) + - de: Sammlung, Verarbeitung und Bereinigung von 4 quantitativen Datensätzen, u.a. der UN Ungleichheitstrends + en: Collected, processed, and cleaned 4 datasets, including UN World inequality trends + - de: Durchführen einer beschreibenden Analyse von Ungleichheitstrends und -treibern in 4 Ländern + en: Conducted descriptive analysis of inequality trends and drivers in 4 countries + - de: Erstellen visueller Abbildungen der Daten und beschreibender Analysen der Entwicklungshilfen und ihrer Verteilung + en: Produced basic time-series visualizations and descriptive analysis of development aid contributions and their distribution + link: https://www.afd.fr/en/carte-des-projets/distributional-impact-development-cooperation-projects - date: de: 2022 en: 2022 @@ -136,27 +157,6 @@ experience: en: Reviewing and correcting of footnotes, citations and sources - de: Herausarbeitung von klarer Sprache, Lesefluss und prägnantem Ausdruck en: Developing clear language, reading flow and concise expression - - date: - de: 2022 - en: 2022 - typeid: 1 - title: - de: Forschungsassistenz, Entwicklungsprojekte zur Reduzierung Ungleichheitstrends - en: Research Assistant, Development projects to reduce inequality trends - place: - de: UNU-WIDER - en: UNU-WIDER - publication: - de: Niño-Zarazúa, M., \& Morabito, C. (angenommen). Assessing the potential distributional impacts of development interventions. UNU-WIDER. - en: Niño-Zarazúa, M., \& Morabito, C. (forthcoming). Assessing the potential distributional impacts of development interventions. UNU-WIDER. - bullets: # TODO: add numerical description of quantity of data (>2mil. datapoints) - - de: Sammlung, Verarbeitung und Bereinigung von 4 quantitativen Datensätzen, u.a. der UN Ungleichheitstrends - en: Collected, processed, and cleaned 4 datasets, including UN World inequality trends - - de: Durchführen einer beschreibenden Analyse von Ungleichheitstrends und -treibern in 4 Ländern - en: Conducted descriptive analysis of inequality trends and drivers in 4 countries - - de: Erstellen visueller Abbildungen der Daten und beschreibender Analysen der Entwicklungshilfen und ihrer Verteilung - en: Produced basic time-series visualizations and descriptive analysis of development aid contributions and their distribution - link: https://www.afd.fr/en/carte-des-projets/distributional-impact-development-cooperation-projects - date: de: 2022 en: 2022 From 7eee35dcfc376a2f80b8363d635efdaf4e5979cd Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:15:36 +0100 Subject: [PATCH 38/61] Switch digital skills around --- content.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content.yml b/content.yml index 4d459d2..1be2517 100644 --- a/content.yml +++ b/content.yml @@ -418,10 +418,10 @@ skills: de: Autorensoftware en: Authoring software items: - - de: LaTeX - en: LaTeX - de: Typst en: Typst + - de: LaTeX + en: LaTeX - de: Quarto en: Quarto - de: Pandoc @@ -462,14 +462,14 @@ skills: en: Git - de: Jujutsu en: Jujutsu - - de: Fossil - en: Fossil + # - de: Fossil + # en: Fossil - name: de: Web Content Management en: Web content management items: - - de: Wordpress - en: Wordpress + # - de: Wordpress + # en: Wordpress - de: Hugo en: Hugo - de: Flask From 35ef95331d47300a8a0ec4d915d3a891768cae07 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:16:04 +0100 Subject: [PATCH 39/61] Make sidebar margin smaller --- resume.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resume.typ b/resume.typ index 6176dc6..2d10d7d 100644 --- a/resume.typ +++ b/resume.typ @@ -309,7 +309,7 @@ width: 90%, { v(15pt) - set block(inset: (left: 20 * margin, right: 20 * margin)) + set block(inset: (left: 5 * margin, right: 5 * margin)) show heading: it => align(right, upper(it)) set list(marker: "") show list: it => { From ca33cb142f94d4f227fb46fea4e5ad13aa37b179 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:52:17 +0100 Subject: [PATCH 40/61] Begin deduplicating code with a lib Starting to move the separated efforts of functionality between CV and resume into a library from which to import. Will take additional simplification still. --- cv.typ | 163 +++-------------------------------------------------- lib.typ | 139 +++++++++++++++++++++++++++++++++++++++++++++ resume.typ | 141 +-------------------------------------------- 3 files changed, 150 insertions(+), 293 deletions(-) create mode 100644 lib.typ diff --git a/cv.typ b/cv.typ index 518cd71..a17b353 100644 --- a/cv.typ +++ b/cv.typ @@ -1,149 +1,4 @@ -#show heading: set text(font: "New Computer Modern") -#show link: underline - -// smartypants and latex compatibility -#show "--": [#sym.dash.en] -#show "---": [#sym.dash.em] -#show "\&": [#sym.amp] - -// Choose the compiled language through cli by doing -// -// $ typst compile --input lang=de cv.typ -// -#let lang = { - if "lang" in sys.inputs and sys.inputs.lang == "de" { - "de" - } else { - "en" - } -} -#let sel_word_lang(de: "", en: "") = { - if lang == "de" { - de - } else { - en - } -} - -#let _columns_3(left_body, center_body, right_body) = { - block[ - #box(width: 1fr)[ - #align(left)[#left_body] - ] - #box(width: 1fr)[ - #align(center)[#center_body] - ] - #box(width: 1fr)[ - #align(right)[#right_body] - ] - ] -} - -#let header(about, columns: (1.5fr, 1fr, 1fr)) = { - [= #about.fullname] - let contact_fields = ( - for c in about.contact { - if "link" in c { - ([#c.icon ~ #link(c.link)[#c.text]],) - } else { - ([#c.icon ~ #c.text],) - } - } - ) - grid( - columns: columns, - gutter: 5pt, - ..contact_fields - ) -} - -#let subdued(body) = { - block(inset: 5%, width: 85%, text(fill: luma(150), body)) -} - -#let entry(item: ()) = { - if "title" in item { - [*#item.title.at(lang)*] - } - if "place" in item { - if "title" in item { - [, ] - } - [_#item.place.at(lang)_] - } - [#h(1fr)] - if "date" in item { - [ _#item.date.at(lang)_ \ ] - } - if "bullets" in item { - for bullet in item.bullets { - [- #bullet.at(lang)] - } - } - if "publication" in item { - subdued[#item.publication.at(lang) \ ] - } - if "abstract" in item { - subdued[#item.abstract.at(lang) \ ] - } -} - -#let horizon_line() = { - v(-3pt) - line(length: 100%) - v(-5pt) -} - -#let section_header(title) = { - [== #title] - horizon_line() -}; - -#let section(title: "Section", entries: (), body) = { - section_header(title) - if body == none or body == [] { - for e in entries { - entry(item: e) - } - } else { - body - } -}; - -// Slightly re-styled entry with PLACE first and TITLE second -#let education_entry(item: ()) = { - assert( - "place" in item and "title" in item and "date" in item, - message: "Education items require place, program and date.", - ) - [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)] - [ _#item.date.at(lang)_ \ ] -} - -// Restyled entry with PLACE not emphasized like usual, and no date but an abstract -#let thesis_entry(item: ()) = { - assert("title" in item and "place" in item, message: "Thesis items require type and title.") - [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] - [#par(item.abstract.at(lang))] -} - -// skill-specific entry, changing its style for sidebar -#let skill_item(item: (), is_sidebar: false) = { - let side_list(body) = if is_sidebar { list(body) } else { par(body) } - for skill in item { - side_list({ - [*#skill.name.at(lang)*] - if is_sidebar [\ ] else [ (] - for (i, v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] - } - } - if not is_sidebar [)] - }) - } -} +#import "lib.typ": * #let cv(contents, use_sidebar: false) = { set text(lang: lang) @@ -188,23 +43,23 @@ } if "experience" in contents { - let title = sel_word_lang(en: "Professional Experience", de: "Berufserfahrung") + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) section(title: title, entries: contents.experience)[] } if "education" in contents { - let title = sel_word_lang(en: "Education", de: "Ausbildung") + let title = (en: "Education", de: "Ausbildung").at(lang) section(title: title, entries: contents.thesis + contents.education)[] } if not use_sidebar { if "volunteering" in contents { - let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) section(title: title, entries: contents.volunteering)[] } if "skills" in contents { - let title = sel_word_lang(en: "Qualifications", de: "Qualifikationen") + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) section( title: title, { @@ -214,7 +69,7 @@ } if "languages" in contents { - let title = sel_word_lang(en: "Languages", de: "Sprachen") + let title = (en: "Languages", de: "Sprachen").at(lang) section( title: title, { @@ -227,7 +82,7 @@ let sidebar = { if "volunteering" in contents { - let title = sel_word_lang(en: "Volunteer Work", de: "Ehrenamt") + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) [== #title] for e in contents.volunteering { [ @@ -238,14 +93,14 @@ } if "languages" in contents { - let title = sel_word_lang(en: "Languages", de: "Sprachen") + let title = (en: "Languages", de: "Sprachen").at(lang) [== #title] skill_item(item: contents.languages, is_sidebar: true) [\ ] } if "skills" in contents { - let title = sel_word_lang(en: "Qualifications", de: "Kenntnisse") + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) [== #title] skill_item(item: contents.skills, is_sidebar: true) } diff --git a/lib.typ b/lib.typ new file mode 100644 index 0000000..51862d7 --- /dev/null +++ b/lib.typ @@ -0,0 +1,139 @@ +#show heading: set text(font: "New Computer Modern") +#show link: underline + +// smartypants and latex compatibility +#show "--": [#sym.dash.en] +#show "---": [#sym.dash.em] +#show "\&": [#sym.amp] + +// Choose the compiled language through cli by doing +// +// $ typst compile --input lang=de cv.typ +// +#let lang = { + if "lang" in sys.inputs and sys.inputs.lang == "de" { + "de" + } else { + "en" + } +} + +#let _columns_3(left_body, center_body, right_body) = { + block[ + #box(width: 1fr)[ + #align(left)[#left_body] + ] + #box(width: 1fr)[ + #align(center)[#center_body] + ] + #box(width: 1fr)[ + #align(right)[#right_body] + ] + ] +} + +#let header(about, columns: (1.5fr, 1fr, 1fr)) = { + [= #about.fullname] + let contact_fields = ( + for c in about.contact { + if "link" in c { + ([#c.icon ~ #link(c.link)[#c.text]],) + } else { + ([#c.icon ~ #c.text],) + } + } + ) + grid( + columns: columns, + gutter: 5pt, + ..contact_fields + ) +} + +#let subdued(body) = { + block(inset: 5%, width: 85%, text(fill: luma(150), body)) +} + +#let entry(item: ()) = { + if "title" in item { + [*#item.title.at(lang)*] + } + if "place" in item { + if "title" in item { + [, ] + } + [_#item.place.at(lang)_] + } + [#h(1fr)] + if "date" in item { + [ _#item.date.at(lang)_ \ ] + } + if "bullets" in item { + for bullet in item.bullets { + [- #bullet.at(lang)] + } + } + if "publication" in item { + subdued[#item.publication.at(lang) \ ] + } + if "abstract" in item { + subdued[#item.abstract.at(lang) \ ] + } +} + +#let horizon_line() = { + v(-3pt) + line(length: 100%) + v(-5pt) +} + +#let section_header(title) = { + [== #title] + horizon_line() +}; + +#let section(title: "Section", entries: (), body) = { + section_header(title) + if body == none or body == [] { + for e in entries { + entry(item: e) + } + } else { + body + } +}; + +// Slightly re-styled entry with PLACE first and TITLE second +#let education_entry(item: ()) = { + assert( + "place" in item and "title" in item and "date" in item, + message: "Education items require place, program and date.", + ) + [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)] + [ _#item.date.at(lang)_ \ ] +} + +// Restyled entry with PLACE not emphasized like usual, and no date but an abstract +#let thesis_entry(item: ()) = { + assert("title" in item and "place" in item, message: "Thesis items require type and title.") + [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] + [#par(item.abstract.at(lang))] +} + +// skill-specific entry, changing its style for sidebar +#let skill_item(item: (), is_sidebar: false) = { + let side_list(body) = if is_sidebar { list(body) } else { par(body) } + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i, v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + if not is_sidebar [)] + }) + } +} diff --git a/resume.typ b/resume.typ index 2d10d7d..489d044 100644 --- a/resume.typ +++ b/resume.typ @@ -1,59 +1,6 @@ -#show heading: set text(font: "New Computer Modern") -#show link: underline - -// smartypants and latex compatibility -#show "--": [#sym.dash.en] -#show "---": [#sym.dash.em] -#show "\&": [#sym.amp] - -// Choose the compiled language through cli by doing -// -// $ typst compile --input lang=de cv.typ -// -#let lang = { - if "lang" in sys.inputs and sys.inputs.lang == "de" { - "de" - } else { - "en" - } -} - -#let _columns_3(left_body, center_body, right_body) = { - block[ - #box(width: 1fr)[ - #align(left)[#left_body] - ] - #box(width: 1fr)[ - #align(center)[#center_body] - ] - #box(width: 1fr)[ - #align(right)[#right_body] - ] - ] -} - -#let header(about, columns: (1.5fr, 1fr, 1fr)) = { - [= #about.fullname] - let contact_fields = ( - for c in about.contact { - if "link" in c { - ([#c.icon ~ #link(c.link)[#c.text]],) - } else { - ([#c.icon ~ #c.text],) - } - } - ) - grid( - columns: columns, - gutter: 5pt, - ..contact_fields - ) -} - -#let subdued(body) = { - block(inset: 5%, width: 85%, text(fill: luma(150), body)) -} +#import "lib.typ": * +// TODO: make it _return_ the data, not display it on its own #let by_client(experience: ()) = { let by_client = (:) @@ -86,90 +33,6 @@ } } -#let entry(item: ()) = { - if "title" in item { - [*#item.title.at(lang)*] - } - if "place" in item { - if "title" in item { - [, ] - } - [_#item.place.at(lang)_] - } - [#h(1fr)] - if "date" in item { - [ _#item.date.at(lang)_ \ ] - } - if "bullets" in item { - for bullet in item.bullets { - [- #bullet.at(lang)] - } - } - if "publication" in item { - subdued[#item.publication.at(lang) \ ] - } - if "abstract" in item { - subdued[#item.abstract.at(lang) \ ] - } -} - -#let horizon_line() = { - v(-3pt) - line(length: 100%) - v(-5pt) -} - -#let section_header(title) = { - [== #title] - horizon_line() -}; - -#let section(title: "Section", entries: (), body) = { - section_header(title) - if body == none or body == [] { - for e in entries { - entry(item: e) - } - } else { - body - } -}; - -// Slightly re-styled entry with PLACE first and TITLE second -#let education_entry(item: ()) = { - assert( - "place" in item and "title" in item and "date" in item, - message: "Education items require place, program and date.", - ) - [*#item.place.at(lang)*, #item.title.at(lang) #h(1fr)] - [ _#item.date.at(lang)_ \ ] -} - -// Restyled entry with PLACE not emphasized like usual, and no date but an abstract -#let thesis_entry(item: ()) = { - assert("title" in item and "place" in item, message: "Thesis items require type and title.") - [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] - [#par(item.abstract.at(lang))] -} - -// skill-specific entry, changing its style for sidebar -#let skill_item(item: (), is_sidebar: false) = { - let side_list(body) = if is_sidebar { list(body) } else { par(body) } - for skill in item { - side_list({ - [*#skill.name.at(lang)*] - if is_sidebar [\ ] else [ (] - for (i, v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] - } - } - if not is_sidebar [)] - }) - } -} - #let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { set text(lang: lang) From bbde91c97e8b0376771a6ef2c843f9ccd6a26d90 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 29 Jan 2025 11:52:45 +0100 Subject: [PATCH 41/61] Fix phrasing --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 1be2517..2afb449 100644 --- a/content.yml +++ b/content.yml @@ -28,7 +28,7 @@ summary: Through producing the development research literature I have developed a broad range of skills in data acquisition, organization and visualization, as well as manuscript editing and reference management. Additionally, I have gained insights into event management, teaching assistance, content creation, system and web administration. Beyond professional work I strive to foster the development of free and open software and open science without barriers. - I welcome opportunities to deepen my expertise in these topics, in addition to those expanding my range of applicable skills. + I welcome opportunities to advance my expertise in these topics, in addition to those expanding my range of applicable skills. experience_types: 1: From dd482390a2a6986548d76b435a3013ddebf6b489 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 4 Feb 2025 10:31:48 +0100 Subject: [PATCH 42/61] Ensure build dir before make Always ensure the build dir exists before trying to create files within. Each target creates the directory if necessary. --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 365449f..b9fbde1 100644 --- a/Makefile +++ b/Makefile @@ -2,15 +2,19 @@ all: clean cv resume letter + cv: cv.typ + mkdir -p build typst compile --input lang=en cv.typ build/cv_en.pdf typst compile --input lang=de cv.typ build/cv_de.pdf resume: resume.typ + mkdir -p build typst compile --input lang=en resume.typ build/resume_en.pdf typst compile --input lang=de resume.typ build/resume_de.pdf letter: letter.typ + mkdir -p build typst compile --input lang=en letter.typ build/letter_en.pdf typst compile --input lang=de letter.typ build/letter_de.pdf From b333e2f2db0a890a7cd935992f806e2a7fa3c68d Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Mon, 17 Mar 2025 11:27:45 +0100 Subject: [PATCH 43/61] ref(letter): Remove quarto letter --- letter.qmd | 53 ----------------------------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 letter.qmd diff --git a/letter.qmd b/letter.qmd deleted file mode 100644 index 6b4078d..0000000 --- a/letter.qmd +++ /dev/null @@ -1,53 +0,0 @@ ---- -backaddress: Marty Oehme, Körnerstraße 54, 04107 Leipzig -fromname: Marty Oehme -fromaddress: | - Körnerstraße 54 - 04107 Leipzig -fromphone: "0177 / 377 49 49" -place: Leipzig, DAY MONTH YEAR -placeseparator: "‎ " -sendto: | - NAME OF COMPANY - ITS ADDRESS STREET AND NUMBER - LOCATION ZIPCODE -lang: en -subject: Bewerbung für JOBSTELLE -signature: Marty Oehme -opening: Dear CONTACTNAME -closing: Sincerely -format: - pdf: - template: templates/letter.latex ---- - -After two years of cooperation, I recently finished the final in a row of projects undertaken as consultant for UNU-WIDER and the ILO. -I am glad to have happened upon your job posting for the position of project officer as part-time worker with minimum 32 hours, as for me it may allow a more medium term stability than the previous short-term freelance positions did. - -Over the previous two years, I have primarily provided research assistance for three major projects under the helm of the UN, the ILO and Roskilde University: -In addition to the descriptive analysis undertaken for all of these projects, -my consultancy for UNU-WIDER required the creation of a time-series visualization on the basis of empirical analysis over roughly 200.000 observations within the UN's WIID dataset. -The previous work for the ILO and Roskilde University instead consisted of deep research for the creation of wide-ranging scoping reviews, -which necessitated collecting, organizing and cleaning datasets of around 2000 source potentials. -I accomplished both of these tasks more efficiently with the help of Python and its data analysis modules which is also where my primary statistical programming focus lies. - -Additionally, I have long been helping publish academic, particularly empirical, works, -first in the role of academic assistant and later on as editorial consultant. -Perhaps most personally beneficial for the current position was the publication of a large academic anthology under the SPIWORK project: -During this time I worked with clients located internationally, -collaborating directly to create clear and concise manuscripts for each individual topic, -before merging the divergent aspects into a final coherent whole while also fulfilling publisher's formal requirements. -I would love to bring both the analytical and editorial skillsets together in my new work, -to be able to push them forward in tandem. - -Lastly, my skills of communication, especially international communication skills, have been honed throughout this time as I was both participant and leader of small (from 3 people) to medium-sized (up to 8 people) teams. -Collaboration in this way was both exciting and straightforward for me, -and I firmly believe concise and clear communication both engenders easier productivity flows -and is fundamental to the ability to precisely frame topics as complex as energy transition. - -My interactions with processes of both long-term energy planning and renewables-based electrification of end-use sectors primarily stem from research undertaken in Vietnam and Benin under the helm of the Agence française de développement, -where the eventual distributional impact of access to clean water and new energy grids provided the project's focus. -I have, however, both the willingness and curiosity to dive deeper into these topics and their related issues of regulatory frameworks, financing and policy framing. - -I will be happy to hear back from you and am confident that I could be a good match. -Should you agree that my profile is a good fit for the offered position then do not hesitate to contact me and I would be delighted to arrange a meeting. From 948510fb13f3e0e2536c96152727b12eb1d0e67e Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 5 Feb 2025 15:15:55 +0100 Subject: [PATCH 44/61] Move element styling and smartypants to lib --- cv.typ | 2 ++ lib.typ | 21 +++++++++++++++------ resume.typ | 2 ++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/cv.typ b/cv.typ index a17b353..227584a 100644 --- a/cv.typ +++ b/cv.typ @@ -1,6 +1,8 @@ #import "lib.typ": * #let cv(contents, use_sidebar: false) = { + show: style + show: smartypants set text(lang: lang) let date_formatting = { diff --git a/lib.typ b/lib.typ index 51862d7..09b33e1 100644 --- a/lib.typ +++ b/lib.typ @@ -1,10 +1,19 @@ -#show heading: set text(font: "New Computer Modern") -#show link: underline -// smartypants and latex compatibility -#show "--": [#sym.dash.en] -#show "---": [#sym.dash.em] -#show "\&": [#sym.amp] +// set some styles +#let style(it) = { + show heading: set text(font: "New Computer Modern") + show link: underline + it +} + +// transform md-similes to actual symbols +#let smartypants(it) = { + // smartypants and latex compatibility + show "--": [#sym.dash.en] + show "---": [#sym.dash.em] + show "\&": [#sym.amp] + it +} // Choose the compiled language through cli by doing // diff --git a/resume.typ b/resume.typ index 489d044..789e029 100644 --- a/resume.typ +++ b/resume.typ @@ -34,6 +34,8 @@ } #let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { + show: style + show: smartypants set text(lang: lang) let date_formatting = { From 0dd715d8069e33b3298c713e69d1cbc9541d8267 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:43:43 +0100 Subject: [PATCH 45/61] fix(content): Rephrase ZeitRaum support consultations --- content.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content.yml b/content.yml index 2afb449..0cd575d 100644 --- a/content.yml +++ b/content.yml @@ -386,8 +386,8 @@ volunteering: en: Transferring Digital Competence in Aging - de: Wöchentlicher Workshop zur Entwicklung von Selbstvertrauen und Kompetenz mit Smartphones en: Weekly workshop on developing confidence and competence with smartphones - - de: Personalisierte technische Hilfsmeetings und technische Support-Beratungen - en: Personalized tech assistance appointments and technical support consultations + - de: Personalisierte technische Unterstützung und personalisierte Einzelberatungen + en: Personalized tech assistance appointments and individual technical support consultations - title: de: Verpixelt en: Verpixelt From f60991344db7d8212db2d926bb18d9e2017aaf18 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:43:43 +0100 Subject: [PATCH 46/61] feat(resume): Choose experience display by client,type,chronological Can be set by setting the point in 'main' array to 'experience_by_client', 'experience_by_type' or just 'experience' respectively. --- resume.typ | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/resume.typ b/resume.typ index 789e029..16119f4 100644 --- a/resume.typ +++ b/resume.typ @@ -33,7 +33,7 @@ } } -#let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { +#let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style show: smartypants set text(lang: lang) @@ -77,11 +77,20 @@ ) } - if "experience" in main and "experience" in contents { + if "experience_by_type" in main and "experience" in contents { let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) section(title: title)[] by_experience_type(experience: contents.experience, type: contents.experience_types) } + if "experience_by_client" in main and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_client(experience: contents.experience) + } + if "experience" in main and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title, entries: contents.experience)[] + } if "education" in main and "education" in contents { let title = (en: "Education", de: "Ausbildung").at(lang) From 1a62b90df77a38ba20d5409f97482777baaa4002 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 47/61] feat(resume): Add ability to reorder sections Both in main and in sidebar, sections can be reordered simply by changing the order they appar in the array adding them. `#resume.with(main:("education", "experience"))` displays education before experience items. --- resume.typ | 136 +++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/resume.typ b/resume.typ index 16119f4..8309611 100644 --- a/resume.typ +++ b/resume.typ @@ -68,84 +68,88 @@ header(contents.about) let body = { - if "summary" in main and "summary" in contents { - section( - title: "", - { - contents.summary.at(lang) - }, - ) - } + for item in main { + if item == "summary" and "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) + } - if "experience_by_type" in main and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_experience_type(experience: contents.experience, type: contents.experience_types) - } - if "experience_by_client" in main and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_client(experience: contents.experience) - } - if "experience" in main and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title, entries: contents.experience)[] - } + if item == "experience_by_type" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_experience_type(experience: contents.experience, type: contents.experience_types) + } + if item == "experience_by_client" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_client(experience: contents.experience) + } + if item == "experience" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title, entries: contents.experience)[] + } - if "education" in main and "education" in contents { - let title = (en: "Education", de: "Ausbildung").at(lang) - section(title: title, entries: contents.thesis + contents.education)[] - } + if item == "education" and "education" in contents { + let title = (en: "Education", de: "Ausbildung").at(lang) + section(title: title, entries: contents.thesis + contents.education)[] + } - if "volunteering" in main and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - section(title: title, entries: contents.volunteering)[] - } + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + section(title: title, entries: contents.volunteering)[] + } - if "skills" in main and "skills" in contents { - let title = (en: "Qualifications", de: "Qualifikationen").at(lang) - section( - title: title, - { - skill_item(item: contents.skills) - }, - ) - } + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) + section( + title: title, + { + skill_item(item: contents.skills) + }, + ) + } - if "languages" in main and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - section( - title: title, - { - skill_item(item: contents.languages) - }, - ) + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + section( + title: title, + { + skill_item(item: contents.languages) + }, + ) + } } } let sidebar = { - if "volunteering" in sidebar and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - [== #title] - for e in contents.at("volunteering") { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] + for item in sidebar { + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + [== #title] + for e in contents.at("volunteering") { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } } - } - if "languages" in sidebar and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - [== #title] - skill_item(item: contents.languages, is_sidebar: true) - [\ ] - } + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + [== #title] + skill_item(item: contents.languages, is_sidebar: true) + [\ ] + } - if "skills" in sidebar and "skills" in contents { - let title = (en: "Qualifications", de: "Kenntnisse").at(lang) - [== #title] - skill_item(item: contents.skills, is_sidebar: true) + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) + [== #title] + skill_item(item: contents.skills, is_sidebar: true) + } } } From 37c59e71db0e32849c0dc07616a04ce06ab09d67 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 48/61] docs: Update README Give light hints to how the section arrays work. --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ae62ba2..29a97f8 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,28 @@ Is called like the following: ``` This is the default invocation, though sidebar and main body sections can be exchanged at will. +The following sections currently exist: + +- education +- experience, subdivided in "experience", "experience_by_client" and "experience_by_type" +- languages +- skills +- summary +- volunteering + +Sections in the main body or sidebar can be reordered at will. + +## Advanced experience settings + +The experience section has 3 forms: + +Purely chronological ("experience"), which is the default; +separated by client worked for ("experience_by_client"); +separated by the type of work undertaken, then further separated by client worked for ("experience_by_client"). + +These options are intended especially for self-employed / entrepreneurial CVs. +They let you subdivide your work experience whichever way works best, +and additionally divide work undertaken for your own employ or salaried positions for example. TODO: @@ -42,4 +64,4 @@ TODO: - [x] Can be switched between Ger/En - [x] Try sidebar version - [ ] Generalize sidebar version through abstraction/extractions -- [ ] unify items: experience/education/(thesis?) +- [x] unify items: experience/education/(thesis?) From c831b008b93b9875646c7dd7c22b253eb4bc9b51 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 49/61] ref(resume): Move by_client and by_experience_type to lib In the continuous process of moving everything away from the main resume body, move these experience functions away. --- lib.typ | 33 +++++++++++++++++++++++++++++++++ resume.typ | 33 --------------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib.typ b/lib.typ index 09b33e1..c27d018 100644 --- a/lib.typ +++ b/lib.typ @@ -112,6 +112,39 @@ } }; +// TODO: make it _return_ the data, not display it on its own +#let by_client(experience: ()) = { + let by_client = (:) + + for item in experience { + let client = item.place.at(lang) + if client not in by_client { + by_client.insert(client, ()) + } + by_client.at(client).push((title: item.title.at(lang), date: item.date.at(lang))) + } + + for (client, jobs) in by_client { + [*#client*:] + for j in jobs { + [- #j.title #h(1fr) #j.date] + } + } +} + +#let by_experience_type(type: (), experience: ()) = { + let by_ty = (:) + for (id, desc) in type { + let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) + if matching_exp_items.len() == 0 { + return + } + + [=== _#desc.at(lang)_] + by_client(experience: matching_exp_items) + } +} + // Slightly re-styled entry with PLACE first and TITLE second #let education_entry(item: ()) = { assert( diff --git a/resume.typ b/resume.typ index 8309611..df2715a 100644 --- a/resume.typ +++ b/resume.typ @@ -1,38 +1,5 @@ #import "lib.typ": * -// TODO: make it _return_ the data, not display it on its own -#let by_client(experience: ()) = { - let by_client = (:) - - for item in experience { - let client = item.place.at(lang) - if client not in by_client { - by_client.insert(client, ()) - } - by_client.at(client).push((item.title.at(lang), item.date.at(lang))) - } - - for (client, jobs) in by_client { - [*#client*:] - for j in jobs { - [- #j.at(0) #h(1fr) #j.at(1)] - } - } -} - -#let by_experience_type(type: (), experience: ()) = { - let by_ty = (:) - for (id, desc) in type { - let matching_exp_items = experience.filter(item => int(item.typeid) == int(id)) - if matching_exp_items.len() == 0 { - return - } - - [=== _#desc.at(lang)_] - by_client(experience: matching_exp_items) - } -} - #let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style show: smartypants From df480875df8eb088ff4c1e2a17d7d803a3b978bc Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 50/61] ref(lib): Rename skill_item to sidebar_entry We use the function for all entries in the sidebar (volunteering, languages, etc) not just skills. --- cv.typ | 8 ++++---- lib.typ | 36 ++++++++++++++++++------------------ resume.typ | 9 ++++----- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/cv.typ b/cv.typ index 227584a..19a5459 100644 --- a/cv.typ +++ b/cv.typ @@ -65,7 +65,7 @@ section( title: title, { - skill_item(item: contents.skills) + sidebar_entry(item: contents.skills) }, ) } @@ -75,7 +75,7 @@ section( title: title, { - skill_item(item: contents.languages) + sidebar_entry(item: contents.languages) }, ) } @@ -97,14 +97,14 @@ if "languages" in contents { let title = (en: "Languages", de: "Sprachen").at(lang) [== #title] - skill_item(item: contents.languages, is_sidebar: true) + sidebar_entry(item: contents.languages, is_sidebar: true) [\ ] } if "skills" in contents { let title = (en: "Qualifications", de: "Kenntnisse").at(lang) [== #title] - skill_item(item: contents.skills, is_sidebar: true) + sidebar_entry(item: contents.skills, is_sidebar: true) } } diff --git a/lib.typ b/lib.typ index c27d018..d82a0a1 100644 --- a/lib.typ +++ b/lib.typ @@ -90,6 +90,24 @@ } } + +#let sidebar_entry(item: (), is_sidebar: false) = { + let side_list(body) = if is_sidebar { list(body) } else { par(body) } + for skill in item { + side_list({ + [*#skill.name.at(lang)*] + if is_sidebar [\ ] else [ (] + for (i, v) in skill.items.enumerate() { + [#v.at(lang)] + if i < skill.items.len() - 1 { + [, ] + } + } + if not is_sidebar [)] + }) + } +} + #let horizon_line() = { v(-3pt) line(length: 100%) @@ -161,21 +179,3 @@ [*#item.title.at(lang)* #item.place.at(lang) #h(1fr)] [#par(item.abstract.at(lang))] } - -// skill-specific entry, changing its style for sidebar -#let skill_item(item: (), is_sidebar: false) = { - let side_list(body) = if is_sidebar { list(body) } else { par(body) } - for skill in item { - side_list({ - [*#skill.name.at(lang)*] - if is_sidebar [\ ] else [ (] - for (i, v) in skill.items.enumerate() { - [#v.at(lang)] - if i < skill.items.len() - 1 { - [, ] - } - } - if not is_sidebar [)] - }) - } -} diff --git a/resume.typ b/resume.typ index df2715a..42764df 100644 --- a/resume.typ +++ b/resume.typ @@ -75,7 +75,7 @@ section( title: title, { - skill_item(item: contents.skills) + sidebar_entry(item: contents.skills) }, ) } @@ -85,7 +85,7 @@ section( title: title, { - skill_item(item: contents.languages) + sidebar_entry(item: contents.languages) }, ) } @@ -108,14 +108,14 @@ if item == "languages" and "languages" in contents { let title = (en: "Languages", de: "Sprachen").at(lang) [== #title] - skill_item(item: contents.languages, is_sidebar: true) + sidebar_entry(item: contents.languages, is_sidebar: true) [\ ] } if item == "skills" and "skills" in contents { let title = (en: "Qualifications", de: "Kenntnisse").at(lang) [== #title] - skill_item(item: contents.skills, is_sidebar: true) + sidebar_entry(item: contents.skills, is_sidebar: true) } } } @@ -150,7 +150,6 @@ align( right, block( - fill: luma(250), width: 90%, { v(15pt) From 72d40e509447c8ebd8f8db5859b5b10221cf9e2a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 51/61] ref(smartypants): Move smartypants application to lib --- lib.typ | 15 ++++++++------- resume.typ | 1 - 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib.typ b/lib.typ index d82a0a1..ff4c0ed 100644 --- a/lib.typ +++ b/lib.typ @@ -1,11 +1,4 @@ -// set some styles -#let style(it) = { - show heading: set text(font: "New Computer Modern") - show link: underline - it -} - // transform md-similes to actual symbols #let smartypants(it) = { // smartypants and latex compatibility @@ -15,6 +8,14 @@ it } +// set some styles +#let style(it) = { + show heading: set text(font: "New Computer Modern") + show link: underline + show: smartypants + it +} + // Choose the compiled language through cli by doing // // $ typst compile --input lang=de cv.typ diff --git a/resume.typ b/resume.typ index 42764df..2930ed1 100644 --- a/resume.typ +++ b/resume.typ @@ -2,7 +2,6 @@ #let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style - show: smartypants set text(lang: lang) let date_formatting = { From f404bf3c55cb7b9665c4293849a54768b68f68fe Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 52/61] feat(sidebar): Make sidebar visible backgrounded Just add a grey background for now. --- resume.typ | 1 + 1 file changed, 1 insertion(+) diff --git a/resume.typ b/resume.typ index 2930ed1..41715dd 100644 --- a/resume.typ +++ b/resume.typ @@ -149,6 +149,7 @@ align( right, block( + fill: luma(230), width: 90%, { v(15pt) From 2970745b7dc4ad5e9a2106dde379b5b3e560b863 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 53/61] ref(resume): Extract column creation from resume func Extracted into their own functions called 'create_main' and 'create_sidebar' for now. --- resume.typ | 177 +++++++++++++++++++++++++++-------------------------- 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/resume.typ b/resume.typ index 41715dd..dcc4ca9 100644 --- a/resume.typ +++ b/resume.typ @@ -1,6 +1,92 @@ #import "lib.typ": * -#let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { +#let create_body(main: (), contents: (:)) = { + for item in main { + if item == "summary" and "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) + } + + if item == "experience_by_type" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_experience_type(experience: contents.experience, type: contents.experience_types) + } + if item == "experience_by_client" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_client(experience: contents.experience) + } + if item == "experience" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title, entries: contents.experience)[] + } + + if item == "education" and "education" in contents { + let title = (en: "Education", de: "Ausbildung").at(lang) + section(title: title, entries: contents.thesis + contents.education)[] + } + + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + section(title: title, entries: contents.volunteering)[] + } + + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) + section( + title: title, + { + sidebar_entry(item: contents.skills) + }, + ) + } + + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + section( + title: title, + { + sidebar_entry(item: contents.languages) + }, + ) + } + } +} + +#let create_sidebar(sidebar: (), contents: (:)) = { + for item in sidebar { + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + [== #title] + for e in contents.at("volunteering") { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } + } + + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + [== #title] + sidebar_entry(item: contents.languages, is_sidebar: true) + [\ ] + } + + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) + [== #title] + sidebar_entry(item: contents.skills, is_sidebar: true) + } + } +} + +#let resume(contents, main: ( "experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style set text(lang: lang) @@ -33,91 +119,6 @@ header(contents.about) - let body = { - for item in main { - if item == "summary" and "summary" in contents { - section( - title: "", - { - contents.summary.at(lang) - }, - ) - } - - if item == "experience_by_type" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_experience_type(experience: contents.experience, type: contents.experience_types) - } - if item == "experience_by_client" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_client(experience: contents.experience) - } - if item == "experience" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title, entries: contents.experience)[] - } - - if item == "education" and "education" in contents { - let title = (en: "Education", de: "Ausbildung").at(lang) - section(title: title, entries: contents.thesis + contents.education)[] - } - - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - section(title: title, entries: contents.volunteering)[] - } - - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Qualifikationen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.skills) - }, - ) - } - - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.languages) - }, - ) - } - } - } - - let sidebar = { - for item in sidebar { - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - [== #title] - for e in contents.at("volunteering") { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } - } - - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - [== #title] - sidebar_entry(item: contents.languages, is_sidebar: true) - [\ ] - } - - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Kenntnisse").at(lang) - [== #title] - sidebar_entry(item: contents.skills, is_sidebar: true) - } - } - } let margin = 1pt grid( @@ -143,7 +144,7 @@ ), ) }) - body + create_body(main: main, contents: contents) }, ), align( @@ -160,7 +161,7 @@ set par(justify: false) align(right, block(it)) } - sidebar + create_sidebar(sidebar: sidebar, contents: contents) v(15pt) }, ), From bb9606b2db1d3f249a002feba14dc79cf0ca75ba Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 54/61] fix(content): Rephrase partial completion of BA --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index 0cd575d..af23b8b 100644 --- a/content.yml +++ b/content.yml @@ -355,7 +355,7 @@ education: en: HTWK Leipzig, Germany title: de: Medieninformatik, BSc (nicht abg.) - en: Media Computer Science, BSc (not compl.) + en: Media Computer Science, BSc (incompl.) date: de: 2015 en: 2015 From 1afc51a857c27695a750fd3e3594d76083b3bff8 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 14:57:57 +0100 Subject: [PATCH 55/61] feat(resume): Add wrapit library to dynamically add sidebar Removes issue that grid will be static throughout all pages and thus empty space where the sidebar is on page 1. Now, the sidebar aligns nicely along the first page but then we can use the full width for the next few pages. --- resume.typ | 77 ++++++------ wrapit.typ | 340 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 374 insertions(+), 43 deletions(-) create mode 100644 wrapit.typ diff --git a/resume.typ b/resume.typ index dcc4ca9..4c9f55c 100644 --- a/resume.typ +++ b/resume.typ @@ -1,4 +1,5 @@ #import "lib.typ": * +#import "wrapit.typ": * #let create_body(main: (), contents: (:)) = { for item in main { @@ -86,7 +87,7 @@ } } -#let resume(contents, main: ( "experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { +#let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { show: style set text(lang: lang) @@ -119,53 +120,43 @@ header(contents.about) + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt), + ), + ) + }) let margin = 1pt - grid( - columns: (2fr, 1fr), + let sb = if sidebar.len() > 0 { block( - outset: 0pt, - inset: (top: 0.4 * margin, right: 0pt, rest: margin), - stroke: none, - width: 100%, + fill: luma(230), + inset: (top: 15 * margin, left: 10 * margin, right: 15 * margin, bottom: 15 * margin), { - set block(above: 10pt) - show heading.where(level: 1): it => style(s => { - let h = text(size: 18pt, upper(it)) - let dim = measure(h, s) - stack( - dir: ltr, - h, - place( - dy: 7pt, - dx: 10pt, - horizon + left, - line(stroke: accent-color, length: 100% - dim.width - 10pt), - ), - ) - }) - create_body(main: main, contents: contents) + show heading: it => align(right, upper(it)) + set list(marker: "") + show list: it => { + set par(justify: false) + align(right, block(it)) + } + create_sidebar(sidebar: sidebar, contents: contents) }, - ), - align( - right, - block( - fill: luma(230), - width: 90%, - { - v(15pt) - set block(inset: (left: 5 * margin, right: 5 * margin)) - show heading: it => align(right, upper(it)) - set list(marker: "") - show list: it => { - set par(justify: false) - align(right, block(it)) - } - create_sidebar(sidebar: sidebar, contents: contents) - v(15pt) - }, - ), - ), + ) + } else { [] } + wrap-content( + sb, + create_body(main: main, contents: contents), + align: top + right, + columns: (auto, 30%), ) } diff --git a/wrapit.typ b/wrapit.typ new file mode 100644 index 0000000..12114c0 --- /dev/null +++ b/wrapit.typ @@ -0,0 +1,340 @@ +// https://github.com/ntjess/wrap-it?tab=readme-ov-file +#let styled = text(red)[lorem].func() + +#let _gridded(dir, fixed, to-wrap, ..kwargs) = { + let dir-kwargs = (:) + if dir not in (ltr, rtl) { + panic("Specify either `rtl` or `ltr` as the wrap direction") + } + let args = if dir == rtl { + (to-wrap, fixed) + } else { + (fixed, to-wrap) + } + grid(..args, columns: 2, rows: 2, column-gutter: 1em, ..kwargs) +} + +#let _grid-height(content, container-size) = { + measure(box(width: container-size.width, content)).height +} + +#let _get-chunk(words, end, reverse, start: 0) = { + if end < 0 { + return words.join(" ") + } + if reverse { + words = words.rev() + } + let subset = words.slice(start, end) + if reverse { + subset = subset.rev() + } + subset.join(" ") +} + +#let _get-wrap-index(height-func, words, goal-height, reverse) = { + for index in range(1, words.len(), step: 1) { + let cur-height = height-func(_get-chunk(words, index, reverse)) + if cur-height > goal-height { + return index - 1 + } + } + return -1 +} + +#let _rewrap(element, new-content) = { + let fields = element.fields() + for key in ("body", "text", "children", "child") { + if key in fields { + let _ = fields.remove(key) + } + } + let positional = (new-content,) + if "styles" in fields { + positional.push(fields.remove("styles")) + } + element.func()(..fields, ..positional) +} + +#let split-other(body, height-func, goal-height, align, splitter-func) = { + (wrapped: none, rest: body) +} + +#let split-has-text(body, height-func, goal-height, align, splitter-func) = { + let words = body.text.split(" ") + let reverse = align.y == bottom + let wrap-index = _get-wrap-index(height-func, words, goal-height, reverse) + let _rewrap = _rewrap.with(body) + if wrap-index > 0 { + let chunk = _rewrap(_get-chunk(words, wrap-index, reverse)) + let end-chunk = _rewrap(_get-chunk(words, words.len(), reverse, start: wrap-index)) + ( + wrapped: context { + chunk + linebreak(justify: par.justify) + }, + rest: end-chunk, + ) + } else { + (wrapped: none, rest: body) + } +} + +#let split-has-children(body, height-func, goal-height, align, splitter-func) = { + let reverse = align.y == bottom + let children = if reverse { + body.children.rev() + } else { + body.children + } + for (ii, child) in children.enumerate() { + let prev-children = children.slice(0, ii).join() + let new-height-func(child) = { + height-func((prev-children, child).join()) + } + let height = new-height-func(child) + if height <= goal-height { + continue + } + // height func calculator should now account for prior children + let split = splitter-func(child, new-height-func, goal-height, align) + let new-children = (..children.slice(0, ii), split.wrapped) + let new-rest = children.slice(ii + 1) + if split.rest != none { + new-rest.insert(0, split.rest) + } + if reverse { + new-children = new-children.rev() + new-rest = new-rest.rev() + } + return ( + wrapped: _rewrap(body, new-children), + rest: _rewrap(body, new-rest), + ) + } + panic("This function should only be called if the seq child should be split") +} + +#let split-has-body(body, height-func, goal-height, align, splitter-func) = { + // Elements that can be split and have a 'body' field. + let splittable = (strong, emph, underline, stroke, overline, highlight, list.item, styled) + + let new-height-func(content) = { + height-func(_rewrap(body, content)) + } + let args = (new-height-func, goal-height, align, splitter-func) + let body-text = body.at("body", default: body.at("child", default: none)) + if body.func() in splittable { + let result = splitter-func(body-text, new-height-func, goal-height, align) + if result.wrapped != none { + return (wrapped: _rewrap(body, result.wrapped), rest: _rewrap(body, result.rest)) + } else { + return split-other(body, ..args) + } + } + // Shape doesn't split nicely, so treat it as unwrappable + return split-other(body, ..args) +} + +#let splitter(body, height-func, goal-height, align) = { + let self-height = height-func(body) + if self-height <= goal-height { + return (wrapped: body, rest: none) + } + if type(body) == str { + body = text(body) + } + let body-splitter = if body.has("text") { + split-has-text + } else if body.has("body") or body.has("child") { + split-has-body + } else if body.has("children") { + split-has-children + } else { + split-other + } + return body-splitter(body, height-func, goal-height, align, splitter) +} + +#let _inner-wrap-content(to-wrap, y-align, grid-func, container-size, ..grid-kwargs) = { + let height-func(txt) = _grid-height(grid-func(txt), container-size) + let goal-height = height-func([]) + if y-align == top { + goal-height += measure(v(1em)).height + } + let result = splitter(to-wrap, height-func, goal-height, y-align) + if y-align == top { + grid-func(result.wrapped) + result.rest + } else { + result.rest + grid-func(result.wrapped) + } +} + +/// Places `to-wrap` next to `fixed`, wrapping `to-wrap` as its height overflows `fixed`. +/// +/// *Basic Use:* +/// ```typ +/// #let body = lorem(40) +/// #wrap-content(rect(fill: teal), body) +/// ``` +/// +/// *Something More Fun:* +/// ```typ +/// #set par(justify: true) +/// // Helpers; not required +/// #let grad(map) = { +/// gradient.linear( +/// ..eval("color.map." + map) +/// ) +/// } +/// #let make-fig(fill) = { +/// set figure.caption(separator: "") +/// fill = grad(fill) +/// figure( +/// rect(fill: fill, radius: 0.5em), +/// caption: [], +/// ) +/// } +/// #let (fig1, fig2) = { +/// ("viridis", "plasma").map(make-fig) +/// } +/// #wrap-content(fig1, body, align: right) +/// #wrap-content(fig2, [#body #body], align: bottom) +/// ``` +/// +/// Note that you can increase the distance between a figure's bottom and the wrapped +/// text by boxing it with an inset: +/// ```typ +/// #let spaced = box( +/// make-fig("rocket"), +/// inset: (bottom: 0.3em) +/// ) +/// #wrap-content(spaced, body) +/// ``` +/// +/// - fixed (content): Content that will not be wrapped, (i.e., a figure). +/// +/// - to-wrap (content): Content that will be wrapped, (i.e., text). Currently, logic +/// works best with pure-text content, but hypothetically will work with any `content`. +/// +/// - align (alignment): Alignment of `fixed` relative to `to-wrap`. `top` will align +/// the top of `fixed` with the top of `to-wrap`, and `bottom` will align the bottom of +/// `fixed` with the bottom of `to-wrap`. `left` and `right` alignments determine +/// horizontal alignment of `fixed` relative to `to-wrap`. Alignments can be combined, +/// i.e., `bottom + right` will align the bottom-right corner of `fixed` with the +/// bottom-right corner of `to-wrap`. +/// ```typ +/// #wrap-content( +/// make-fig("turbo"), +/// body, +/// align: bottom + right +/// ) +/// ``` +/// +/// - size (size, auto): Size of the wrapping container. If `auto`, this will be set to +/// the current container size. Otherwise, wrapping logic will attempt to stay within +/// the provided constraints. +/// +/// - ..grid-kwargs (any): Keyword arguments to pass to the underlying `grid` function. +/// Of note: +/// - `column-gutter` controls horizontal margin between `fixed` and `to-wrap`. Or, +/// you can surround the fixed content in a box with `(inset: ...)` for more +/// fine-grained control. +/// - `columns` can be set to force sizing of `fixed` and `to-wrap`. For instance, +/// `columns: (50%, 50%)` will force `fixed` and `to-wrap` to each take up half +/// of the available space. If content isn't this big, the fill will be blank +/// margin. +/// ```typ +/// #let spaced = box( +/// make-fig("mako"), inset: 0.5em +/// ) +/// #wrap-content(spaced, body) +/// ``` +/// ```typ +/// #wrap-content( +/// make-fig("spectral"), +/// body, +/// align: bottom, +/// columns: (50%, 50%), +/// ) +/// ``` +/// +#let wrap-content( + fixed, + to-wrap, + align: top + left, + size: auto, + ..grid-kwargs, +) = { + if center in (align.x, align.y) { + panic("Center alignment is not supported") + } + + // "none" x alignment defaults to left + let dir = if align.x == right { + rtl + } else { + ltr + } + let gridded(..args) = box(_gridded(dir, fixed, ..grid-kwargs, ..args)) + // "none" y alignment defaults to top + let y-align = if align.y == bottom { + bottom + } else { + top + } + + if size != auto { + _inner-wrap-content(to-wrap, y-align, gridded, size, ..grid-kwargs) + } else { + layout(container-size => { + _inner-wrap-content(to-wrap, y-align, gridded, container-size, ..grid-kwargs) + }) + } +} + +/// Wrap a body of text around two pieces of content. The logic only works if enough text +/// exists to overflow both the top and bottom content. Use this instead of 2 separate +/// `wrap-content` calls if you want to avoid a paragraph break between the top and bottom +/// content. +/// +/// *Example:* +/// ```typ +/// #let fig1 = make-fig("inferno") +/// #let fig2 = make-fig("rainbow") +/// #wrap-top-bottom(fig1, fig2, lorem(60)) +/// ``` +/// - top-fixed (content): Content that will not be wrapped, (i.e., a figure). +/// - bottom-fixed (content): Content that will not be wrapped, (i.e., a figure). +/// - body (content): Content that will be wrapped, (i.e., text) +/// - top-kwargs (any): Keyword arguments to pass to the underlying `wrap-content` function +/// for the top content. `x` alignment is kept (left/right), but `y` alignment is +/// overridden to `top`. +/// - bottom-kwargs (any): Keyword arguments to pass to the underlying `wrap-content` function +/// for the bottom content. `x` alignment is kept (left/right), but `y` alignment is +/// overridden to `bottom`. +/// +#let wrap-top-bottom( + top-fixed, + bottom-fixed, + body, + top-kwargs: (:), + bottom-kwargs: (:), +) = { + top-kwargs = top-kwargs + ( + align: top-kwargs.at("align", default: top + left).x + top, + ) + bottom-kwargs = bottom-kwargs + ( + align: bottom-kwargs.at("align", default: bottom + right).x + bottom, + ) + layout(size => { + let wrapfig(..args) = wrap-content(size: size, ..args) + wrapfig(top-fixed, ..top-kwargs)[ + #wrapfig(bottom-fixed, ..bottom-kwargs)[ + #body + ] + ] + }) +} From eace89411b2fd92bf82c7f3f856565e4fdcffbec Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 16:52:51 +0100 Subject: [PATCH 56/61] fix(content): Remove duplicate Roskilde University --- content.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.yml b/content.yml index af23b8b..b647213 100644 --- a/content.yml +++ b/content.yml @@ -143,7 +143,7 @@ experience: typeid: 1 title: de: Redaktionsarbeit, Soziale Absicherung und Widerstandsfähigkeit - en: Editorial work, Social Protection and Resilience, Roskilde University + en: Editorial work, Social Protection and Resilience place: de: Universität Roskilde en: Roskilde University From 21d201076243e3025145cb26a1f8532f5f84db66 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 18 Mar 2025 17:00:01 +0100 Subject: [PATCH 57/61] ref(repo): Refactor resume into single importable function Moved all 'behind-the-scenes' structure to 'lib/' folder and made resume importable as the main utility. --- .gitignore | 2 +- cv.typ | 161 ++-------------------------------- lib.typ => lib/lib.typ | 0 lib/resume.typ | 162 ++++++++++++++++++++++++++++++++++ wrapit.typ => lib/wrapit.typ | 0 resume.typ | 164 +---------------------------------- 6 files changed, 171 insertions(+), 318 deletions(-) rename lib.typ => lib/lib.typ (100%) create mode 100644 lib/resume.typ rename wrapit.typ => lib/wrapit.typ (100%) diff --git a/.gitignore b/.gitignore index c5bc47a..0dd50d0 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ dist/ downloads/ eggs/ .eggs/ -lib/ lib64/ parts/ sdist/ @@ -62,6 +61,7 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST +# lib/ # PyInstaller # Usually these files are written by a python script from a template diff --git a/cv.typ b/cv.typ index 19a5459..643ee39 100644 --- a/cv.typ +++ b/cv.typ @@ -1,157 +1,8 @@ -#import "lib.typ": * +#import "lib/resume.typ": resume -#let cv(contents, use_sidebar: false) = { - show: style - show: smartypants - set text(lang: lang) - - let date_formatting = { - if lang == "de" { - "[day]. [month repr:long] [year]" - } else { - "[month repr:long] [day], [year]" - } - } - set page( - paper: "a4", - margin: (x: 0.9cm, y: 1.3cm), - footer: [ - #set text( - fill: luma(200), - size: 8pt, - ) - #_columns_3[ - #smallcaps[#datetime.today().display(date_formatting)] - ][ - #smallcaps[#contents.about.fullname] - ][ - #context counter(page).display() - ] - ], - ) - - set par(justify: true) - - header(contents.about) - - let body = { - if "summary" in contents { - section( - title: "", - { - contents.summary.at(lang) - }, - ) - } - - if "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title, entries: contents.experience)[] - } - - if "education" in contents { - let title = (en: "Education", de: "Ausbildung").at(lang) - section(title: title, entries: contents.thesis + contents.education)[] - } - - if not use_sidebar { - if "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - section(title: title, entries: contents.volunteering)[] - } - - if "skills" in contents { - let title = (en: "Qualifications", de: "Qualifikationen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.skills) - }, - ) - } - - if "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.languages) - }, - ) - } - } - } - - let sidebar = { - if "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - [== #title] - for e in contents.volunteering { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } - } - - if "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - [== #title] - sidebar_entry(item: contents.languages, is_sidebar: true) - [\ ] - } - - if "skills" in contents { - let title = (en: "Qualifications", de: "Kenntnisse").at(lang) - [== #title] - sidebar_entry(item: contents.skills, is_sidebar: true) - } - } - - if not use_sidebar { - body - return - } - let margin = 1pt - grid( - columns: (2fr, 1fr), - block( - outset: 0pt, - inset: (top: 0.4 * margin, right: 0pt, rest: margin), - stroke: none, - width: 100%, - { - set block(above: 10pt) - show heading.where(level: 1): it => style(s => { - let h = text(size: 18pt, upper(it)) - let dim = measure(h, s) - stack( - dir: ltr, - h, - place( - dy: 7pt, - dx: 10pt, - horizon + left, - line(stroke: accent-color, length: 100% - dim.width - 10pt), - ), - ) - }) - body - }, - ), - { - v(20pt) - set block(inset: (left: 20 * margin, right: 20 * margin)) - show heading: it => align(right, upper(it)) - set list(marker: "") - show list: it => { - set par(justify: false) - align(right, block(it)) - } - sidebar - }, - ) -} - -#cv.with(use_sidebar: false)(yaml("content.yml")) +#resume.with( + content: yaml("content.yml"), + main: ("summary", "experience", "education", "volunteering", "skills", "languages"), + sidebar:(), +) diff --git a/lib.typ b/lib/lib.typ similarity index 100% rename from lib.typ rename to lib/lib.typ diff --git a/lib/resume.typ b/lib/resume.typ new file mode 100644 index 0000000..e01dcf2 --- /dev/null +++ b/lib/resume.typ @@ -0,0 +1,162 @@ +#import "lib.typ": * +#import "wrapit.typ": * + +#let create_body(main: (), contents: (:)) = { + for item in main { + if item == "summary" and "summary" in contents { + section( + title: "", + { + contents.summary.at(lang) + }, + ) + } + + if item == "experience_by_type" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_experience_type(experience: contents.experience, type: contents.experience_types) + } + if item == "experience_by_client" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title)[] + by_client(experience: contents.experience) + } + if item == "experience" and "experience" in contents { + let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) + section(title: title, entries: contents.experience)[] + } + + if item == "education" and "education" in contents { + let title = (en: "Education", de: "Ausbildung").at(lang) + section(title: title, entries: contents.thesis + contents.education)[] + } + + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + section(title: title, entries: contents.volunteering)[] + } + + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Qualifikationen").at(lang) + section( + title: title, + { + sidebar_entry(item: contents.skills) + }, + ) + } + + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + section( + title: title, + { + sidebar_entry(item: contents.languages) + }, + ) + } + } +} + +#let create_sidebar(sidebar: (), contents: (:)) = { + for item in sidebar { + if item == "volunteering" and "volunteering" in contents { + let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) + [== #title] + for e in contents.at("volunteering") { + [ + - *#e.title.at(lang)* (#e.date.at(lang)) + #par(e.bullets.at(0).at(lang)) \ + ] + } + } + + if item == "languages" and "languages" in contents { + let title = (en: "Languages", de: "Sprachen").at(lang) + [== #title] + sidebar_entry(item: contents.languages, is_sidebar: true) + [\ ] + } + + if item == "skills" and "skills" in contents { + let title = (en: "Qualifications", de: "Kenntnisse").at(lang) + [== #title] + sidebar_entry(item: contents.skills, is_sidebar: true) + } + } +} + +#let resume(contents, main: ("experience_by_type", "education"), sidebar: ("volunteering", "languages", "skills")) = { + show: style + set text(lang: lang) + + let date_formatting = { + if lang == "de" { + "[day]. [month repr:long] [year]" + } else { + "[month repr:long] [day], [year]" + } + } + set page( + paper: "a4", + margin: (x: 0.9cm, y: 1.3cm), + footer: [ + #set text( + fill: luma(200), + size: 8pt, + ) + #_columns_3[ + #smallcaps[#datetime.today().display(date_formatting)] + ][ + #smallcaps[#contents.about.fullname] + ][ + #context counter(page).display() + ] + ], + ) + + set par(justify: true) + + header(contents.about) + + set block(above: 10pt) + show heading.where(level: 1): it => style(s => { + let h = text(size: 18pt, upper(it)) + let dim = measure(h, s) + stack( + dir: ltr, + h, + place( + dy: 7pt, + dx: 10pt, + horizon + left, + line(stroke: accent-color, length: 100% - dim.width - 10pt), + ), + ) + }) + + let margin = 1pt + let sb = if sidebar.len() > 0 { + block( + fill: luma(230), + inset: (top: 15 * margin, left: 10 * margin, right: 15 * margin, bottom: 15 * margin), + { + show heading: it => align(right, upper(it)) + set list(marker: "") + show list: it => { + set par(justify: false) + align(right, block(it)) + } + create_sidebar(sidebar: sidebar, contents: contents) + }, + ) + } else { [] } + wrap-content( + sb, + create_body(main: main, contents: contents), + align: top + right, + columns: (auto, 30%), + ) +} + diff --git a/wrapit.typ b/lib/wrapit.typ similarity index 100% rename from wrapit.typ rename to lib/wrapit.typ diff --git a/resume.typ b/resume.typ index 4c9f55c..f94862c 100644 --- a/resume.typ +++ b/resume.typ @@ -1,163 +1,3 @@ -#import "lib.typ": * -#import "wrapit.typ": * +#import "lib/resume.typ": resume -#let create_body(main: (), contents: (:)) = { - for item in main { - if item == "summary" and "summary" in contents { - section( - title: "", - { - contents.summary.at(lang) - }, - ) - } - - if item == "experience_by_type" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_experience_type(experience: contents.experience, type: contents.experience_types) - } - if item == "experience_by_client" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title)[] - by_client(experience: contents.experience) - } - if item == "experience" and "experience" in contents { - let title = (en: "Professional Experience", de: "Berufserfahrung").at(lang) - section(title: title, entries: contents.experience)[] - } - - if item == "education" and "education" in contents { - let title = (en: "Education", de: "Ausbildung").at(lang) - section(title: title, entries: contents.thesis + contents.education)[] - } - - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - section(title: title, entries: contents.volunteering)[] - } - - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Qualifikationen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.skills) - }, - ) - } - - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - section( - title: title, - { - sidebar_entry(item: contents.languages) - }, - ) - } - } -} - -#let create_sidebar(sidebar: (), contents: (:)) = { - for item in sidebar { - if item == "volunteering" and "volunteering" in contents { - let title = (en: "Volunteer Work", de: "Ehrenamt").at(lang) - [== #title] - for e in contents.at("volunteering") { - [ - - *#e.title.at(lang)* (#e.date.at(lang)) - #par(e.bullets.at(0).at(lang)) \ - ] - } - } - - if item == "languages" and "languages" in contents { - let title = (en: "Languages", de: "Sprachen").at(lang) - [== #title] - sidebar_entry(item: contents.languages, is_sidebar: true) - [\ ] - } - - if item == "skills" and "skills" in contents { - let title = (en: "Qualifications", de: "Kenntnisse").at(lang) - [== #title] - sidebar_entry(item: contents.skills, is_sidebar: true) - } - } -} - -#let resume(contents, main: ("experience", "education"), sidebar: ("volunteering", "languages", "skills")) = { - show: style - set text(lang: lang) - - let date_formatting = { - if lang == "de" { - "[day]. [month repr:long] [year]" - } else { - "[month repr:long] [day], [year]" - } - } - set page( - paper: "a4", - margin: (x: 0.9cm, y: 1.3cm), - footer: [ - #set text( - fill: luma(200), - size: 8pt, - ) - #_columns_3[ - #smallcaps[#datetime.today().display(date_formatting)] - ][ - #smallcaps[#contents.about.fullname] - ][ - #context counter(page).display() - ] - ], - ) - - set par(justify: true) - - header(contents.about) - - set block(above: 10pt) - show heading.where(level: 1): it => style(s => { - let h = text(size: 18pt, upper(it)) - let dim = measure(h, s) - stack( - dir: ltr, - h, - place( - dy: 7pt, - dx: 10pt, - horizon + left, - line(stroke: accent-color, length: 100% - dim.width - 10pt), - ), - ) - }) - - let margin = 1pt - let sb = if sidebar.len() > 0 { - block( - fill: luma(230), - inset: (top: 15 * margin, left: 10 * margin, right: 15 * margin, bottom: 15 * margin), - { - show heading: it => align(right, upper(it)) - set list(marker: "") - show list: it => { - set par(justify: false) - align(right, block(it)) - } - create_sidebar(sidebar: sidebar, contents: contents) - }, - ) - } else { [] } - wrap-content( - sb, - create_body(main: main, contents: contents), - align: top + right, - columns: (auto, 30%), - ) -} - -#resume(yaml("content.yml")) +#resume.with()(yaml("content.yml")) From 51b43f4d9ce7bba34a15ac184468deef35384b7b Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 19 Mar 2025 12:53:51 +0100 Subject: [PATCH 58/61] ref(lib): Move all logic to lib The *.typ files in root will only make use of the backing library, invoking the bare mininum. From b061d853bc6c9288e4c924216c9a1e86191cce4f Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 19 Mar 2025 14:15:43 +0100 Subject: [PATCH 59/61] fix(cv): Fix CV creation --- cv.typ | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cv.typ b/cv.typ index 643ee39..4f8333e 100644 --- a/cv.typ +++ b/cv.typ @@ -1,8 +1,7 @@ #import "lib/resume.typ": resume #resume.with( - content: yaml("content.yml"), main: ("summary", "experience", "education", "volunteering", "skills", "languages"), - sidebar:(), -) + sidebar:() +)(yaml("content.yml")) From 434cb0717e988440d622bdaad34a22e7bef988ae Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 19 Mar 2025 14:19:26 +0100 Subject: [PATCH 60/61] fix(cv): Remove summary from CV --- cv.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.typ b/cv.typ index 4f8333e..c1f6971 100644 --- a/cv.typ +++ b/cv.typ @@ -1,7 +1,7 @@ #import "lib/resume.typ": resume #resume.with( - main: ("summary", "experience", "education", "volunteering", "skills", "languages"), + main: ("experience", "education", "volunteering", "skills", "languages"), sidebar:() )(yaml("content.yml")) From 1e6c9059e8bb9e0fad6e21f5d05315e9478ddd19 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 26 Mar 2025 17:54:23 +0100 Subject: [PATCH 61/61] feat(content): Add event logistics experience --- content.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/content.yml b/content.yml index b647213..4c29388 100644 --- a/content.yml +++ b/content.yml @@ -62,6 +62,23 @@ experience: en: "Implementation of a 'scoping review': Comprehensive source research to the extent of 2000 candidates" - de: Editorielle Vorbereitung eines Arbeitspapiers auf eine Veröffentlichung durch wissenschaftlichen Verlag en: Editorial adaptation from a working paper towards a journal article ready for publishing + - date: + de: 2023--2024 + en: 2023--2024 + typeid: 2 + title: + de: Eventlogistik, Eventverwaltung und Logistikkoordination + en: Event logistics, event management and logistics coordination + place: + de: Belantis & EmiR Entertainment + en: Belantis & EmiR Entertainment + bullets: + - de: Betreuung des Aufbaus von Publikumsevents zwischen 100 und 1000 Gästen + en: Event setup for public events accommodating between 100 and 1000 guests + - de: Durchführung von Logistikarbeiten zur Vorbereitung der Eventflächen + en: Execution of logistics tasks in preparation for the respective event areas + - de: Verlagerung und Platzierung von Dekorations- und funktionellen Elementen an verschiedenen Standorten + en: Relocation and placement of decorative and functinoal elements at various locations - date: de: 2023--2024 en: 2023--2024