Skip to main content

intuitive python directory tree management for all

Project description

|travis build| |Coverage Status| |PyPI version| |License: MIT|

Build/Coverage Status
^^^^^^^^^^^^^^^^^^^^^

+-------------------+------------------+---------------------+
| Branch | Build | Coverage |
+===================+==================+=====================+
| **master** | |travis build| | |Coverage Status| |
+-------------------+------------------+---------------------+
| **development** | |travis build| | |Coverage Status| |
+-------------------+------------------+---------------------+

📁 MagicDir 📁
============

Dealing with paths and directories isn't rocket science, but it can be a
pain. **MagicDir** allows you to build directory trees by treating your
directory tree as a first-class object.

Stop writing your directory trees like this:

.. code:: python

# define paths
top = os.path.abspath('top')
middle = os.path.join(str(top), 'middle')
bottom = os.path.join(str(middle), 'bottom')
os.makedirs(bottom)
with open(os.path.join(bottom, 'bottomlog.txt', 'w') as f:
f.write("some log information")

And start writing them like this:

.. code:: python

# define paths
env = MagicDir('top').add('middle').add('bottom').root
env.bottom.write('log.txt', 'w', 'some log information')

Live usage:

.. figure:: images/magicdir_example.gif?raw=true
:alt: live\_example

live\_example

Its very easy to create, move, or delete directory trees. For example,
the following builds the directory skeleton for this repo.

.. figure:: images/directory_example.png?raw=true
:alt: demo

demo

.. code:: python

from magicdir import *

# create folder structure
env = MagicDir('magicdir')
env.add('magicdir', alias='core')
env.core.add('tests')
env.tests.add('env')
env.tests.add('env2')

# make the directory
env.set_dir(Path(__file__).absolute().parent)
env.mkdirs()

# write some files
env.write('README.md', 'w', '# Magic Dir\nThis is a test readme file')
env.core.write("__init__.py", "w", "__version__ = \"1.0\"")

Other things you can do:

Abstracting the directory structure lets your create, remove, copy, move
directory trees easily.

.. figure:: images/rmdirs_example.gif?raw=true
:alt: rmdirs\_example

rmdirs\_example

All paths are easily accessible.

.. code:: python

print(env.test.abspath) # absolute path
print(env.test.path) # relative path

You can even read and write files intuitively.

.. code:: python

# writes file to 'test' folder
env.test.write('test.txt', 'w', 'some data')

# reads test file
env.test.read('test.txt', 'r')

# open file and read lines
env.test.open('test.txt', 'r').readlines()

All iterables are magically chainable making it easy to do complex
things. Pretty cool!

.. code:: python

# recurseively write a log file to all subfolders of 'core'
env.core.descendents.write('log.txt', 'w', 'some log file')

# read all files named 'log.txt' for subfolders in 'test'
env.test.children.read('log.txt', 'r')

# readlines files named 'log.txt' for subfolders in 'test'
env.test.children.open('log.txt', 'r').readlines()

# recursively get stats on folders
d = env.descendents()
zip(d, d.stat().st_mtime)

Better documentation about chaining methods is soon to come along with
recipes.

Installation
============

Installation via pip is the easiest way...

.. code:: bash

pip install magicdir

Basic usage
===========

Use ``add`` to create folders.

.. code:: python

from magicdir import *

env = MagicDir('bin')
env.add('subfolder1')
env.add('subfolder2')
env.print()

>>>
*bin
| *subfolder1
| *subfolder2

Functions return MagicDir objects and so can be chained together.

.. code:: python

env = MagicDir('bin')
env.add('subfolder1').add('subsubfolder')
env.print()

>>>
*bin
| *subfolder1
| | *subsubfolder

Add can be chained together

.. code:: python

env = MagicDir('bin')
env.add('subfolder1').add('subsubfolder')
env.print()

>>>
*bin
| *subfolder1
| | *subsubfolder

Folders create accesible MagicDir attributes automatically. Alternative
attribute names can be set using 'alias='

.. code:: python

env = MagicDir('bin')
env.add('subfolder1')
env.subfolder1.add('misc')
env.subfolder1.misc.add('.hidden', alias='hidden')
env.subfolder1.misc.hidden.add('hiddenbin')
env.print()

*bin
| *subfolder1
| | *misc
| | | *.hidden ("hidden")
| | | | *hiddenbin

By default, attributes are *pushed* back the the root directory. The
following is equivalent to above.

.. code:: python

env = MagicDir('bin')
env.add('subfolder1')
env.subfolder1.add('misc')
env.misc.add('.hidden', alias='hidden')
env.hidden.add('hiddenbin')
env.print()

*bin
| *subfolder1
| | *misc
| | | *.hidden ("hidden")
| | | | *hiddenbin

Making, moving, copying, and deleting directories
=================================================

The location of the root folder can be set by ``set_bin``

.. code:: python

env.set_bin('../bin')

Directories can be created, deleted, copied or moved using ``mkdirs``,
``cpdirs``, ``mvdirs``, ``rmdirs``

.. code:: python

env.mkdirs()
env_copy = env.cpdirs()
# you can do stuff with env_copy independently
env.mvdirs('~/Document')
env_copy.rmdirs()

Advanced usage
==============

All iterables return special list-like objects that can be chained in
one-liners.

.. code:: python

env.descendents() # returns a MagicList object

# find all txt files
env.descendents(include_self=True).glob("*.txt")

# recursively change permissions for directories
env.abspaths.chmod(0o444)

.. |travis build| image:: https://img.shields.io/travis/jvrana/magicdir.svg
:target: https://travis-ci.org/jvrana/magicdir
.. |Coverage Status| image:: https://coveralls.io/repos/github/jvrana/magicdir/badge.svg?branch=master
:target: https://coveralls.io/github/jvrana/magicdir?branch=master
.. |PyPI version| image:: https://badge.fury.io/py/REPO.svg
:target: https://badge.fury.io/py/REPO
.. |License: MIT| image:: https://img.shields.io/badge/License-MIT-yellow.svg
:target: https://opensource.org/licenses/MIT
.. |travis build| image:: https://img.shields.io/travis/jvrana/magicdir/master.svg
:target: https://travis-ci.org/jvrana/magicdir/master
.. |travis build| image:: https://img.shields.io/travis/jvrana/magicdir/development.svg
:target: https://travis-ci.org/jvrana/magicdir/development
.. |Coverage Status| image:: https://coveralls.io/repos/github/jvrana/magicdir/badge.svg?branch=development
:target: https://coveralls.io/github/jvrana/magicdir?branch=development

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

magicdir-0.3.1a.tar.gz (10.4 kB view details)

Uploaded Source

File details

Details for the file magicdir-0.3.1a.tar.gz.

File metadata

  • Download URL: magicdir-0.3.1a.tar.gz
  • Upload date:
  • Size: 10.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for magicdir-0.3.1a.tar.gz
Algorithm Hash digest
SHA256 6ae69266a4893ad516d2c3afc81795a10de86570720067dc3afe7c33f203f8ab
MD5 0fce15e2779ab992b09f006a4f212d15
BLAKE2b-256 ac1e228ad6f17c74be17bc396f68f085abbea5beeb5b4896a44a3923cf633322

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page