Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - datafolklabs/backpedal: It's like os.walk(), but backwards... and on a bicycle. · GitHub
Skip to content

Repository files navigation

Backpedal

It's like os.walk(), but backwards... and on a bicycle.

Continuous Integration Status

Core Features

  • Walk directories up, down, or both directions
  • Search for files, directories, or both item types
  • Return first item found immediately, or list of all matching items
  • 100% Test Coverage (pytest) on Python 3.6+
  • 100% PEP8 Compliant (pep8, autopep8)

Motivation

The primary use case for backpedal is finding files from within your current directory, and/or parent(s). For example, both Vagrant and Fabric support running from nested sub-directories within a project while loading their associated Vagrantfile or fabfile.py from the root (parent) project directory by searching from the current directory and upward.

The walk up logic was initially garnered from a quick search on Google that produced the following Gist:

Thanks Zach!

License

Backpedal is Open Source and is distributed under the BSD License (three clause). Please see the LICENSE file included with this software.

Installation

Stable versions can be installed from PyPi:

$ pip install backpedal

Documentation

As this is currently a very basic library, all documentation is here in this README. In the future, as the project grows, more advanced/proper documentation will be added.

def up(path):

Walk up from a directory path. If no path is given, default to os.curdir. Similar to os.walk but in the oposite direction.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.up('/path/to/starting/dir'):
# do something with resultspass

def down(path):

Walk down from a directory path. If no path is given, default to os.curdir. This is synonymous with using os.walk.

Arguments

  • path(str): The starting path to walk up from.

Usage

importbackpedalforcurdir,dirs,filesinbackpedal.down('/path/to/starting/dir'):
# do something with resultspass

def find(item, ...):

Search for files, directories, or both item types from the given path, in either up, down, or both directions.

Arguments:

  • item(str): A string identifier of the directory or file name to search for.

Keyword Arguments:

  • path(str): The starting path to walk up from. Defaults to os.curdir() if no path is given.
  • direction(str): The direction to walk (up, down, or both). Default: up.
  • first_only(bool): Return the first item found (immediately) as a str, or return a list of all items found. Default: True.
  • item_type(str): Type of item to search for (file, directory, or both). Default: file
  • regex(bool): Whether to treat item as a regular expression. Default: false
  • ignore(list): List of regular expressions to filter out matching results. Note that this is not affected by the regex keyword argument... the ignore list is already treated as regex. Default: None.

Usage

importbackpedal### find a file from current dir, up through all the parentsres=backpedal.find('Vagrantfile')
### find a file or directory, and filter with ignoreres=backpedal.find('README', item_type='both', ignore=['(.*)\.git(.*)'])

Example

From the example directory:

$ cd example/
$ python example.py
------------------------------------------------------------------------------
Find the first matching file starting from `.`
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
RES > /Users/derks/Development/backpedal/example/README.md
------------------------------------------------------------------------------
Find all matching files starting from sub1/a/b/c:
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for file README.md
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
RES > ['/Users/derks/Development/backpedal/example/sub1/a/README.md', '/Users/derks/Development/backpedal/example/README.md', '/Users/derks/Development/backpedal/README.md']
------------------------------------------------------------------------------
Look for directory but peddle down instead of up
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for directory data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
RES > /Users/derks/Development/backpedal/example/sub1/a/b/c/data
------------------------------------------------------------------------------
Look for files and directories in both directions
------------------------------------------------------------------------------
+++ BACKPEDAL // looking for files/directories data
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development/backpedal
+++ BACKPEDAL // backpedaling upward from path: /Users/derks/Development
+++ BACKPEDAL // backpedaling upward from path: /Users/derks
+++ BACKPEDAL // backpedaling upward from path: /Users
+++ BACKPEDAL // backpedaling upward from path: /
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub1/a/b/c/data
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b
+++ BACKPEDAL // backpedaling downward from path: /Users/derks/Development/backpedal/example/sub2/a/b/c
RES > ['/Users/derks/Development/backpedal/example/sub1/a/b/c/data', '/Users/derks/Development/backpedal/example/sub2/data', '/Users/derks/Development/backpedal/example/sub2/a/b/data']

Development

Docker

This project includes a docker-compose configuration that sets up all required services, and dependencies for development and testing. This is the recommended path for local development, and is the only fully supported option.

The following creates all required docker containers, and launches an BASH shell within the backpedal dev container for development.

$ make dev
|> backpedal <| src #

The above is the equivalent of running:

$ docker-compose up -d
$ docker-compose exec backpedal /bin/bash

Testing Alternative Versions of Python

The latest stable version of Python 3 is the default, and target version accessible as the backpedal container within Docker Compose. For testing against alternative versions of python, additional containers are created (ex: backpedal-py37, backpedal-py38, etc). You can access these containers via:

$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
backpedal_backpedal-py35_1 /bin/bash Up
backpedal_backpedal-py36_1 /bin/bash Up
backpedal_backpedal-py37_1 /bin/bash Up
backpedal_backpedal-py38_1 /bin/bash Up
backpedal_backpedal-py39_1 /bin/bash Up
backpedal_backpedal_1 /bin/bash Up
$ docker-compose exec backpedal-py37 /bin/bash
|> backpedal-py37 <| src #

Releasing to PyPi

Only for official maintainers.

Before releasing to PyPi, you must configure your login credentials:

~/.pypirc:

[pypi]
username = __token__
password = YOUR_PYPI_API_TOKEN

Then use the included helper function via the Makefile:

$ make dist
$ make dist-upload

About

It's like os.walk(), but backwards... and on a bicycle.

Resources

Stars

27 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages