Transfer ad-hoc setup docs to tutorial project
This commit is contained in:
		
							parent
							
								
									7d726b9f79
								
							
						
					
					
						commit
						4d35e43c15
					
				
					 6 changed files with 654 additions and 7 deletions
				
			
		
							
								
								
									
										8
									
								
								Vagrantfile
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Vagrantfile
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					# -*- mode: ruby; -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vagrant.configure("2") do |config|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # target machine runs Debian 10 "buster"
 | 
				
			||||||
 | 
					  config.vm.box = "debian/buster64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,7 @@ release = '0.1'
 | 
				
			||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 | 
					# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 | 
				
			||||||
# ones.
 | 
					# ones.
 | 
				
			||||||
extensions = [
 | 
					extensions = [
 | 
				
			||||||
 | 
					    'sphinx.ext.todo',
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Add any paths that contain templates here, relative to this directory.
 | 
					# Add any paths that contain templates here, relative to this directory.
 | 
				
			||||||
| 
						 | 
					@ -41,6 +42,9 @@ templates_path = ['_templates']
 | 
				
			||||||
# This pattern also affects html_static_path and html_extra_path.
 | 
					# This pattern also affects html_static_path and html_extra_path.
 | 
				
			||||||
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 | 
					exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Allow todo entries to show up.
 | 
				
			||||||
 | 
					todo_include_todos = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# -- Options for HTML output -------------------------------------------------
 | 
					# -- Options for HTML output -------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										194
									
								
								docs/create-project.rst
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								docs/create-project.rst
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,194 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. highlight:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Create a New Project
 | 
				
			||||||
 | 
					====================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now that you've setup your development environment, you're ready to create a
 | 
				
			||||||
 | 
					new Rattail-based project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. todo::
 | 
				
			||||||
 | 
					   link to dev env setup doc here?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note again that while Rattail is a project in itself, your app is yet another
 | 
				
			||||||
 | 
					project, which is "based" on Rattail but otherwise has a life of its own.  It
 | 
				
			||||||
 | 
					is *not* a "fork" of Rattail but intsead uses Rattail as a library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Notes About Names
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are some points to be made here, regarding project names.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First point has to do with the "types" of names involved.  Really there are 3:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* "repo" name
 | 
				
			||||||
 | 
					* "project" name
 | 
				
			||||||
 | 
					* "package" name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What we're calling "repo" name here, refers to the so-called "slug" name for
 | 
				
			||||||
 | 
					the repo, e.g. the actual folder name for the repo on disk.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What we're calling "project" name here, refers to the "official" project name,
 | 
				
			||||||
 | 
					e.g. as it might be registered on PyPI or generally referenced in
 | 
				
			||||||
 | 
					documentation, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					What we're calling "package" name here, refers to the actual name of the Python
 | 
				
			||||||
 | 
					package contained within the project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And there technically is a 4th, the "virtualenv" name.  This refers to the
 | 
				
			||||||
 | 
					Python virtual environment you will create, within which you will install your
 | 
				
			||||||
 | 
					project.  This virtualenv name need not be related necessarily, to your project
 | 
				
			||||||
 | 
					name, but in practice it usually would be.  In some cases you may have multiple
 | 
				
			||||||
 | 
					virtualenvs and each must of course get a unique name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Some examples will surely help.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. todo::
 | 
				
			||||||
 | 
					   should really have a table instead of lists here?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example Project: Poser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* repo name: poser
 | 
				
			||||||
 | 
					* project name: Poser
 | 
				
			||||||
 | 
					* package name: poser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example Project: rattail-tutorial
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* repo name: rattail-tutorial
 | 
				
			||||||
 | 
					* project name: rattail-tutorial
 | 
				
			||||||
 | 
					* package name: rattut
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note how the "Poser" name is much more friendly and homogenous as compared to
 | 
				
			||||||
 | 
					the "rattail-tutorial" name, when considering all 3 "types" of names involved.
 | 
				
			||||||
 | 
					Really "rattail-tutorial" is not an example of a good name per se, but it was
 | 
				
			||||||
 | 
					given to this project for other reasons.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This sort of brings us to the second point about names, which is that they
 | 
				
			||||||
 | 
					*should* be "good" generally speaking.  You ideally would want a name more like
 | 
				
			||||||
 | 
					"Poser" in that it's simple and easily recognizable, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. todo::
 | 
				
			||||||
 | 
					   link to "how to name project" doc
 | 
				
			||||||
 | 
					   (https://rattailproject.org/moin/LilSnippets/ProjectNaming)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Creating the Virtual Environment
 | 
				
			||||||
 | 
					--------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As mentioned above, the name you give your virtual environment is really up to
 | 
				
			||||||
 | 
					you, and needn't "match" your project name etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Let's assume for a moment that you are creating a new project (described next)
 | 
				
			||||||
 | 
					named "Poser" - you likely will want to make a virtualenv named "poser" also::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   mkvirtualenv --python=/usr/bin/python3 poser
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					Note that you should specify the path to your Python 3 executable, to avoid
 | 
				
			||||||
 | 
					using the "default" which is likely still Python 2 at this time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For the sake of this tutorial, we'll be using the "rattut" env name::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   mkvirtualenv --python=/usr/bin/python3 rattut
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					Please note that pretty much all subsequent commands shown, will assume your
 | 
				
			||||||
 | 
					virtual environment (regardless what you named it) is currently *active*.  It
 | 
				
			||||||
 | 
					should be obvious when a virtualenv is active, since it should modify the shell
 | 
				
			||||||
 | 
					prompt to reflect that.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you do need to deactivate your current virtualenv, you can do that with::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   deactivate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And then to re-activate your virtualenv you do::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   workon rattut
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Or maybe ``workon poser`` etc., whatever named env you want to activate.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Installing Rattail Packages
 | 
				
			||||||
 | 
					---------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you're just wanting to run the rattail-tutorial app instead of creating your
 | 
				
			||||||
 | 
					own project, you can skip this step.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But in this tutorial we're showing how to do it all, and so before we can
 | 
				
			||||||
 | 
					create the tutorial project itself we must first install some Rattail packages
 | 
				
			||||||
 | 
					to our virtual environment.  Well really there's just one (Tailbone) which is
 | 
				
			||||||
 | 
					needed because it contains the "rattail" scaffold, and also it depends on other
 | 
				
			||||||
 | 
					packages (namely, Pyramid) which are needed for the scaffold feature::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   pip install Tailbone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Creating the Project
 | 
				
			||||||
 | 
					--------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Again if you're just wanting to run the rattail-tutorial app you can skip this
 | 
				
			||||||
 | 
					step.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First of all you should change directory to wherever you want to create the
 | 
				
			||||||
 | 
					actual project source folder.  Rattail docs will generally assume that's at
 | 
				
			||||||
 | 
					``~/src`` in which case you should do something like::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   mkdir -p ~/src
 | 
				
			||||||
 | 
					   cd ~/src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Remember all that talk about names, up above?  Well now you will be specifying
 | 
				
			||||||
 | 
					a *single* name when creating your project.  In practice the name you provide:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* should be lower-cased
 | 
				
			||||||
 | 
					* will be used as-is for the "repo" name
 | 
				
			||||||
 | 
					* will be capitalized (and weird chars replaced) to obtain "project" name
 | 
				
			||||||
 | 
					* will be used as-is for the "package" name, except weird chars replaced by "_"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Got all that straight?  If not, no worries, just try this a few times and see
 | 
				
			||||||
 | 
					what you end up with.  Assuming you did want the project name "Poser" you would
 | 
				
			||||||
 | 
					run the command::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   pcreate -s rattail poser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This will use the "scaffold" (basically, set of templates) which is named
 | 
				
			||||||
 | 
					"rattail" to generate a new folder containing files which define a new "Poser"
 | 
				
			||||||
 | 
					project, within the "poser" folder under current directory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since this tutorial project is named "rattail-tutorial" and there's no possible
 | 
				
			||||||
 | 
					way for the scaffold to know that we want to use "rattut" as the Python package
 | 
				
			||||||
 | 
					name, we had to simply "pick our poison" when generating the initial tutorial
 | 
				
			||||||
 | 
					project.  In other words we did::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   pcreate -s rattail rattail-tutorial
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that per the above rules, what the scaffold assumed by default was:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* repo name was "rattail-tutorial"
 | 
				
			||||||
 | 
					* project name was "Rattail_tutorial"
 | 
				
			||||||
 | 
					* package name was "rattail_tutorial"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We'll clean that up a bit shortly, but first let's start Git tracking.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Making a Git Repo
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We never want to start a new project without also starting a proper Git repo
 | 
				
			||||||
 | 
					for it.  We will want to be able to ``git push`` the code to a central
 | 
				
			||||||
 | 
					location, e.g. GitHub or similar.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Change directory to your new project's source repo folder and then initialize::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   git init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We also want our first commit to include all the generated code so far::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git add .
 | 
				
			||||||
 | 
					   git commit -m "Initial content as generated from project scaffold"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now we'll establish our upstream and do our first push.  How exactly you go
 | 
				
			||||||
 | 
					about this may vary, and certainly the commands shown here will *not* work for
 | 
				
			||||||
 | 
					you as-is, since your "origin" at least will need to be different::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git remote add origin git@rattailproject.org:/srv/git/rattail-tutorial.git
 | 
				
			||||||
 | 
					   git push --set-upstream origin master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And finally, at least in the case of this tutorial project, we wanted to go
 | 
				
			||||||
 | 
					through and clean up some of the generated names, as well as assign authorship
 | 
				
			||||||
 | 
					and project description etc. within the ``setup.py`` file.  (Then commit those
 | 
				
			||||||
 | 
					changes and do another push, so we again have "clean" git status.)
 | 
				
			||||||
| 
						 | 
					@ -1,15 +1,59 @@
 | 
				
			||||||
.. rattail-tutorial documentation master file, created by
 | 
					 | 
				
			||||||
   sphinx-quickstart on Fri Aug 16 21:39:33 2019.
 | 
					 | 
				
			||||||
   You can adapt this file completely to your liking, but it should at least
 | 
					 | 
				
			||||||
   contain the root `toctree` directive.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Welcome to rattail-tutorial's documentation!
 | 
					Rattail Tutorial
 | 
				
			||||||
============================================
 | 
					================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First of all, welcome to Rattail!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This project is a tutorial of sorts, to show how to use Rattail in the real
 | 
				
			||||||
 | 
					world.  (It is accordingly named 'rattail-tutorial'.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					While it aims to cover many areas, this tutorial is not exhaustive.  This
 | 
				
			||||||
 | 
					project's goals include:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* show how to setup your development environment
 | 
				
			||||||
 | 
					* show how to create a new project
 | 
				
			||||||
 | 
					* show how to get your project up and running, i.e. with a database and web app
 | 
				
			||||||
 | 
					* show how to customize and extend your app in various ways, to suit your needs
 | 
				
			||||||
 | 
					* show how to integrate with another system (CORE-POS) in a custom way
 | 
				
			||||||
 | 
					* provide a "working example" of all documented concepts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					That last one means, you can install and run the rattail-tutorial app yourself,
 | 
				
			||||||
 | 
					and e.g. further customize it to get a feel for Rattail.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please see `https://rattailproject.org/docs/rattail-tutorial/
 | 
				
			||||||
 | 
					<https://rattailproject.org/docs/rattail-tutorial/>`_ for the latest version of
 | 
				
			||||||
 | 
					this document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Front Matter
 | 
				
			||||||
 | 
					------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It will be helpful to understand a few things before you get started:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Rattail itself is a "library" more than it is an "app".** The idea is that the
 | 
				
			||||||
 | 
					Rattail Project will provide "most" of the base functionality you need from an
 | 
				
			||||||
 | 
					app, but ultimately you must create a project of your own, which "uses" Rattail
 | 
				
			||||||
 | 
					functionality to accomplish *your* goals.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Rattail docs always refer to "your" app with the name "Poser".** In fact this
 | 
				
			||||||
 | 
					tutorial will *not* be using the name "Poser" (much) - but that is usually what
 | 
				
			||||||
 | 
					you will see in all *other* docs, to represent "your" (i.e. any custom) app.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**This "rattail-tutorial" project is a proper app.** Following from the
 | 
				
			||||||
 | 
					previous point, this project/app is named "rattail-tutorial" and therefore
 | 
				
			||||||
 | 
					instead of using the name "Poser" within this tutorial, we will be using its
 | 
				
			||||||
 | 
					*actual* name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Table of Contents
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. toctree::
 | 
					.. toctree::
 | 
				
			||||||
   :maxdepth: 2
 | 
					   :maxdepth: 2
 | 
				
			||||||
   :caption: Contents:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   setup-dev
 | 
				
			||||||
 | 
					   create-project
 | 
				
			||||||
 | 
					   start-docs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Indices and tables
 | 
					Indices and tables
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										275
									
								
								docs/setup-dev.rst
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								docs/setup-dev.rst
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,275 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. highlight:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setup Development Environment
 | 
				
			||||||
 | 
					=============================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These are the main requirements for a development environment, as pertains to
 | 
				
			||||||
 | 
					Rattail:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Linux (Debian-ish)
 | 
				
			||||||
 | 
					* Git
 | 
				
			||||||
 | 
					* Python (3.x)
 | 
				
			||||||
 | 
					* virtualenvwrapper
 | 
				
			||||||
 | 
					* PostgreSQL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Technically it's possible for you to work around some of these, but not all.
 | 
				
			||||||
 | 
					However this tutorial will assume that all these requirements are met.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now we'll go through these requirements in more detail, and how to satisfy each
 | 
				
			||||||
 | 
					one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Linux
 | 
				
			||||||
 | 
					-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So, the operating system upon which production Rattail software runs, is
 | 
				
			||||||
 | 
					generally assumed to be `Linux`_.  To the author's knowledge, this holds true
 | 
				
			||||||
 | 
					across all existing production installs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _Linux: https://en.wikipedia.org/wiki/Linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There is technically one exception to this: the Rattail "File Monitor service"
 | 
				
			||||||
 | 
					(which is the Windows equivalent of the Rattail "File Monitor daemon" on Linux)
 | 
				
			||||||
 | 
					of course does run (only) on Windows, and has been used heavily in production.
 | 
				
			||||||
 | 
					But one of its primary tasks is usually just to move files (e.g. which emanate
 | 
				
			||||||
 | 
					from POS system) over to the "real" Rattail server on Linux somewhere.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is possible that you could run a full Rattail stack on Windows (or MacOS for
 | 
				
			||||||
 | 
					that matter?), e.g. with PostgreSQL database and web app, possibly even
 | 
				
			||||||
 | 
					datasync etc.  However there is no effort put toward supporting that currently,
 | 
				
			||||||
 | 
					so again Linux is assumed here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now that we've established Linux, we go a bit further and specify
 | 
				
			||||||
 | 
					"Debian-ish" - in practice the only two distros used so far, are `Debian`_ and
 | 
				
			||||||
 | 
					`Ubuntu`_.  You are encouraged to use a "stable" version here, regardless of
 | 
				
			||||||
 | 
					which distro you prefer.  It's likely other distros would work also, as far as
 | 
				
			||||||
 | 
					just running the app(s); however some of Rattail's "configuration management"
 | 
				
			||||||
 | 
					utilities (use of which is of course optional) are built with Debian/Ubuntu in
 | 
				
			||||||
 | 
					mind.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _Debian: https://www.debian.org/
 | 
				
			||||||
 | 
					.. _Ubuntu: https://ubuntu.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The "where" question is worth mentioning here too.  In practice a production
 | 
				
			||||||
 | 
					Rattail server can be either a bare-metal machine running on your local
 | 
				
			||||||
 | 
					network, or indeed a "virtual" machine running either locally or in the cloud.
 | 
				
			||||||
 | 
					Whether you run locally or in the cloud usually will depend on other factors,
 | 
				
			||||||
 | 
					e.g. if the app must integrate directly with a POS system then it probably must
 | 
				
			||||||
 | 
					run on the local network.  (And of course you can always run in "both" places,
 | 
				
			||||||
 | 
					with datasync keeping everything flowing smoothly between them.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setting It Up
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In this tutorial we will be using `Vagrant`_ to spin up a local Debian Linux
 | 
				
			||||||
 | 
					virtual machine (VM) with `VirtualBox`_ as the "provider".  This is primarily
 | 
				
			||||||
 | 
					so we can show an example which you could reproduce on your end, but also one
 | 
				
			||||||
 | 
					which could stay "isolated" and not interfere with any other stuff you may have
 | 
				
			||||||
 | 
					going on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _Vagrant: https://www.vagrantup.com/
 | 
				
			||||||
 | 
					.. _VirtualBox: https://www.virtualbox.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First thing then, will be to install VirtualBox and Vagrant if you do not
 | 
				
			||||||
 | 
					already have them.  You must install these to your "bare-metal development"
 | 
				
			||||||
 | 
					machine, i.e. your laptop.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once those are in place, you can use the ``Vagrantfile`` which comes with this
 | 
				
			||||||
 | 
					(rattail-tutorial) project, to create a new VM.  Note that this VM does not
 | 
				
			||||||
 | 
					come with any special behavior, it's as "vanilla" as possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here is the contents of this ``Vagrantfile`` in case you need to create your
 | 
				
			||||||
 | 
					own, outside of the rattail-tutorial project:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. literalinclude:: ../Vagrantfile
 | 
				
			||||||
 | 
					   :language: ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Change to the directory which contains your ``Vagrantfile`` and then run
 | 
				
			||||||
 | 
					``vagrant up``, e.g.::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   vagrant up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Those commands assume your "host" machine (i.e. your laptop) runs Linux too,
 | 
				
			||||||
 | 
					though of course that may not be so.  Please adjust accordingly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Confirming It Works
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are really two things you should check, to confirm "all is well"
 | 
				
			||||||
 | 
					regarding your new Linux machine, regardless of whether it's a Vagrant VM, or
 | 
				
			||||||
 | 
					some bare-metal machine.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Check #1** - Can you open a console terminal for the machine?  If it's
 | 
				
			||||||
 | 
					bare-metal then this probably just means making sure the keyboard and/or mouse
 | 
				
			||||||
 | 
					are working, and you can login.  If it's virtual then this probably means
 | 
				
			||||||
 | 
					making sure you can ssh into it.  (You may want to use ssh even if it's
 | 
				
			||||||
 | 
					bare-metal, depending on its role etc.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Check #2** - Are you able to use ``sudo`` for elevated privileges?  If the
 | 
				
			||||||
 | 
					Check #1 passed then you should be able to run e.g. ``sudo whoami`` on the
 | 
				
			||||||
 | 
					terminal.  It's okay to be prompted for a password as long as you know what
 | 
				
			||||||
 | 
					that is. ;) Otherwise this check fails.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that if you're using Vagrant, you should be able to do ``vagrant ssh`` in
 | 
				
			||||||
 | 
					order to connect, and from there ``sudo`` should be no problem.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Git
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This one's pretty obvious and you may already have it, but we'll cover it
 | 
				
			||||||
 | 
					anyway to be thorough.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setting It Up
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Install with::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But we'll also want to define your Git user identity, e.g.::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git config --global user.name "John Doe"
 | 
				
			||||||
 | 
					   git config --global user.email "john@example.com"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Confirming It Works
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This should work as expected::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git --version
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					Also these should output the same values as you defined above::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git config --global user.name
 | 
				
			||||||
 | 
					   git config --global user.email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Python
 | 
				
			||||||
 | 
					------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since we're assuming Linux here (e.g. on the Vagrant VM), you probably already
 | 
				
			||||||
 | 
					have Python installed.  However we do want to make sure you have Python 3.x -
 | 
				
			||||||
 | 
					since Python 2 is EOL quite soon as of this writing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setting It Up
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To make sure you have Python 3.x, run the following command::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Confirming It Works
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should now be able to confirm a Python 3.x binary with this command::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   python3 --version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You probably also should find out where exactly this binary lives::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   which python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The output from that most likely points to ``/usr/bin/python3`` but please make
 | 
				
			||||||
 | 
					a note of your location if it's different.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Misc. Other Dependencies
 | 
				
			||||||
 | 
					------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These don't really fit any other category, and aren't *necessarily* required,
 | 
				
			||||||
 | 
					depending on your project etc.  But they're often necessary and we might as
 | 
				
			||||||
 | 
					well install them just in case::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y build-essential
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					virtualenvwrapper
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `virtualenvwrapper`_ package is, in this author's opinion, quite useful for
 | 
				
			||||||
 | 
					both Rattail development, as well as production installs.  For this reason,
 | 
				
			||||||
 | 
					this tutorial will assume its presence, even though technically Rattail does
 | 
				
			||||||
 | 
					not require it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setting It Up
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Before actually installing virtualenvwrapper, let's prep our "workon home"
 | 
				
			||||||
 | 
					directory.  This tutorial assumes, as do all Rattail docs, that the workon home
 | 
				
			||||||
 | 
					resides at ``/srv/envs`` - again you're free to use another location, but all
 | 
				
			||||||
 | 
					docs will assume that one.  These commands should prep the workon home folder
 | 
				
			||||||
 | 
					(adjust path and/or username as needed)::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo mkdir /srv/envs
 | 
				
			||||||
 | 
					   sudo chown you:you /srv/envs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that for development it's often convenient to make this folder owned by
 | 
				
			||||||
 | 
					"you" whereas in production installs the author recommends making this folder
 | 
				
			||||||
 | 
					owned by a special "rattail" system user.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now for virtualenvwrapper itself.  There are technically a few ways to go about
 | 
				
			||||||
 | 
					this, but for the sake of the tutorial we'll just do this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y virtualenvwrapper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Next you must add the following to your ``~/.bashrc`` file::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   export WORKON_HOME=/srv/envs
 | 
				
			||||||
 | 
					   source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And finally you must "re-run" your ``.bashrc`` so these things actually take
 | 
				
			||||||
 | 
					effect for your current session::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   source ~/.bashrc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Confirming It Works
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First of all just to be 100% sure, you ideally should reboot your new machine,
 | 
				
			||||||
 | 
					or perhaps at least logout and then login again.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But really the check here, is to make sure the following command runs okay::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   workon --help
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PostgreSQL
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Rattail uses `PostgreSQL`_ exclusively, for its "primary" database backend.  So
 | 
				
			||||||
 | 
					whereas Rattail can interact with many other types of SQL databases, it uses
 | 
				
			||||||
 | 
					Postgres for its "own" database(s).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _PostgreSQL: https://www.postgresql.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Technically the database is optional, depending on how you need to use Rattail,
 | 
				
			||||||
 | 
					although it is required for the web app.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Setting It Up
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are really two aspects of this setup, a) Postgres proper, and b) Python
 | 
				
			||||||
 | 
					support for Postgres.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We'll tackle the first aspect, well, first::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y postgresql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Next we'll tackle the second aspect::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo apt install -y libpq-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Confirming It Works
 | 
				
			||||||
 | 
					^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As with the setup for Postgres, there are really two things to check here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First, is the PostgreSQL service running and available?  You should be able to
 | 
				
			||||||
 | 
					confirm that with (should output list of databases)::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   sudo -u postgres psql -l
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Second, is Python support for Postgres installed correctly?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. todo::
 | 
				
			||||||
 | 
					   what else should we say about the second aspect here?  other than, TBD
 | 
				
			||||||
 | 
					   (aka. "when you need it you'll know")
 | 
				
			||||||
							
								
								
									
										122
									
								
								docs/start-docs.rst
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								docs/start-docs.rst
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,122 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. highlight:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documenting Your Project
 | 
				
			||||||
 | 
					========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					At this point we assume you already have created a new project, and established
 | 
				
			||||||
 | 
					the Git repo for it etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now we'll walk through the steps for creating documentation for your project.
 | 
				
			||||||
 | 
					We won't get too far in the weeds here but will seek to establish a foundation
 | 
				
			||||||
 | 
					to which you can easily add later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The reason we cover docs so early in the game, is because as this tutorial
 | 
				
			||||||
 | 
					project itself is being built, the docs in practice will come before most of
 | 
				
			||||||
 | 
					the app code.  So we are just documenting steps as we encounter them, while
 | 
				
			||||||
 | 
					building the tutorial.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Install Sphinx
 | 
				
			||||||
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As is typical for Python projects, the docs we maintain within our project will
 | 
				
			||||||
 | 
					use `Sphinx`_, which in turn uses `reStructuredText`_ for the primary syntax.
 | 
				
			||||||
 | 
					Sphinx offers a lot of convenience, and is configurable, can be extended etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _Sphinx: https://www.sphinx-doc.org/
 | 
				
			||||||
 | 
					.. _reStructuredText: https://docutils.readthedocs.io/en/sphinx-docs/user/rst/quickstart.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may not yet have Sphinx installed to your virtualenv, but we can fix that
 | 
				
			||||||
 | 
					now.  Run this command just to be sure::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   pip install rattail[docs]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sphinx Quickstart
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sphinx comes with a "quickstart" command, which you can use to walk through the
 | 
				
			||||||
 | 
					process of creating a new documentation folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First change directory to your project's source repo folder, then run the
 | 
				
			||||||
 | 
					quickstart command like so.  Note, this will create a 'docs' folder::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   sphinx-quickstart --project rattail-tutorial docs
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					You will be prompted for a few things, mostly you can use the default option or
 | 
				
			||||||
 | 
					provide some basic answer to each, and it will work out okay.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Before you go any further you may want to consider committing the generated
 | 
				
			||||||
 | 
					docs code as-is, to help keep track of changes *you* make from there::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   git add docs
 | 
				
			||||||
 | 
					   git commit -m "Initial docs as generated by sphinx-quickstart"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Building the Docs
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					With the above steps complete, you should have a basic docs folder with some
 | 
				
			||||||
 | 
					minimal default content, in reStructuredText format.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These docs must be "built" which generates HTML (or other formats) from the
 | 
				
			||||||
 | 
					reST source.  This is how you'll (re-)build docs from now on::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial/docs
 | 
				
			||||||
 | 
					   make html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This will generate HTML within the ``_build`` folder underneath the docs
 | 
				
			||||||
 | 
					folder.  You can then view these docs e.g. with::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   firefox _build/html/index.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that each time docs are built, it tries to avoid re-building things which
 | 
				
			||||||
 | 
					haven't changed since last build.  It sometimes may be helpful to "clean" the
 | 
				
			||||||
 | 
					docs build, i.e. wipe it out so the next build is forced to rebuild
 | 
				
			||||||
 | 
					everything::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   make clean
 | 
				
			||||||
 | 
					   make html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now if you check your git status, you'll probably see the ``_build`` folder is
 | 
				
			||||||
 | 
					considered "untracked" by git.  However we don't want git to concern itself
 | 
				
			||||||
 | 
					with this folder at all, so we should ignore that, e.g. by doing::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   echo 'docs/_build/' >> .gitignore
 | 
				
			||||||
 | 
					   git add .gitignore
 | 
				
			||||||
 | 
					   git commit -m "Ignore docs build folder"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And finally, there is another gotcha which you won't notice until you clone
 | 
				
			||||||
 | 
					your project's source repo to another location, and try to build docs there.
 | 
				
			||||||
 | 
					It's not a real big deal, but you may see a warning when the docs are building,
 | 
				
			||||||
 | 
					such as:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. code-block:: none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   copying static files... WARNING: html_static_path entry '.../src/rattail-tutorial/docs/_static' does not exist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To prevent that, we'll add a stub file to our repo which will ensure that
 | 
				
			||||||
 | 
					folder always exists::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   mkdir -p docs/_static
 | 
				
			||||||
 | 
					   touch docs/_static/.keepme
 | 
				
			||||||
 | 
					   git add docs/_static/.keepme
 | 
				
			||||||
 | 
					   git commit -m "Add stub file to prevent docs build warning"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Writing Some Docs!
 | 
				
			||||||
 | 
					------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Again it may not make sense for you to do much of this, at this point in the
 | 
				
			||||||
 | 
					game.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But while building this tutorial, all docs written up to this point have *not*
 | 
				
			||||||
 | 
					been part of the project's docs repo proper, but rather were created as simple
 | 
				
			||||||
 | 
					ad-hoc text files.  So our next step is simply to "transfer" all docs content
 | 
				
			||||||
 | 
					created thus far, from these ad-hoc files, into the project docs folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This was a pretty manual process, then at the end we commit all changes::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   cd ~/src/rattail-tutorial
 | 
				
			||||||
 | 
					   git add docs
 | 
				
			||||||
 | 
					   git commit -m "Transfer ad-hoc setup docs to tutorial project"
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue