A while back I wrote about some handy aliases for virtualenv and serializing frequently and commonly chained commands that one uses to setup project environments. This is a first step at realizing the ideas I had when I wrote that post.
The need for WK
Like the previous post explained, I have these project aliases that setup my work environments,
alias wk.frankvalcarcel.com="workon pelican && cd /Users/frankv/Work/frankvalcarcel.com && ls -la"
These aliases activate the project's virtualenv, navigates to the project's directory, and for now... lists the contents of the directory. I wanted a little more.
I don't think my workflow differs much from other Python developers. Usually I need my env activated, my editor opened to the proper directory, a project specific command run, and usually a browser window opened. In all the chain of commands will usually look something like this:
$ workon foo (foo)$ cd ~/projects/foo (foo)$ subl . (foo)$ python manage.py fooUp ** Starting foo on 0.0.0.0:5000 ** Reloader etc.
Setting up project automation is going to be a pretty small checklist. I knew right away that abstracting the great scripting tools in the terminal was not a good approach. I need only provide the mechanism upon which to chain these parts together, and I got my idea for this from Bower's project initialization...
$ bower init ? name: foo ? version: 0.0.1 ? description: this is a foo project, demo bower init ? license: MIT ? homepage: www.foo.com ? set currently installed components as dependencies?: Yes ? add commonly ignored files to ignore list?: Yes
That's obviously a lighter version of the full init script, and for
wk I certainly don't need that kind of information.
wk is going to be a work in progress for sometime. Mostly because I think I'll have to fork and modify the library I
used to write it. Luckily that is the only dependency you wont already have in your native Python environment.
wk is built
Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary.
click is another great tool by the incredible Armin Ronacher(@mitsuhiko), the same guy that
brought us flask and werkzeug; (yes I'm starting to feel like a
fanboy, but hey... how could you not?!). For what I want
click has a couple limitations I hope to work around.
wk is publicly available on GitHub and I welcome forks, feedback and pull-requests.
Checkout the README to help you get started. The things you'll need are a global installation of click and to install
in editable mode. So from your
wk project directory, run
$ pip install click $ pip install --editable .
The last step is to setup the
wk project directory. I borrowed this idea from virtualenv wrapper and rvm. It works for them, so it should be fine in this case. Add this line to your
.bashrc file, it will instruct
wk to load and save from the specified directory:
Now you'll be able to run
wk anywhere on your terminal.
$ wk Usage: wk [OPTIONS] COMMAND [ARGS]... Create a wk object and remember it as as the context object. From this point onwards other commands can refer to it by using the @wk_ctx decorator. Options: --name NAME wk project name --config KEY VALUE Overrides a config key/value pair. -v, --verbose verbose ouput --version Show the version and exit. --help Show this message and exit. Commands: load setup
Setting Up a Project
I'm trying to make this step as easy as possible. Ideally, from the directory your project is located you should be able to fly through setup by just slapping enter. I'll explain each step and their respective defaults:
Start by running
user@host:~/foo$ wk setup wk setup project enter project name, [foo]: enter project directory, [/Users/frankv/Work/projects/foo]:
The project name will become the project command, it's default is the current directories name. The project directory
will default to the current one as well. Next
wk will gather information about any virtualenv, big shot out to Emily Morehouse(@emilyemorhouse) for the help with this part!
It works two ways and handles existing envs pretty well.
VirtualEnv? [Y/n]: Y From existing? [y/N]: N
If you select
From existing? and you are using virtualenv wrapper,
wk will list the envs and let you select which one
corresponds to your project.
From existing? [y/N]: Y 0: amazon-scraper 1: breakingbad 2: brewfest 3: cuttledocs enter number:
Entering the number of the env will save that env's location with your
wk project. If you select
wk will make
a new env named after the project.
From existing? [y/N]: N virtualenv name, [foo]: New python executable in foo/bin/python Installing setuptools, pip...done. Press any key to continue ...
If you do not use virtualenv wrapper all of this happens in the project directory that you specified earlier.
Once you complete the setup,
wk serializes the project object into a YAML file under the
WK_HOME directory that you defined in your
.bashrc file. I chose YAML over JSON for a few reasons but will build in a swappable
serialization system later. I purposefully avoided serialization libraries like
pickle for reasons that will become much clearer in future releases.
The YAML file for this example looks like this;
!!python/object:wk.WK config: directory: /Users/frankv/Work/projects/foo venv: true venv_directory: /Users/frankv/.venvs/foo name: foo verbose: false
Some of this I didn't explain yet, I will in future updates. For now the setup command is only about 60% complete. Once I'm closer to a beta release I'll publish full documentation on readthedocs. Currently I wouldn't even claim to be pre-alpha, I'm mostly putting this out there for some early stage feedback.
Loading a Project
The load command is really fucking broken right now. I was hoping to avoid commands like:
wk load foo in lieu of
wk.foo, but I know I can't do this! This is what I'll spend the next couple weeks working on, but jobs
and other deadlines will probably guarantee slow turn around. Watch my twitter or this blog for updates, or fork your own version and join the fun.
Python, Productivity, Workflow
This book was absolutely riveting. It kept me up two nights in a row and had me imagining amber Martian landscapes around the clock. The author, Andy Weir, was previously a software engineer,...
The Pragmatic MVP is a talk I gave at TalTech Expo 2015 on building effective early stage prototypes. Below is a list of websites, articles, and books I used in preparation...
A while back I wrote about some handy aliases for virtualenv and serializing frequently and commonly chained commands that one uses to setup project environments. This is a first step at realiz...