Using and Mastering Cookiecutter Transcripts
Chapter: Adding features to Cookiecutter
Lecture: Adding the feature
Login or purchase this course to watch this video and the rest of the course contents.
0:01 Okay let's go back to the folder here basically I want to open up this directory in the editor
0:06 so I click show in finder and it'll take me where the .gitignore was which actually is right where I want to be, so I want to open this in PyCharm,
0:12 and on MacOS you can do that really nicely by just dragging and dropping the root into PyCharm.
0:19 In Linux or in Windows you have to actually go file, open directory go find this thing. So, you don't have to use PyCharm, I like it the best,
0:28 it's totally up to you on whether you want to do it or not. PyCharm has built-in source integration, so let's say add root here
0:36 here you see all the things that we're going to work with and this folder is actually where we're most interested
0:43 so let's let it do its little indexing, so we have autocomplete and then we'll be ready to roll.
0:48 First thing I'd like to be able to run this inside PyCharm, so there's a couple of options, let's go to this configuration,
0:54 say add a new Python run, and normally, you would put the script here, you could even right click and say run it
1:00 but this is a package so that makes it kind of tricky so we'll say script parameters, oops, not there, interpreter options -m
1:07 and then what are we going to do- we're going to say cookiecutter and then who knows what we're going to give it here, right now I just run the help ok
1:14 So notice the right virtual environment was found because of the naming convention PyCharm knows to load that one up,
1:22 also unnamed is probably not the best name let's just call this cookiecutter, and we'll say single instance of that
1:29 okay, now if we hit run, we should see at the bottom error, no template that's good that's actually okay right, that's what we wanted
1:37 we could pass in like -h for help or whatever but you'll see like it's running down here now. The other thing we can do if we want to fiddle with it
1:47 is we can run it in the terminal, notice the terminal automatically activates the virtual environment
1:53 so we can just say cookiecutter -V to see which one and it's the same one out of the same place
1:58 ok, so we are ready to run, this thing is set up locally it's in our editor, let's go make a change.
2:03 Now, the part that we care about, the part I want to start exploring from is from the CLI, so if you look at the CLI here, you can see it's using click
2:12 which is a thing to basically manage the command line interface for you and down here, there's a bunch of stuff happening right,
2:20 is going to come down here and run of the cookiecutter for us. And you can go see the various pieces that are being called,
2:28 and I would encourage you to sort of explore the flow from here on down so you understand how all the pieces fit together,
2:35 there is some documentation and so on, but I've already done this, I've already figured out where I want to go, so I'm going to go edit this location
2:42 okay, down here notice this is the stuff about config files remember we're working on the YAML thing, that's the default config for the user;
2:52 here is where we're working, at the very root of everything, whether we use a default config, a pass config, a user config,
3:01 we're going to be getting into this get_config() here, okay, we actually will find that the error happens right here,
3:10 so let's go ahead and set-up our system, so we can try that, let's see if we can make this thing fail basically,
3:17 so I want to say cookiecutter and I give it little output folder here,
3:21 cookiecutter cookiecutter-template -o ~/Desktop/test/ and let's just do something simple,
3:26 cookiecutter-template, alright, that runs, everything looks great. Now, let's try that again, but first let's edit and make our YAML defaults broken.
3:41 It doesn't matter if this is our default file or some other one, it's just by default this will be the one selected.
3:47 So I deleted that little bit there, let's try it again. Let's see what mistake did we make- oh there is no pattern for github_username
3:56 what is going on, and if we see where that is, that's in config line 61, which is right here, this is basically in this try accept block.
4:06 So what we need to do is add a little fix right here, so let's do this, let's add a function, right up above here,
4:15 so we're going to call this function fix_missing_endline_in_yaml() We're going to do that here, and what I actually want to do is
4:24 I want to sort of separate this out a bit here so I want to say yaml_lines this is going to return actually a set of lines of text here
4:33 we want to pass this and instead of passing in here like so, we want to create a yaml_text = "".join(yaml_lines)
4:45 put the lines back together, yaml text, okay. So our goal now is to somehow get this value passed in here,
4:53 make some changes, get it back, so say yaml lines equals this we'll say read lines which instead of returning the whole string,
5:00 the whole thing as a string, and we're going to actually return a bunch of lines it's a little easier to work with it that way, so we'll come down here
5:08 and we'll say get all the lines from the original file and then potentially modify them and then turn that back into a flat single string
5:15 which this was expecting, before. Ok, so all we got to do is write this little function here and what do we need to check for-
5:26 let's go ahead and pass in our yaml_lines, we'll return our yaml_lines, ok so we're going to say if yaml lines we don't want to crash
5:33 if for some reason that's not there, and if the yaml_lines the last entry is not equal to just a Newline, and it's Python 2 so Unicode,
5:45 if the last line in this file is not just a blank line, all we have to do is say append a Newline, that's it,
5:55 this should actually fix our code, this should fix that annoying little bug in Cookiecutter and it's six, eight lines of code, not too bad.
6:05 Let's try this now, let's just verify that we do have the missing piece here, and let's try this again; ta-da, fixed.
6:12 How do I know it's fixed, what if I skip this little part right here try it again, it crashes; put it back- fixed.
6:20 Okay, so I think this is a pretty cool little feature, this is not much work PyCharm thinks this is misspelled, so I am going to say it's not,
6:29 so everything looks ok, the one thing that we should probably do is let's go ahead and document this, add some document strings here and some there
6:36 so let's go ahead and add some docstrings here as well, just so people come along know what this thing is about,
6:41 like why is this weird thing adding a Newline, maybe in some time when poyo doesn't need it then we could take this away right.
6:48 Alright, so there is a little description I wrote beforehand so it says if the YAML configuration file does not end with a single bank line
6:56 a cookiecutter exception invalid configuration is thrown within an indecipherable error I think we can all agree that's the current state,
7:03 this method fixes that by adding a trivial Newline if it is missing. Save one more thing here, alright, it looks like it's still working, fabulous.
7:11 Okay, so let's go ahead and submit this back. Now, probably it should be running the test here, right, we should run all of our tests here,
7:20 so running our tests, with tox, give it a moment, ok so it looks like all the tests ran fine, I don't have Python 3.3 or 3.4
7:28 but when we do the check in, the continuous integration and automated build system has all of this stuff set-up, so you see like
7:37 flake 8, PyPy, Python 3.3 and 3.4 didn't quite work but they'll work in the final version, as you'll see in a little bit,
7:44 but at least we saw it worked on Python 2.7 and Python 3.5 and that gives me a lot of confidence that we didn't break anything during this process.
7:53 So, we just pip install tox, and then I just type tox and it runs all these tests, perfect. So now we're ready, we've added our feature,
8:04 created our feature branch, added feature we've run the test we're ready to check this in and create a pull request.