diff --git a/README.md b/README.md
index 47c9933..c410a03 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,9 @@
-# pipable
+# Pipable
[![ci-badge]][ci-url] [![pypi-badge]][pypi-url] [![MIT-badge]][MIT-url] [![black-badge]][black-url]
> pipe operation in python
-- [docs](https://hoishing.github.io/pipable)
-
## Quick Start
### Create the Pipe Object
@@ -92,6 +90,8 @@ def concat(**kwargs):
dict(b="boy", c="cat") << concat # "b-boy, c-cat"
```
+- refer the [docs](https://hoishing.github.io/pipable/reference) for details
+
## Motivation
Pipe operation is a handy feature in functional programming. It allows us to:
@@ -108,7 +108,7 @@ There are packages, such as [pipe] take the similar approach. It works great wit
How can I assign value to the first argument?
-Assign it within a wrapper function
+use a wrapper function
```python
square = Pipe(lambda x: pow(x, 2))
@@ -146,18 +146,21 @@ def wrapper(first, others):
## Need Help?
-Open a [github issue] or ping me on [Twitter ![twitter-icon]][Twitter]
+[![git-logo] github issue][github issue]
-[github issue]: https://github.com/hoishing/pipable/issues
-[Twitter]: https://twitter.com/hoishing
-[twitter-icon]: https://api.iconify.design/logos/twitter.svg?width=20
+[![x-logo] posts][x-post]
+
+[black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg
+[black-url]: https://github.com/psf/black
[ci-badge]: https://github.com/hoishing/pipable/actions/workflows/ci.yml/badge.svg
[ci-url]: https://github.com/hoishing/pipable/actions/workflows/ci.yml
+[Coconut]: https://github.com/evhub/coconut
+[git-logo]: https://api.iconify.design/bi/github.svg?color=%236FD886&width=20
+[github issue]: https://github.com/hoishing/pipable/issues
[MIT-badge]: https://img.shields.io/github/license/hoishing/pipable
[MIT-url]: https://opensource.org/licenses/MIT
+[pipe]: https://pypi.org/project/pipe
[pypi-badge]: https://img.shields.io/pypi/v/pipable
[pypi-url]: https://pypi.org/project/pipable/
-[black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg
-[black-url]: https://github.com/psf/black
-[pipe]: https://pypi.org/project/pipe
-[Coconut]: https://github.com/evhub/coconut
+[x-logo]: https://api.iconify.design/ri:twitter-x-fill.svg?width=20&color=DarkGray
+[x-post]: https://x.com/hoishing
diff --git a/docs/assets/coverage-badge.svg b/docs/assets/coverage-badge.svg
deleted file mode 100644
index ebb24e9..0000000
--- a/docs/assets/coverage-badge.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/assets/coverage-report.xml b/docs/assets/coverage-report.xml
deleted file mode 100644
index 01ae6df..0000000
--- a/docs/assets/coverage-report.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/coverage/coverage_html.js b/docs/assets/coverage/coverage_html.js
deleted file mode 100644
index 1c4eb98..0000000
--- a/docs/assets/coverage/coverage_html.js
+++ /dev/null
@@ -1,604 +0,0 @@
-// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
-// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
-
-// Coverage.py HTML report browser code.
-/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
-/*global coverage: true, document, window, $ */
-
-coverage = {};
-
-// General helpers
-function debounce(callback, wait) {
- let timeoutId = null;
- return function(...args) {
- clearTimeout(timeoutId);
- timeoutId = setTimeout(() => {
- callback.apply(this, args);
- }, wait);
- };
-};
-
-function checkVisible(element) {
- const rect = element.getBoundingClientRect();
- const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight);
- const viewTop = 30;
- return !(rect.bottom < viewTop || rect.top >= viewBottom);
-}
-
-function on_click(sel, fn) {
- const elt = document.querySelector(sel);
- if (elt) {
- elt.addEventListener("click", fn);
- }
-}
-
-// Helpers for table sorting
-function getCellValue(row, column = 0) {
- const cell = row.cells[column]
- if (cell.childElementCount == 1) {
- const child = cell.firstElementChild
- if (child instanceof HTMLTimeElement && child.dateTime) {
- return child.dateTime
- } else if (child instanceof HTMLDataElement && child.value) {
- return child.value
- }
- }
- return cell.innerText || cell.textContent;
-}
-
-function rowComparator(rowA, rowB, column = 0) {
- let valueA = getCellValue(rowA, column);
- let valueB = getCellValue(rowB, column);
- if (!isNaN(valueA) && !isNaN(valueB)) {
- return valueA - valueB
- }
- return valueA.localeCompare(valueB, undefined, {numeric: true});
-}
-
-function sortColumn(th) {
- // Get the current sorting direction of the selected header,
- // clear state on other headers and then set the new sorting direction
- const currentSortOrder = th.getAttribute("aria-sort");
- [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none"));
- if (currentSortOrder === "none") {
- th.setAttribute("aria-sort", th.dataset.defaultSortOrder || "ascending");
- } else {
- th.setAttribute("aria-sort", currentSortOrder === "ascending" ? "descending" : "ascending");
- }
-
- const column = [...th.parentElement.cells].indexOf(th)
-
- // Sort all rows and afterwards append them in order to move them in the DOM
- Array.from(th.closest("table").querySelectorAll("tbody tr"))
- .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (th.getAttribute("aria-sort") === "ascending" ? 1 : -1))
- .forEach(tr => tr.parentElement.appendChild(tr) );
-}
-
-// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key.
-coverage.assign_shortkeys = function () {
- document.querySelectorAll("[data-shortcut]").forEach(element => {
- document.addEventListener("keypress", event => {
- if (event.target.tagName.toLowerCase() === "input") {
- return; // ignore keypress from search filter
- }
- if (event.key === element.dataset.shortcut) {
- element.click();
- }
- });
- });
-};
-
-// Create the events for the filter box.
-coverage.wire_up_filter = function () {
- // Cache elements.
- const table = document.querySelector("table.index");
- const table_body_rows = table.querySelectorAll("tbody tr");
- const no_rows = document.getElementById("no_rows");
-
- // Observe filter keyevents.
- document.getElementById("filter").addEventListener("input", debounce(event => {
- // Keep running total of each metric, first index contains number of shown rows
- const totals = new Array(table.rows[0].cells.length).fill(0);
- // Accumulate the percentage as fraction
- totals[totals.length - 1] = { "numer": 0, "denom": 0 };
-
- // Hide / show elements.
- table_body_rows.forEach(row => {
- if (!row.cells[0].textContent.includes(event.target.value)) {
- // hide
- row.classList.add("hidden");
- return;
- }
-
- // show
- row.classList.remove("hidden");
- totals[0]++;
-
- for (let column = 1; column < totals.length; column++) {
- // Accumulate dynamic totals
- cell = row.cells[column]
- if (column === totals.length - 1) {
- // Last column contains percentage
- const [numer, denom] = cell.dataset.ratio.split(" ");
- totals[column]["numer"] += parseInt(numer, 10);
- totals[column]["denom"] += parseInt(denom, 10);
- } else {
- totals[column] += parseInt(cell.textContent, 10);
- }
- }
- });
-
- // Show placeholder if no rows will be displayed.
- if (!totals[0]) {
- // Show placeholder, hide table.
- no_rows.style.display = "block";
- table.style.display = "none";
- return;
- }
-
- // Hide placeholder, show table.
- no_rows.style.display = null;
- table.style.display = null;
-
- const footer = table.tFoot.rows[0];
- // Calculate new dynamic sum values based on visible rows.
- for (let column = 1; column < totals.length; column++) {
- // Get footer cell element.
- const cell = footer.cells[column];
-
- // Set value into dynamic footer cell element.
- if (column === totals.length - 1) {
- // Percentage column uses the numerator and denominator,
- // and adapts to the number of decimal places.
- const match = /\.([0-9]+)/.exec(cell.textContent);
- const places = match ? match[1].length : 0;
- const { numer, denom } = totals[column];
- cell.dataset.ratio = `${numer} ${denom}`;
- // Check denom to prevent NaN if filtered files contain no statements
- cell.textContent = denom
- ? `${(numer * 100 / denom).toFixed(places)}%`
- : `${(100).toFixed(places)}%`;
- } else {
- cell.textContent = totals[column];
- }
- }
- }));
-
- // Trigger change event on setup, to force filter on page refresh
- // (filter value may still be present).
- document.getElementById("filter").dispatchEvent(new Event("input"));
-};
-
-coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2";
-
-// Loaded on index.html
-coverage.index_ready = function () {
- coverage.assign_shortkeys();
- coverage.wire_up_filter();
- document.querySelectorAll("[data-sortable] th[aria-sort]").forEach(
- th => th.addEventListener("click", e => sortColumn(e.target))
- );
-
- // Look for a localStorage item containing previous sort settings:
- const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE);
-
- if (stored_list) {
- const {column, direction} = JSON.parse(stored_list);
- const th = document.querySelector("[data-sortable]").tHead.rows[0].cells[column];
- th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending");
- th.click()
- }
-
- // Watch for page unload events so we can save the final sort settings:
- window.addEventListener("unload", function () {
- const th = document.querySelector('[data-sortable] th[aria-sort="ascending"], [data-sortable] [aria-sort="descending"]');
- if (!th) {
- return;
- }
- localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({
- column: [...th.parentElement.cells].indexOf(th),
- direction: th.getAttribute("aria-sort"),
- }));
- });
-
- on_click(".button_prev_file", coverage.to_prev_file);
- on_click(".button_next_file", coverage.to_next_file);
-
- on_click(".button_show_hide_help", coverage.show_hide_help);
-};
-
-// -- pyfile stuff --
-
-coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS";
-
-coverage.pyfile_ready = function () {
- // If we're directed to a particular line number, highlight the line.
- var frag = location.hash;
- if (frag.length > 2 && frag[1] === 't') {
- document.querySelector(frag).closest(".n").classList.add("highlight");
- coverage.set_sel(parseInt(frag.substr(2), 10));
- } else {
- coverage.set_sel(0);
- }
-
- on_click(".button_toggle_run", coverage.toggle_lines);
- on_click(".button_toggle_mis", coverage.toggle_lines);
- on_click(".button_toggle_exc", coverage.toggle_lines);
- on_click(".button_toggle_par", coverage.toggle_lines);
-
- on_click(".button_next_chunk", coverage.to_next_chunk_nicely);
- on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely);
- on_click(".button_top_of_page", coverage.to_top);
- on_click(".button_first_chunk", coverage.to_first_chunk);
-
- on_click(".button_prev_file", coverage.to_prev_file);
- on_click(".button_next_file", coverage.to_next_file);
- on_click(".button_to_index", coverage.to_index);
-
- on_click(".button_show_hide_help", coverage.show_hide_help);
-
- coverage.filters = undefined;
- try {
- coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE);
- } catch(err) {}
-
- if (coverage.filters) {
- coverage.filters = JSON.parse(coverage.filters);
- }
- else {
- coverage.filters = {run: false, exc: true, mis: true, par: true};
- }
-
- for (cls in coverage.filters) {
- coverage.set_line_visibilty(cls, coverage.filters[cls]);
- }
-
- coverage.assign_shortkeys();
- coverage.init_scroll_markers();
- coverage.wire_up_sticky_header();
-
- // Rebuild scroll markers when the window height changes.
- window.addEventListener("resize", coverage.build_scroll_markers);
-};
-
-coverage.toggle_lines = function (event) {
- const btn = event.target.closest("button");
- const category = btn.value
- const show = !btn.classList.contains("show_" + category);
- coverage.set_line_visibilty(category, show);
- coverage.build_scroll_markers();
- coverage.filters[category] = show;
- try {
- localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters));
- } catch(err) {}
-};
-
-coverage.set_line_visibilty = function (category, should_show) {
- const cls = "show_" + category;
- const btn = document.querySelector(".button_toggle_" + category);
- if (btn) {
- if (should_show) {
- document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls));
- btn.classList.add(cls);
- }
- else {
- document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls));
- btn.classList.remove(cls);
- }
- }
-};
-
-// Return the nth line div.
-coverage.line_elt = function (n) {
- return document.getElementById("t" + n)?.closest("p");
-};
-
-// Set the selection. b and e are line numbers.
-coverage.set_sel = function (b, e) {
- // The first line selected.
- coverage.sel_begin = b;
- // The next line not selected.
- coverage.sel_end = (e === undefined) ? b+1 : e;
-};
-
-coverage.to_top = function () {
- coverage.set_sel(0, 1);
- coverage.scroll_window(0);
-};
-
-coverage.to_first_chunk = function () {
- coverage.set_sel(0, 1);
- coverage.to_next_chunk();
-};
-
-coverage.to_prev_file = function () {
- window.location = document.getElementById("prevFileLink").href;
-}
-
-coverage.to_next_file = function () {
- window.location = document.getElementById("nextFileLink").href;
-}
-
-coverage.to_index = function () {
- location.href = document.getElementById("indexLink").href;
-}
-
-coverage.show_hide_help = function () {
- const helpCheck = document.getElementById("help_panel_state")
- helpCheck.checked = !helpCheck.checked;
-}
-
-// Return a string indicating what kind of chunk this line belongs to,
-// or null if not a chunk.
-coverage.chunk_indicator = function (line_elt) {
- const classes = line_elt?.className;
- if (!classes) {
- return null;
- }
- const match = classes.match(/\bshow_\w+\b/);
- if (!match) {
- return null;
- }
- return match[0];
-};
-
-coverage.to_next_chunk = function () {
- const c = coverage;
-
- // Find the start of the next colored chunk.
- var probe = c.sel_end;
- var chunk_indicator, probe_line;
- while (true) {
- probe_line = c.line_elt(probe);
- if (!probe_line) {
- return;
- }
- chunk_indicator = c.chunk_indicator(probe_line);
- if (chunk_indicator) {
- break;
- }
- probe++;
- }
-
- // There's a next chunk, `probe` points to it.
- var begin = probe;
-
- // Find the end of this chunk.
- var next_indicator = chunk_indicator;
- while (next_indicator === chunk_indicator) {
- probe++;
- probe_line = c.line_elt(probe);
- next_indicator = c.chunk_indicator(probe_line);
- }
- c.set_sel(begin, probe);
- c.show_selection();
-};
-
-coverage.to_prev_chunk = function () {
- const c = coverage;
-
- // Find the end of the prev colored chunk.
- var probe = c.sel_begin-1;
- var probe_line = c.line_elt(probe);
- if (!probe_line) {
- return;
- }
- var chunk_indicator = c.chunk_indicator(probe_line);
- while (probe > 1 && !chunk_indicator) {
- probe--;
- probe_line = c.line_elt(probe);
- if (!probe_line) {
- return;
- }
- chunk_indicator = c.chunk_indicator(probe_line);
- }
-
- // There's a prev chunk, `probe` points to its last line.
- var end = probe+1;
-
- // Find the beginning of this chunk.
- var prev_indicator = chunk_indicator;
- while (prev_indicator === chunk_indicator) {
- probe--;
- if (probe <= 0) {
- return;
- }
- probe_line = c.line_elt(probe);
- prev_indicator = c.chunk_indicator(probe_line);
- }
- c.set_sel(probe+1, end);
- c.show_selection();
-};
-
-// Returns 0, 1, or 2: how many of the two ends of the selection are on
-// the screen right now?
-coverage.selection_ends_on_screen = function () {
- if (coverage.sel_begin === 0) {
- return 0;
- }
-
- const begin = coverage.line_elt(coverage.sel_begin);
- const end = coverage.line_elt(coverage.sel_end-1);
-
- return (
- (checkVisible(begin) ? 1 : 0)
- + (checkVisible(end) ? 1 : 0)
- );
-};
-
-coverage.to_next_chunk_nicely = function () {
- if (coverage.selection_ends_on_screen() === 0) {
- // The selection is entirely off the screen:
- // Set the top line on the screen as selection.
-
- // This will select the top-left of the viewport
- // As this is most likely the span with the line number we take the parent
- const line = document.elementFromPoint(0, 0).parentElement;
- if (line.parentElement !== document.getElementById("source")) {
- // The element is not a source line but the header or similar
- coverage.select_line_or_chunk(1);
- } else {
- // We extract the line number from the id
- coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
- }
- }
- coverage.to_next_chunk();
-};
-
-coverage.to_prev_chunk_nicely = function () {
- if (coverage.selection_ends_on_screen() === 0) {
- // The selection is entirely off the screen:
- // Set the lowest line on the screen as selection.
-
- // This will select the bottom-left of the viewport
- // As this is most likely the span with the line number we take the parent
- const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement;
- if (line.parentElement !== document.getElementById("source")) {
- // The element is not a source line but the header or similar
- coverage.select_line_or_chunk(coverage.lines_len);
- } else {
- // We extract the line number from the id
- coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
- }
- }
- coverage.to_prev_chunk();
-};
-
-// Select line number lineno, or if it is in a colored chunk, select the
-// entire chunk
-coverage.select_line_or_chunk = function (lineno) {
- var c = coverage;
- var probe_line = c.line_elt(lineno);
- if (!probe_line) {
- return;
- }
- var the_indicator = c.chunk_indicator(probe_line);
- if (the_indicator) {
- // The line is in a highlighted chunk.
- // Search backward for the first line.
- var probe = lineno;
- var indicator = the_indicator;
- while (probe > 0 && indicator === the_indicator) {
- probe--;
- probe_line = c.line_elt(probe);
- if (!probe_line) {
- break;
- }
- indicator = c.chunk_indicator(probe_line);
- }
- var begin = probe + 1;
-
- // Search forward for the last line.
- probe = lineno;
- indicator = the_indicator;
- while (indicator === the_indicator) {
- probe++;
- probe_line = c.line_elt(probe);
- indicator = c.chunk_indicator(probe_line);
- }
-
- coverage.set_sel(begin, probe);
- }
- else {
- coverage.set_sel(lineno);
- }
-};
-
-coverage.show_selection = function () {
- // Highlight the lines in the chunk
- document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight"));
- for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) {
- coverage.line_elt(probe).querySelector(".n").classList.add("highlight");
- }
-
- coverage.scroll_to_selection();
-};
-
-coverage.scroll_to_selection = function () {
- // Scroll the page if the chunk isn't fully visible.
- if (coverage.selection_ends_on_screen() < 2) {
- const element = coverage.line_elt(coverage.sel_begin);
- coverage.scroll_window(element.offsetTop - 60);
- }
-};
-
-coverage.scroll_window = function (to_pos) {
- window.scroll({top: to_pos, behavior: "smooth"});
-};
-
-coverage.init_scroll_markers = function () {
- // Init some variables
- coverage.lines_len = document.querySelectorAll('#source > p').length;
-
- // Build html
- coverage.build_scroll_markers();
-};
-
-coverage.build_scroll_markers = function () {
- const temp_scroll_marker = document.getElementById('scroll_marker')
- if (temp_scroll_marker) temp_scroll_marker.remove();
- // Don't build markers if the window has no scroll bar.
- if (document.body.scrollHeight <= window.innerHeight) {
- return;
- }
-
- const marker_scale = window.innerHeight / document.body.scrollHeight;
- const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10);
-
- let previous_line = -99, last_mark, last_top;
-
- const scroll_marker = document.createElement("div");
- scroll_marker.id = "scroll_marker";
- document.getElementById('source').querySelectorAll(
- 'p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par'
- ).forEach(element => {
- const line_top = Math.floor(element.offsetTop * marker_scale);
- const line_number = parseInt(element.querySelector(".n a").id.substr(1));
-
- if (line_number === previous_line + 1) {
- // If this solid missed block just make previous mark higher.
- last_mark.style.height = `${line_top + line_height - last_top}px`;
- } else {
- // Add colored line in scroll_marker block.
- last_mark = document.createElement("div");
- last_mark.id = `m${line_number}`;
- last_mark.classList.add("marker");
- last_mark.style.height = `${line_height}px`;
- last_mark.style.top = `${line_top}px`;
- scroll_marker.append(last_mark);
- last_top = line_top;
- }
-
- previous_line = line_number;
- });
-
- // Append last to prevent layout calculation
- document.body.append(scroll_marker);
-};
-
-coverage.wire_up_sticky_header = function () {
- const header = document.querySelector('header');
- const header_bottom = (
- header.querySelector('.content h2').getBoundingClientRect().top -
- header.getBoundingClientRect().top
- );
-
- function updateHeader() {
- if (window.scrollY > header_bottom) {
- header.classList.add('sticky');
- } else {
- header.classList.remove('sticky');
- }
- }
-
- window.addEventListener('scroll', updateHeader);
- updateHeader();
-};
-
-document.addEventListener("DOMContentLoaded", () => {
- if (document.body.classList.contains("indexfile")) {
- coverage.index_ready();
- } else {
- coverage.pyfile_ready();
- }
-});
diff --git a/docs/assets/coverage/d_a44f0ac069e85531___init___py.html b/docs/assets/coverage/d_a44f0ac069e85531___init___py.html
deleted file mode 100644
index 32be160..0000000
--- a/docs/assets/coverage/d_a44f0ac069e85531___init___py.html
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- Coverage for tests/__init__.py: 100%
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/assets/coverage/d_a44f0ac069e85531_test_destructure_py.html b/docs/assets/coverage/d_a44f0ac069e85531_test_destructure_py.html
deleted file mode 100644
index 25c4d68..0000000
--- a/docs/assets/coverage/d_a44f0ac069e85531_test_destructure_py.html
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
- Coverage for tests/test_destructure.py: 100%
-
-
-
-
-
-
-
- 1from pipable import Pipe
- 2import pytest
- 3
- 4
- 5# == fixture ==
- 6@Pipe
- 7def kebab(*args):
- 8 return "-".join(args)
- 9
- 10
- 11@Pipe
- 12def concat(**kwargs):
- 13 return ", ".join([f"{k}-{v}" for k, v in kwargs.items()])
- 14
- 15
- 16# == test ==
- 17def test_iterable_precedent():
- 18 assert ["a", "b"] >> kebab == "a-b"
- 19
- 20
- 21def test_dict_precedent():
- 22 assert dict(b="boy", c="cat") << concat == "b-boy, c-cat"
-
-
-
-
diff --git a/docs/assets/coverage/d_a44f0ac069e85531_test_pipable_py.html b/docs/assets/coverage/d_a44f0ac069e85531_test_pipable_py.html
deleted file mode 100644
index 524e267..0000000
--- a/docs/assets/coverage/d_a44f0ac069e85531_test_pipable_py.html
+++ /dev/null
@@ -1,200 +0,0 @@
-
-
-
-
- Coverage for tests/test_pipable.py: 100%
-
-
-
-
-
-
-
- 1from pipable import Pipe
- 2import pytest
- 3
- 4
- 5# == fixture ==
- 6def kebab(*args):
- 7 return "-".join(args)
- 8
- 9
- 10# == test ==
- 11def test_builtn_with_single_arg():
- 12 list_ = Pipe(list)
- 13 assert "ab" | list_ == ["a", "b"]
- 14
- 15
- 16def test_precedent_assign_to_last_pos_args():
- 17 assert "c" | Pipe(kebab) == "c"
- 18 assert "c" | Pipe(kebab, "a") == "a-c"
- 19 assert "c" | Pipe(kebab, "a", "b") == "a-b-c"
- 20
- 21
- 22def test_assign_1st_arg():
- 23 base2 = Pipe(pow, 2)
- 24 assert 3 | base2 == 8
- 25
- 26
- 27def test_raise_pos_and_keyword_arg_conflict():
- 28 """
- 29 precedent will append to the positional argument list
- 30 ∴ partial can't assign 1st arg as keyword
- 31 """
- 32 base2 = Pipe(pow, base=2)
- 33 with pytest.raises(Exception):
- 34 3 | base2
- 35
- 36
- 37def test_decorator_with_single_arg():
- 38 @Pipe
- 39 def hi(name):
- 40 return f"hi {name}"
- 41
- 42 assert "May" | hi == "hi May"
- 43
- 44
- 45def test_decorator_with_multiple_arg():
- 46 @Pipe
- 47 def power(base, exp):
- 48 return base**exp
- 49
- 50 assert 3 | power(2) == 8
- 51 assert 3 | power(exp=2) == 9
- 52 # same reason with test_raise_pos_and_keyword_arg_conflict
- 53 with pytest.raises(Exception):
- 54 3 | power(base=2)
- 55
- 56
- 57def test_wrap_with_partial():
- 58 base2 = Pipe(lambda x: pow(2, x))
- 59 assert 3 | base2 == 8
- 60
- 61
- 62def test_variable_positional_args(capsys):
- 63 print_ = Pipe(print, "a", "b")
- 64 "c" | print_
- 65 stdout: str = capsys.readouterr().out
- 66 assert stdout.splitlines()[-1] == "a b c"
- 67
- 68
- 69def test_prepend_args_with_wrapper():
- 70 def wrapper(first, others):
- 71 return kebab(first, *others)
- 72
- 73 assert "c" | Pipe(wrapper, others=["a", "b"]) == "c-a-b"
- 74
- 75
- 76def test_decorator_prepend_args():
- 77 @Pipe
- 78 def wrapper(first, args):
- 79 return kebab(first, *args)
- 80
- 81 assert "c" | wrapper(args=["a", "b"]) == "c-a-b"
- 82
- 83
- 84def test_reassign_with_wrapper():
- 85 def kebab(*args):
- 86 return "-".join(args)
- 87
- 88 def wrapper(first, others):
- 89 return kebab(first, *others)
- 90
- 91 # works
- 92 assert "a" | Pipe(wrapper, others=["b", "c"]) == "a-b-c"
- 93
- 94 # works with other var name
- 95 kebab_ = Pipe(wrapper, others=["b", "c"])
- 96 assert "a" | kebab_ == "a-b-c"
- 97
- 98 # not work, ∵ original name already re-assigned when wrapper is being invoked
- 99 # it become a Pipe object instead
- 100 kebab = Pipe(wrapper, others=["b", "c"])
- 101 result = "a" | kebab
- 102 assert result != "a-b-c"
- 103 assert isinstance(result, Pipe)
-
-
-
-
diff --git a/docs/assets/coverage/d_a44f0ac069e85531_test_pump_py.html b/docs/assets/coverage/d_a44f0ac069e85531_test_pump_py.html
deleted file mode 100644
index 489e718..0000000
--- a/docs/assets/coverage/d_a44f0ac069e85531_test_pump_py.html
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
- Coverage for tests/test_pump.py: 100%
-
-
-
-
-
-
-
- 1from click.testing import CliRunner
- 2from pump import main, upgrade_version
- 3from pytest import mark
- 4
- 5
- 6def test_main():
- 7 runner = CliRunner()
- 8 result = runner.invoke(main, ["patch"])
- 9 assert result.exit_code == 0
- 10
- 11
- 12@mark.parametrize(
- 13 "input, output",
- 14 [
- 15 ("major", "1.0.0"),
- 16 ("minor", "0.2.0"),
- 17 ("patch", "0.1.2"),
- 18 ],
- 19)
- 20def test_upgrade_version(input, output):
- 21 assert upgrade_version(input, "0.1.1") == output
-
-
-
-
diff --git a/docs/assets/coverage/d_f900dd2e68629e1c___init___py.html b/docs/assets/coverage/d_f900dd2e68629e1c___init___py.html
deleted file mode 100644
index 89af189..0000000
--- a/docs/assets/coverage/d_f900dd2e68629e1c___init___py.html
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
- Coverage for pipable/__init__.py: 100%
-
-
-
-
-
-
-
- 1"""This package try to mimic pipe operation by overriding the bitwise-or operator,
- 2turn it into an infix function that take the output of previous expression as the first argument of the current function.
- 3"""
- 4
- 5from typing import Callable, Any, Iterable
- 6from functools import partial
- 7
- 8
- 9class Pipe(object):
- 10 """This class create the `Pipe` object that mimic pipe operation:
- 11
- 12 - instatiate by creating partial of existing function
- 13 - turn the bitwise-or operator `|` into an infix function that accept the output of previous expression.
- 14 ie. pipe operator
- 15 """
- 16
- 17 def __init__(self, func: Callable, /, *args, **kwargs) -> None:
- 18 """create pipable partial for the target func
- 19
- 20 Args:
- 21 func (Callable): func to be pipable
- 22 args: partial's positional args
- 23 kwargs: partial's keyword args
- 24 """
- 25 self.pipe = partial(func, *args, **kwargs)
- 26
- 27 def __ror__(self, precedent: Any):
- 28 """override the builit-in `|` operator, turn it into pipe"""
- 29 # return partial(self.func, precedent)
- 30 return self.pipe(precedent)
- 31
- 32 def __rrshift__(self, precedent: Iterable):
- 33 """override the builit-in `>>` operator, pass precedent as destructured iterable to the pipe"""
- 34 return self.pipe(*precedent)
- 35
- 36 def __rlshift__(self, precedent: dict):
- 37 """override the builit-in `>>=` operator, pass as destructured dict to the pipe"""
- 38 return self.pipe(**precedent)
- 39
- 40 def __call__(self, *args, **kwargs):
- 41 """replace arguments of the pipable partial"""
- 42 return Pipe(self.pipe.func, *args, **kwargs)
-
-
-
-
diff --git a/docs/assets/coverage/favicon_32.png b/docs/assets/coverage/favicon_32.png
deleted file mode 100644
index 8649f04..0000000
Binary files a/docs/assets/coverage/favicon_32.png and /dev/null differ
diff --git a/docs/assets/coverage/index.html b/docs/assets/coverage/index.html
deleted file mode 100644
index 8817bb4..0000000
--- a/docs/assets/coverage/index.html
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
- Coverage report
-
-
-
-
-
-
-
-
-
- No items found using the specified filter.
-
-
-
-
-
diff --git a/docs/assets/coverage/keybd_closed.png b/docs/assets/coverage/keybd_closed.png
deleted file mode 100644
index ba119c4..0000000
Binary files a/docs/assets/coverage/keybd_closed.png and /dev/null differ
diff --git a/docs/assets/coverage/keybd_open.png b/docs/assets/coverage/keybd_open.png
deleted file mode 100644
index a8bac6c..0000000
Binary files a/docs/assets/coverage/keybd_open.png and /dev/null differ
diff --git a/docs/assets/coverage/pump_py.html b/docs/assets/coverage/pump_py.html
deleted file mode 100644
index aabbbbd..0000000
--- a/docs/assets/coverage/pump_py.html
+++ /dev/null
@@ -1,226 +0,0 @@
-
-
-
-
- Coverage for pump.py: 69%
-
-
-
-
-
-
-
- 1"""Version Pump Automation
- 2
- 3- update pyproject.toml
- 4- run pytest and doctest
- 5- generate coverage report and github badges
- 6- update changelog
- 7- create new github commit, tag and release
- 8- publish new version to PyPi
- 9
- 10Examples:
- 11 - dry run
- 12 ./pump.py patch
- 13
- 14 - update pyproject.toml and local git tag
- 15 ./pump.py patch --tag
- 16
- 17 - update everything and publish new version
- 18 ./pump.py patch --tag --publish
- 19"""
- 20
- 21import toml
- 22from click import argument, Choice, option, command, secho
- 23from subprocess import getstatusoutput
- 24from functools import reduce
- 25
- 26CHOICES = ["major", "minor", "patch"]
- 27
- 28
- 29# === uti ===
- 30def abort(msg: str = "") -> None:
- 31 secho(msg or "Aborted.", fg="red")
- 32 exit(1)
- 33
- 34
- 35def run(cmd: str) -> None:
- 36 """run shell command"""
- 37 secho(cmd)
- 38 if getstatusoutput(cmd)[0]:
- 39 abort()
- 40
- 41
- 42# === main ===
- 43
- 44
- 45@command()
- 46@argument("section", type=Choice(CHOICES))
- 47@option("--tag/--no-tag", help="tag local commit with new version", default=False)
- 48@option(
- 49 "--publish/--no-publish",
- 50 help="publish to pypi and update github release",
- 51 default=False,
- 52)
- 53def main(section, tag, publish):
- 54 """Version Pump Automation CLI"""
- 55
- 56 # parse toml
- 57 data = toml.load("pyproject.toml")
- 58 old_version = data["tool"]["poetry"]["version"]
- 59 new_version = upgrade_version(section, old_version)
- 60 data["tool"]["poetry"]["version"] = new_version
- 61
- 62 print(old_version, "->", new_version)
- 63
- 64 if tag:
- 65 with open("pyproject.toml", "w") as f:
- 66 toml.dump(data, f)
- 67 print(f"pyproject.toml pumped to {new_version}")
- 68
- 69 run(f"git tag {new_version}")
- 70
- 71 # publish to pypi, update github release, commit changelog
- 72 if publish:
- 73 cmds = [
- 74 "git push --tag",
- 75 # run test w/ coverage
- 76 "coverage run -m pytest --doctest-modules",
- 77 "coverage report",
- 78 # create html report for docs
- 79 "coverage html -d docs/assets/coverage",
- 80 "if [ -f docs/assets/coverage/.gitignore ]; then rm docs/assets/coverage/.gitignore; fi",
- 81 # not use `coverage.xml` to avoid ignore
- 82 "coverage xml -o docs/assets/coverage-report.xml",
- 83 # create coverage badge
- 84 "genbadge coverage -i docs/assets/coverage-report.xml -o docs/assets/coverage-badge.svg",
- 85 # update changelog
- 86 "auto-changelog",
- 87 '[ -x "$(command -v prettier)" ] && prettier -w CHANGELOG.md',
- 88 # commit docs and changelog Δ
- 89 'git add . && git cm -am "chore: update changelog, version pump" && git push',
- 90 # clear previous built assets
- 91 "rm -rf dist/*",
- 92 # build and publish to pypi
- 93 "poetry publish --build",
- 94 # update github release to the current tag
- 95 "gh release create $(git describe --tags --abbrev=0) --generate-notes ./dist/*",
- 96 ]
- 97
- 98 for cmd in cmds:
- 99 run(cmd)
- 100
- 101
- 102def upgrade_version(section: str, old_version: str) -> str:
- 103 """upgrade new version from old version
- 104
- 105 Tests:
- 106 >>> upgrade_version('major', '0.1.1')
- 107 '1.0.0'
- 108
- 109 >>> upgrade_version('minor', '0.1.1')
- 110 '0.2.0'
- 111
- 112 >>> upgrade_version('patch', '0.1.1')
- 113 '0.1.2'
- 114 """
- 115 ver_dict = {k: int(v) for k, v in zip(CHOICES, old_version.split("."))}
- 116
- 117 # pump version
- 118 ver_dict[section] += 1
- 119
- 120 # reset sub-version num
- 121 match section:
- 122 case "minor":
- 123 ver_dict["patch"] = 0
- 124 case "major":
- 125 ver_dict["patch"] = 0
- 126 ver_dict["minor"] = 0
- 127
- 128 new_version = reduce("{}.{}".format, ver_dict.values())
- 129 return new_version
-
-
-
-
diff --git a/docs/assets/coverage/status.json b/docs/assets/coverage/status.json
deleted file mode 100644
index 4c5a40a..0000000
--- a/docs/assets/coverage/status.json
+++ /dev/null
@@ -1 +0,0 @@
-{"format":2,"version":"7.1.0","globals":"ea1bb29a5a108ff9eafb1729df592c41","files":{"d_f900dd2e68629e1c___init___py":{"hash":"11fc8ab188f73ed1816e76fc80130ecd","index":{"nums":[0,1,13,0,0,0,0,0],"html_filename":"d_f900dd2e68629e1c___init___py.html","relative_filename":"pipable/__init__.py"}},"pump_py":{"hash":"bc540948d3db605296349d38432c1027","index":{"nums":[0,1,42,0,13,0,0,0],"html_filename":"pump_py.html","relative_filename":"pump.py"}},"d_a44f0ac069e85531___init___py":{"hash":"e6baa73cda2916dad605215f937a92e1","index":{"nums":[0,1,0,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531___init___py.html","relative_filename":"tests/__init__.py"}},"d_a44f0ac069e85531_test_destructure_py":{"hash":"2ad2d17468d7d0d2da1e8be0fca88d51","index":{"nums":[0,1,12,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_test_destructure_py.html","relative_filename":"tests/test_destructure.py"}},"d_a44f0ac069e85531_test_pipable_py":{"hash":"53daea9db090507d0e550d93323a27a5","index":{"nums":[0,1,60,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_test_pipable_py.html","relative_filename":"tests/test_pipable.py"}},"d_a44f0ac069e85531_test_pump_py":{"hash":"bb6f001f3354a05ea77e4867b10f6185","index":{"nums":[0,1,10,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_test_pump_py.html","relative_filename":"tests/test_pump.py"}}}}
\ No newline at end of file
diff --git a/docs/assets/coverage/style.css b/docs/assets/coverage/style.css
deleted file mode 100644
index d6768a3..0000000
--- a/docs/assets/coverage/style.css
+++ /dev/null
@@ -1,311 +0,0 @@
-@charset "UTF-8";
-/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
-/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */
-/* Don't edit this .css file. Edit the .scss file instead! */
-html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; }
-
-body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; }
-
-@media (prefers-color-scheme: dark) { body { background: #1e1e1e; } }
-
-@media (prefers-color-scheme: dark) { body { color: #eee; } }
-
-html > body { font-size: 16px; }
-
-a:active, a:focus { outline: 2px dashed #007acc; }
-
-p { font-size: .875em; line-height: 1.4em; }
-
-table { border-collapse: collapse; }
-
-td { vertical-align: top; }
-
-table tr.hidden { display: none !important; }
-
-p#no_rows { display: none; font-size: 1.2em; }
-
-a.nav { text-decoration: none; color: inherit; }
-
-a.nav:hover { text-decoration: underline; color: inherit; }
-
-.hidden { display: none; }
-
-header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; }
-
-@media (prefers-color-scheme: dark) { header { background: black; } }
-
-@media (prefers-color-scheme: dark) { header { border-color: #333; } }
-
-header .content { padding: 1rem 3.5rem; }
-
-header h2 { margin-top: .5em; font-size: 1em; }
-
-header p.text { margin: .5em 0 -.5em; color: #666; font-style: italic; }
-
-@media (prefers-color-scheme: dark) { header p.text { color: #aaa; } }
-
-header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; }
-
-header.sticky .text { display: none; }
-
-header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; }
-
-header.sticky .content { padding: 0.5rem 3.5rem; }
-
-header.sticky .content p { font-size: 1em; }
-
-header.sticky ~ #source { padding-top: 6.5em; }
-
-main { position: relative; z-index: 1; }
-
-footer { margin: 1rem 3.5rem; }
-
-footer .content { padding: 0; color: #666; font-style: italic; }
-
-@media (prefers-color-scheme: dark) { footer .content { color: #aaa; } }
-
-#index { margin: 1rem 0 0 3.5rem; }
-
-h1 { font-size: 1.25em; display: inline-block; }
-
-#filter_container { float: right; margin: 0 2em 0 0; }
-
-#filter_container input { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; }
-
-@media (prefers-color-scheme: dark) { #filter_container input { border-color: #444; } }
-
-@media (prefers-color-scheme: dark) { #filter_container input { background: #1e1e1e; } }
-
-@media (prefers-color-scheme: dark) { #filter_container input { color: #eee; } }
-
-#filter_container input:focus { border-color: #007acc; }
-
-header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; }
-
-@media (prefers-color-scheme: dark) { header button { border-color: #444; } }
-
-header button:active, header button:focus { outline: 2px dashed #007acc; }
-
-header button.run { background: #eeffee; }
-
-@media (prefers-color-scheme: dark) { header button.run { background: #373d29; } }
-
-header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; }
-
-@media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } }
-
-header button.mis { background: #ffeeee; }
-
-@media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } }
-
-header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; }
-
-@media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } }
-
-header button.exc { background: #f7f7f7; }
-
-@media (prefers-color-scheme: dark) { header button.exc { background: #333; } }
-
-header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; }
-
-@media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } }
-
-header button.par { background: #ffffd5; }
-
-@media (prefers-color-scheme: dark) { header button.par { background: #650; } }
-
-header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; }
-
-@media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } }
-
-#help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; }
-
-#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; }
-
-#help_panel_wrapper { float: right; position: relative; }
-
-#keyboard_icon { margin: 5px; }
-
-#help_panel_state { display: none; }
-
-#help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; color: #333; }
-
-#help_panel .keyhelp p { margin-top: .75em; }
-
-#help_panel .legend { font-style: italic; margin-bottom: 1em; }
-
-.indexfile #help_panel { width: 25em; }
-
-.pyfile #help_panel { width: 18em; }
-
-#help_panel_state:checked ~ #help_panel { display: block; }
-
-kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; }
-
-#source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
-
-#source p { position: relative; white-space: pre; }
-
-#source p * { box-sizing: border-box; }
-
-#source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; }
-
-@media (prefers-color-scheme: dark) { #source p .n { color: #777; } }
-
-#source p .n.highlight { background: #ffdd00; }
-
-#source p .n a { margin-top: -4em; padding-top: 4em; text-decoration: none; color: #999; }
-
-@media (prefers-color-scheme: dark) { #source p .n a { color: #777; } }
-
-#source p .n a:hover { text-decoration: underline; color: #999; }
-
-@media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } }
-
-#source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; }
-
-@media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } }
-
-#source p .t:hover { background: #f2f2f2; }
-
-@media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } }
-
-#source p .t:hover ~ .r .annotate.long { display: block; }
-
-#source p .t .com { color: #008000; font-style: italic; line-height: 1px; }
-
-@media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } }
-
-#source p .t .key { font-weight: bold; line-height: 1px; }
-
-#source p .t .str { color: #0451a5; }
-
-@media (prefers-color-scheme: dark) { #source p .t .str { color: #9cdcfe; } }
-
-#source p.mis .t { border-left: 0.2em solid #ff0000; }
-
-#source p.mis.show_mis .t { background: #fdd; }
-
-@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } }
-
-#source p.mis.show_mis .t:hover { background: #f2d2d2; }
-
-@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } }
-
-#source p.run .t { border-left: 0.2em solid #00dd00; }
-
-#source p.run.show_run .t { background: #dfd; }
-
-@media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } }
-
-#source p.run.show_run .t:hover { background: #d2f2d2; }
-
-@media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } }
-
-#source p.exc .t { border-left: 0.2em solid #808080; }
-
-#source p.exc.show_exc .t { background: #eee; }
-
-@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } }
-
-#source p.exc.show_exc .t:hover { background: #e2e2e2; }
-
-@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } }
-
-#source p.par .t { border-left: 0.2em solid #bbbb00; }
-
-#source p.par.show_par .t { background: #ffa; }
-
-@media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } }
-
-#source p.par.show_par .t:hover { background: #f2f2a2; }
-
-@media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } }
-
-#source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; }
-
-#source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; }
-
-@media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } }
-
-#source p .annotate.short:hover ~ .long { display: block; }
-
-#source p .annotate.long { width: 30em; right: 2.5em; }
-
-#source p input { display: none; }
-
-#source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; }
-
-#source p input ~ .r label.ctx::before { content: "▶ "; }
-
-#source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; }
-
-@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } }
-
-@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } }
-
-#source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; }
-
-@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } }
-
-@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } }
-
-#source p input:checked ~ .r label.ctx::before { content: "▼ "; }
-
-#source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; }
-
-#source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; }
-
-@media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } }
-
-#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; }
-
-@media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } }
-
-#source p .ctxs span { display: block; text-align: right; }
-
-#index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; }
-
-#index table.index { margin-left: -.5em; }
-
-#index td, #index th { text-align: right; width: 5em; padding: .25em .5em; border-bottom: 1px solid #eee; }
-
-@media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } }
-
-#index td.name, #index th.name { text-align: left; width: auto; }
-
-#index th { font-style: italic; color: #333; cursor: pointer; }
-
-@media (prefers-color-scheme: dark) { #index th { color: #ddd; } }
-
-#index th:hover { background: #eee; }
-
-@media (prefers-color-scheme: dark) { #index th:hover { background: #333; } }
-
-#index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; }
-
-@media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } }
-
-#index th[aria-sort="ascending"]::after { font-family: sans-serif; content: " ↑"; }
-
-#index th[aria-sort="descending"]::after { font-family: sans-serif; content: " ↓"; }
-
-#index td.name a { text-decoration: none; color: inherit; }
-
-#index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; }
-
-#index tr.file:hover { background: #eee; }
-
-@media (prefers-color-scheme: dark) { #index tr.file:hover { background: #333; } }
-
-#index tr.file:hover td.name { text-decoration: underline; color: inherit; }
-
-#scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; }
-
-@media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } }
-
-@media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } }
-
-#scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; }
-
-@media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } }
diff --git a/docs/assets/coverage/test_pipable_py.html b/docs/assets/coverage/test_pipable_py.html
deleted file mode 100644
index e263fc3..0000000
--- a/docs/assets/coverage/test_pipable_py.html
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
- Coverage for test_pipable.py: 100%
-
-
-
-
-
-
-
- 1from pipable import Pipe
- 2from pytest import ExceptionInfo
- 3import pytest
- 4
- 5
- 6# ===== constants ======
- 7@Pipe
- 8def pow_pipe(base: int, exp: int) -> int:
- 9 """func to test decorator"""
- 10 return base**exp
- 11
- 12
- 13# ====== tests begin ========
- 14def test_builtn_with_single_arg():
- 15 list_ = Pipe(list)
- 16 assert "ab" | list_ == ["a", "b"]
- 17
- 18
- 19def test_builtin_with_multiple_args():
- 20 square = Pipe(pow, exp=2)
- 21 assert 3 | square == 9
- 22
- 23
- 24def test_side_effect(capsys):
- 25 print_ = Pipe(print)
- 26 "a" | print_("b", "c")
- 27 stdout: str = capsys.readouterr().out
- 28 assert stdout.splitlines()[-1] == "a b c"
- 29
- 30
- 31def test_raise_by_assigning_1st_arg():
- 32 base2 = Pipe(pow, base=2)
- 33 with pytest.raises(Exception):
- 34 3 | base2
- 35
- 36
- 37def test_decorator_with_single_arg():
- 38 @Pipe
- 39 def hi(name):
- 40 return f"hi {name}"
- 41
- 42 assert "May" | hi == "hi May"
- 43
- 44
- 45def test_decorated_with_multiple_args():
- 46 assert 3 | pow_pipe(exp=2) == 9
- 47
- 48
- 49def test_decorator_raise_assigning_first_arg():
- 50 with pytest.raises(Exception):
- 51 3 | pow_pipe(base=2)
-
-
-
-
diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png
new file mode 100644
index 0000000..319ff5a
Binary files /dev/null and b/docs/assets/favicon.png differ
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 4fb39d1..3ac6de2 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,11 +1,22 @@
.md-search__form {
- border-radius: 20px;
+ border-radius: 20px;
}
header {
- padding: 0.2rem 0;
+ padding: 0.2rem 0;
}
.md-typeset h1 {
- color: hsla(var(--md-hue), 75%, 90%, 0.8);
+ color: var(--md-typeset-color);
+ font-size: 1.8em;
+}
+
+[dir="ltr"] .md-header__title {
+ margin-left: 0.5rem;
+}
+
+img[src*="api.iconify.design"] {
+ vertical-align: -0.2rem;
+ margin-left: 0.3rem;
+ margin-right: 0.3rem;
}
diff --git a/mkdocs.yml b/mkdocs.yml
index 1da5e01..858dd50 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2,57 +2,65 @@ site_name: Pipable
repo_url: https://github.com/hoishing/pipable
extra_css:
- - stylesheets/extra.css
+ - stylesheets/extra.css
theme:
- name: "material"
- font:
- text: Varela Round
- icon:
- repo: fontawesome/brands/github
- favicon: https://api.iconify.design/mdi/pipe-disconnected.svg?color=white
- logo: https://api.iconify.design/mdi/pipe-disconnected.svg?color=white
- palette:
- # Palette toggle for dark mode
- - primary: deep purple
- scheme: slate
- toggle:
- icon: material/toggle-switch-off-outline
- name: Switch to light mode
-
- # Palette toggle for light mode
- - primary: deep purple
- scheme: default
- toggle:
- icon: material/toggle-switch
- name: Switch to dark mode
-
- features:
- - navigation.instant
- - navigation.tracking
- # - navigation.sections
- - navigation.expand
- # - toc.integrate
+ name: "material"
+ font:
+ text: Varela Round
+ icon:
+ repo: fontawesome/brands/github
+ favicon: assets/favicon.png
+ logo: https://api.iconify.design/mdi/pipe-disconnected.svg?color=white
+ palette:
+ # Palette toggle for dark mode
+ - media: "(prefers-color-scheme: dark)"
+ primary: deep purple
+ scheme: slate
+ toggle:
+ icon: material/toggle-switch-off-outline
+ name: Switch to light mode
+
+ # Palette toggle for light mode
+ - media: "(prefers-color-scheme: light)"
+ primary: deep purple
+ scheme: default
+ toggle:
+ icon: material/toggle-switch
+ name: Switch to system preference
+
+ # Palette toggle for automatic mode
+ - media: "(prefers-color-scheme)"
+ toggle:
+ icon: material/link
+ name: Switch to dark mode
+
+ features:
+ - navigation.instant
+ - navigation.tracking
+ # - navigation.sections
+ - navigation.expand
+ # - toc.integrate
plugins:
- - search:
- lang: en
- - mkdocstrings:
- handlers:
- python:
- options:
- show_root_heading: true
- show_signature_annotations: true
+ - search:
+ lang: en
+ - mkdocstrings:
+ handlers:
+ python:
+ options:
+ show_root_heading: true
+ show_signature_annotations: true
markdown_extensions:
- - pymdownx.highlight:
- anchor_linenums: true
- - pymdownx.inlinehilite
- - pymdownx.superfences
- - pymdownx.snippets
+ - pymdownx.highlight:
+ anchor_linenums: true
+ - pymdownx.inlinehilite
+ - pymdownx.superfences
+ - pymdownx.snippets
nav:
- - Quick Start: index.md
- - References: reference.md
- - License: license.md
- - Author: https://hoishing.github.io
+ - Quick Start: index.md
+ - References: reference.md
+ - License: license.md
+ - Author: https://hoishing.github.io
diff --git a/pipable/__init__.py b/pipable/__init__.py
index 5edad0f..d3cba7b 100644
--- a/pipable/__init__.py
+++ b/pipable/__init__.py
@@ -19,8 +19,6 @@ def __init__(self, func: Callable, /, *args, **kwargs) -> None:
Args:
func (Callable): func to be pipable
- args: partial's positional args
- kwargs: partial's keyword args
"""
self.pipe = partial(func, *args, **kwargs)
diff --git a/poetry.lock b/poetry.lock
index 13c19bc..925632b 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2,13 +2,13 @@
[[package]]
name = "babel"
-version = "2.15.0"
+version = "2.16.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"},
+ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
+ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
]
[package.extras]
@@ -168,13 +168,13 @@ dev = ["flake8", "markdown", "twine", "wheel"]
[[package]]
name = "griffe"
-version = "0.48.0"
+version = "1.0.0"
description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
optional = false
python-versions = ">=3.8"
files = [
- {file = "griffe-0.48.0-py3-none-any.whl", hash = "sha256:f944c6ff7bd31cf76f264adcd6ab8f3d00a2f972ae5cc8db2d7b6dcffeff65a2"},
- {file = "griffe-0.48.0.tar.gz", hash = "sha256:f099461c02f016b6be4af386d5aa92b01fb4efe6c1c2c360dda9a5d0a863bb7f"},
+ {file = "griffe-1.0.0-py3-none-any.whl", hash = "sha256:7e113220efc489c2e8189656b1f01c1184417ba5395573ff05cdc7d07a1b0a5e"},
+ {file = "griffe-1.0.0.tar.gz", hash = "sha256:a9df647e5602fc0f826fca1cda5d9a0e554cdea67eb7948f6629dca7336e6afd"},
]
[package.dependencies]
@@ -221,13 +221,13 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "markdown"
-version = "3.6"
+version = "3.7"
description = "Python implementation of John Gruber's Markdown."
optional = false
python-versions = ">=3.8"
files = [
- {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"},
- {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"},
+ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
+ {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
]
[package.extras]
@@ -445,17 +445,17 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
[[package]]
name = "mkdocstrings-python"
-version = "1.10.7"
+version = "1.10.8"
description = "A Python handler for mkdocstrings."
optional = false
python-versions = ">=3.8"
files = [
- {file = "mkdocstrings_python-1.10.7-py3-none-any.whl", hash = "sha256:8999acb8e2cb6ae5edb844ce1ed6a5fcc14285f85cfd9df374d9a0f0be8a40b6"},
- {file = "mkdocstrings_python-1.10.7.tar.gz", hash = "sha256:bfb5e29acfc69c9177d2b11c18d3127d16e553b8da9bb6d184e428d54795600b"},
+ {file = "mkdocstrings_python-1.10.8-py3-none-any.whl", hash = "sha256:bb12e76c8b071686617f824029cb1dfe0e9afe89f27fb3ad9a27f95f054dcd89"},
+ {file = "mkdocstrings_python-1.10.8.tar.gz", hash = "sha256:5856a59cbebbb8deb133224a540de1ff60bded25e54d8beacc375bb133d39016"},
]
[package.dependencies]
-griffe = ">=0.48"
+griffe = ">=0.49"
mkdocstrings = ">=0.25"
[[package]]
@@ -589,62 +589,64 @@ six = ">=1.5"
[[package]]
name = "pyyaml"
-version = "6.0.1"
+version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
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-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
- {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-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
- {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-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
- {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
- {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
- {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
- {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
- {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-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
- {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-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
- {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"},
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
+ {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
+ {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
+ {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
+ {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
+ {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
+ {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
+ {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
+ {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
+ {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
+ {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
+ {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
+ {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
+ {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
+ {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
+ {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
+ {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
+ {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
+ {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
+ {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
+ {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
+ {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
+ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
+ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
]
[[package]]
@@ -811,43 +813,46 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "watchdog"
-version = "4.0.1"
+version = "4.0.2"
description = "Filesystem events monitoring"
optional = false
python-versions = ">=3.8"
files = [
- {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"},
- {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"},
- {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"},
- {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"},
- {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"},
- {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"},
- {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"},
- {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"},
- {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"},
- {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"},
- {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"},
- {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"},
- {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"},
- {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"},
- {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"},
- {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"},
- {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"},
- {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"},
- {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"},
- {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"},
- {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"},
- {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"},
- {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"},
- {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"},
- {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"},
- {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"},
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"},
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"},
+ {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"},
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"},
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"},
+ {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"},
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"},
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"},
+ {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"},
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"},
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"},
+ {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"},
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"},
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"},
+ {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"},
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"},
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"},
+ {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"},
+ {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"},
+ {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"},
+ {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"},
+ {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"},
+ {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"},
+ {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"},
+ {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"},
+ {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"},
+ {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"},
+ {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"},
+ {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"},
]
[package.extras]
diff --git a/pyproject.toml b/pyproject.toml
index 9dcc033..ee05d88 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,13 +4,13 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "pipable"
-version = "0.3.2"
+version = "0.3.3"
description = "pseudo pipe operation in python"
authors = ["Kelvin Ng "]
readme = "README.md"
license = "MIT"
repository = "https://github.com/hoishing/pipable"
-homepage = "https://hoishing.github.io/pipable"
+documentation = "https://hoishing.github.io/pipable"
keywords = ["pipe", "FP", "functional programming", "chain"]
packages = [{ include = "pipable" }]
@@ -21,5 +21,4 @@ python = "^3.12"
mkdocs-material = "^9.5.31"
pytest = "^8.3.2"
toml = "^0.10.2"
-mkdocstrings = {extras = ["python"], version = "^0.25.2"}
-
+mkdocstrings = { extras = ["python"], version = "^0.25.2" }