diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e69de29..41c0e28 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +## Contributing + +Contributions and feedback are always welcome. The expected procedure is the following: + +### Bugs, Features and Feedback + +* Please, create github issues for **feature-requests**, **bug reports**. +* Feel free to open issues for **questions and problems you have**, even if they are not bugs + or feature requests. +* You may even open an issue just to say you like the project. +* For small changes, such as **typo and formatting corrections**, you can immediately + create a pull-request. You can use the github web-interface, but keep in mind that most of the documentation + is created with Thought, so you should change the template in the `.thought` directory or change the default + templates in [the thought project](https://github.com/nknapp/thought/tree/master/handlebars). +* If you have an idea for a **new feature** that you would like to implement, please **open an issue** first and ask + for feedback. Maybe someone else has a similar problem and different ideas. +* If you encounter a bug you can submit a **pull-request for a failing unit test**, you should then also open an issue + for the bug. +* Before making a pull-request, make sure that you commit corresponds to the coding-style. You can do this by + running `npm test`. + +**People submitting relevant contributions will be granted commit access to the repository.** + + +### Coding style + +[![standard][standard-image]][standard-url] + +This repository uses [`standard`][standard-url] to maintain code style and consistency, +and to avoid style arguments. You can run `npm run format` to apply the coding-style, but +you may need to fix some things manually. Make sure to use the latest version of `standard`. + + +### Installing & Testing + +You can fork and clone the repo from github. Run + +* Run `npm install` to install all the dependencies needed to build and run the project. +* Run `npm test` to run unit tests and validate the `standard` coding-style. +* Run `npm run thought` to generate the README.md and other markdown files in the repository. + +It is intentional to don't have `standard`, `thought`, `istanbul` and `coveralls` in the devDependencies. +`standard` is a rather large package which you would not want to have copied into the `node_modules`-folder +of each of your projects. + +Instead, the `pretest`- and `preformat`-scripts ensure that `standard` and `thought` are installed globally. +If you are not allowed to install packages globally, please raise an issue, so that we can try to find a solution. + +### About this text + +This text is part of the [Thought](https://github.com/nknapp/thought)-project. If you have any suggestions or wishes +to change the text, please raise an issue there for discussion. + +[standard-image]: https://cdn.rawgit.com/feross/standard/master/badge.svg +[standard-url]: https://github.com/feross/standard diff --git a/README.md b/README.md index e69de29..ad988f4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,226 @@ +# thought + +> A customizable documentation generator for github projects + +*Thought is still in development. It might be worth looking at it already, but I'm still trying to +document my own projects with it, so the default templates will change as I go along. It's not ready +for production use at the moment.* + +## Overview / Motivation + +The goal of Thought is making the documentation just as easy as thinking about it. + +Are you sometimes annoyed about documentation that does represent the current state of the project? +Like example-snippets that don't work or have a different output when you actually run them? + +Most of the time, the problem is, that the documentation lives too far away from the code. +The API-reference is up-to-date most of the time, because it is actually maintained next +to the code. But what about the rest? + +With Thought, you can assemble documentation from a variety of places. You can include API-docs into +your README, you can include example and actuall *run* them to include the output. You can include +the command line reference by calling the main program with a `--help` parameter. + +When your examples throw errors, you will notice that. When you make changes to your code, +the example output in your documentation will change as well! + +Generating a simple `README.md` just requires executing `thought` in your project directories. +Thought will run your `package.json` through a Handlebars template with a list of registered partials in order to +do that. + +Since that is mostly not exactly what you want, it is possible to override each of the partials with your own +and to create more templates each of which will result in one markdown-file in your repo. + +Thought offers a small list of simple helpers to + +* parse jsdoc-comments (not only in javascript-files but in many languages) and include them at any location in + your documenation files. +* include any file +* include javascript example files (replacing `require` of the main module by the module name) +* run example files or any program and include the output + +I have taken a lot of inspiration form [verb](https://github.com/verbose/verb) by Jon Schlinkert, but I wanted +something simpler. There are other simple README-generators out there that you can't adapt, so the idea of +using `package.json` to generate a README.md is not new. + + + + + +# Installation + +``` +npm install -g thought +``` + + +## Usage + + +The simplest usage is just to run `thought run` from your project root directory. +In the default configuration, this will generate a `README.md` from the information in the `package.json`. + +Consider the following example + +
example-project/
+├── LICENSE.md
+├── examples/
+│   └── example.js
+├── index.js
+└── package.json
+ +and have a look at the files +[index.js](examples/example-project/index.js), +[examples/example.js](examples/example-project/examples/example.js) and +[examples/example.js](examples/example-project/examples/example.js), +[LICENSE.md](examples/example-project/LICENSE.md), +[package.json](examples/example-project/package.json) + +Thought will render information from `package.json`, include the `examples/examples.js`, +execute the `examples/example.js` file and include the process-output and reference the `LICENSE.md` +into the [README.md](examples/example-project/README.md). It will also generate a default +[CONTRIBUTING.md](examples/example-project/CONTRIBUTING.md). + +*Note: The CONTRIBUTING-text contains some parts that may be subjective (such as including the +[`standard`](https://github.com/feross/standard) coding style. I am open for different texts or +ideas for modular approaches. Just file a github issue for discussion.* + + +### CLI options + +Calling `thought --help` will print a command-line reference: + +``` +Usage: thought [options] [command] + + + Commands: + + run [options] Generate documentation from your package.json and some templates. + init Register scripts in the curent module's package.json + check-engines Check that all engines (such as npm) have versions that ensure Thought to run correctly + + Options: + + -h, --help output usage information + -V, --version output the version number + -d, --debug higher stack-trace-limit, long stack-traces +``` + +### Calling `thought` from node. + +```js +var thought = require('thought') + +thought({ + cwd: 'example-project' +}) +``` + +### Using `thought` as version-script for npm + +npm supports a `version` script from version 2.13.0 on. This script +is called when invoking [npm version ...](https://docs.npmjs.com/cli/version) +after bumping the version number but prior to commiting the change. + +Using `thought init` you can install scripts for `version` and `preversion` in your package.json +that will run `thought run -a` on every version bump. This will include the updated documenation +in the same commit that contains the version bump. Furthermore, if you (or any other contributor +of your module) is using npm prior to version 2.13.0. The preversion-script will fail. + +This is especially helpful when using the helper `withPackageOf` to include links to files +in your github repository (since these links include the version tag on github). + +### Overriding templates and partials + +All templates and partials can be overridden by customized versions (but it is currently +not possible to remove a template completely). +You can find the default configuration in the [partials/](partials/) directory. It currently +has the structure. + +
handlebars/
+├── helpers.js
+├── partials/
+│   ├── api.md.hbs
+│   ├── changelog.md.hbs
+│   ├── contributing.md.hbs
+│   ├── howitworks.md.hbs
+│   ├── installation.md.hbs
+│   ├── license.md.hbs
+│   ├── overview.md.hbs
+│   └── usage.md.hbs
+├── preprocessor.js
+└── templates/
+    ├── CONTRIBUTING.md.hbs
+    └── README.md.hbs
+ +Every file in the `templates/` directory will create a file in your project root (removing +the `.hbs` extension). The partials are included by calling for example `{{> api.md}}` (also without +the `.hbs` extension) from a template or another partial. + +You can now create a directory `.thought` in the your project root, that has the same structure. +If you create a file `.thought/partials/contributing.md.hbs`, it will replace the default +`partials/contributing.md.hbs` file. Same for templates. + +### Customizing the preprocessor + +Thought uses `preprocessor.js` function to extend the `package.json` before passing it to the handlebars +engine. You can create a file named `.thought/preprocessor.js` in your project to supply your own +preprocessor. If you do that, you should run the old preprocessor by calling `this.parent(data)` from within +your custom function. Some partials and template rely on the data created there. + +### Customizing helpers + +Thought comes with a default set of Handlebars-helpers that are called from within the template. +If you want to provide your own helpers (for example to perform some project-specific computations) +you can create a file named `.thought/helpers.js` in your project. This file should export an object +of helper-functions like + +```js +module.exports = { + myHelper: function(value) { ... }, + myHelper2: function(value) { ... }, +} +``` + +Those helpers are registered with the handlebars engine in addition to the default helpers. If the name +equals a default helper, that helper will be replaced by your helper. Currently there is no way to call +the old helper from within the new helper. + +Thought implicitly uses the [promised-handlebars](https://github.com/nknapp/promised-handlebars)-package +to allow helpers that return promises. So, in your helpers, you will never receive a promise as parameter or +as context data, but if you return promises, they will be resolved seamlessly. + + + + + +## API-reference + + +### thought(options) +Execute Thought in the current directory + +**Kind**: global function +**Api**: public + +| Param | Type | Description | +| --- | --- | --- | +| options | object | | +| options.cwd | string | the working directory to use as project root | + + + + +## License + +`thought` is published under the MIT-license. +See [LICENSE.md](LICENSE.md) for details. + +## Release-Notes + +For release notes, see [CHANGELOG.md](CHANGELOG.md) + +## Contributing guidelines + +See [CONTRIBUTING.md](CONTRIBUTING.md). \ No newline at end of file