With the documentation-decorators ready to be included in my code-templates, 
it's time to take a look at those. There's a circular-reference kind of thing that I 
have to resolve first, though — In order to actually use the decorators, 
they have to import the module that the describe class lives in:
# Make sure the documentation-decorators are available!
from doc_metadata import describeIn order to do that, the Python interpreter has to know where the 
doc_metadata.py file lives. That, in turn, means that I need to decide 
where I'm going to put it, which means that I need to drop it into a project.
I'll start a new project for the framwork-level code that doc_metadata.py 
(arguably) belongs to. That project will be named idic, and it will follow 
the structure shown below, with any of the duplicated project-directories removed.
A Basic Project-Structure
I'm expecting all of the projects on my current list to share a common folder structure. This structure is based on the final deployed/installed location for project-files in an Ubuntu Linux (and presumably POSIX-compliant) file-system, and looks something like this:
| File-system Path | |||||
|---|---|---|---|---|---|
| [Project Root Directory] | |||||
| etc | |||||
| apache2 | |||||
| sites-available | |||||
| usr | |||||
| local | |||||
| bin | |||||
| [project-name] | |||||
| etc | |||||
| idic | |||||
| datastores | |||||
| lib | |||||
| idic | |||||
| [project-name] | |||||
| share | |||||
| doc | |||||
| [project-name] | |||||
| icons | |||||
| [project-name] | |||||
| [project-name] | |||||
| var | |||||
| cache | |||||
| [project-name] | |||||
| www | |||||
| [project-name] | |||||
| media | |||||
| scripts | |||||
| styles | |||||
The directories in this structure have the following roles a the project once it is deployed:
- etc
- Items to be deployed to the global (root-access-only) configuration-file directory
- etc/apache2/sites-available
- Configuration-files for Apache websites.
- usr
- Items to be deployed to the global (root-access-only) usrdirectory
- usr/local/bin/[project-name]
- Executable files associated with the project (command-line applications and scripts).
- usr/local/etc
- Standard local-machine configuration-files directory
- usr/local/etc/idic
- Configuration-files directory for idicapplications
- usr/local/etc/idic/datastores
- Configuration-files for machine-resident idicdata-stores (database-connection credentials)
- usr/local/lib
- Standard local-machine shared-libraries directory
- usr/local/lib/idic
- Shared-library directory for all idic-project codebases
- usr/local/lib/idic/[project-name]
- Shared-library directory for all project-specific shared-library codebases (the top-level package directory for a project's namespace)
- usr/share
- Standard machine-specific shared-resources directory
- usr/share/doc/[project-name]
- Documentation-directory for the project
- usr/share/icons/[project-name]
- Icon-directory for the project
- usr/share/[project-name]
- Directory for other shared resource-files originating with the project
- var
- Items to be deployed to the global (root-access-only) vardirectory
- var/cache/[project-name]
- Space for storing (reading and writing) cache-files for the project.
- var/www/[project-name]
- The document-root directory for a website associated with the project
- var/www/[project-name]/media
- Image (and other media) files for the project website
- var/www/[project-name]/scripts
- Client-side scripts for the project website
- var/www/[project-name]/styles
- Style-sheets for the project website
Some projects may not have the entire directory-tree shown — projects that 
do not include any websites, for example, will not have the var/www/* 
portion of the tree, nor the site-configuration items in etc/apache2/*. 
The build-process that I'm planning to create for the projects I cover here will allow 
variations of files to be defined in the project workspace for each of several 
distinct environments.
Once I start digging in to the packaging- and deployment-processes part of 
the build-process I'll be creating, I expect that many of the top-level directories 
(/etc, /usr and /var) will need some conditional 
installation/set-up — This structure will work fine if the installer
has root access, but not so much for, say, installers wanting to use the codebase 
on a hosting-provider machine that they don't have root access on (and 
cannot convince the provider to install the project[s]). Since I don't know yet 
what the packaging mechanisms are going to be, I'm going to shelve that 
for the time being, knowing that I'll have to look at it again.
All of the directories shown as 
 would be 
renamed to reflect the actual project-name. If multiple [project-name]project-name
 
directories need to exist (for example, if a project provides both a client-facing 
and administrative website), they should be named accordingly, with the project's 
name in the directory-name somewhere.
I'm planning to provide a structure that would accommodate a perhaps-typical 
development-and-migration set-up, and will keep track of files that belong
 
to each specific environment by prefixing them with the environment's name.
 
These environments, their purpose/role, and an example environment-specific file 
name (I picked a website configuration-file as an example) are:
- LOCAL-*
- The LOCAL environment is one that exists on the developer's machine, that is built and deployed to frequently as part of the code-test-debug cycle of ongoing/daily development.
- Example: /etc/apache2/sites-available/LOCAL-site.conf
- DEV-*
- A DEV environment is the first shared environment accessible to all project-developers. The stability (or perhaps even existence) of a deployed project-copy should not be taken as a given — developers may well destroy and rebuild some or all of a project on its dev-environment over and over again every few minutes while working out integration of code from multiple developers.
- Example: /etc/apache2/sites-available/DEV-site.conf
- TEST-*
- A TEST environment is where integrated and hopefully production-ready code is deployed to for purposes of quality assurance and maybe user acceptance. It may or may not have a complete application data-set available, but if it does, that data is probably a mirrored copy of the live environment's data, not the live data-set itself.
- Example: /etc/apache2/sites-available/TEST-site.conf
- STAGE-*
- A STAGE (orSTAGING ) environment is the final stop before a project is deployed to a live environment. Ideally, the staging system(s) will be running on identical hardware, and may have direct access to live-environment application data-sets. A staging environment is often where load-testing is undertaken.
- Example: /etc/apache2/sites-available/STAGE-site.conf
- LIVE-*
- The final live/production environment, where an application is available to all of the users it's intended to be available to.
- Example: /etc/apache2/sites-available/LIVE-site.conf
So, to be clear, the example files noted above would exist side by side in a project's directory-tree like so:
| File-system Path | Purpose | |||||
|---|---|---|---|---|---|---|
| etc | ||||||
| apache2 | ||||||
| sites-available | ||||||
| DEV-site.conf | Dev-environment's site-configuration. | |||||
| LIVE-site.conf | Live-environment's site-configuration. | |||||
| LOCAL-site.conf | Local-environment's site-configuration. | |||||
| STAGE-site.conf | Stage-environment's site-configuration. | |||||
| TEST-site.conf | Test-environment's site-configuration. | |||||
The build-process for a given environment would then remove all of the files whose 
names indicate they are not part of the build for that environment (e.g., a LOCAL 
build would remove DEV-*, TEST-*, STAGE-* and LIVE-* files), and rename the LOCAL-* 
files to remove their LOCAL-
 prefixes, leaving, for example, a 
site.conf file that is specifically aimed at the environment the build 
is being created for. This is a pretty brute-force process, but it's simple, easily 
understood (I think), and relatively easily managed in Makefile code.
Each project would also have its own Makefile (not shown) in the 
top-level project-directory. I'm also expecting a few installation-scripts at a 
minimum to reside at the same level, but that will depend on the packaging-mechanism 
decision I mentioned in my previous post, so I'm not showing (or committed to) any 
specific structure or approach just yet.
I'm not completely sure, but I suspect that his project-structure would work for any project-type (e.g., for projects that aren't centering around a Python codebase). Since I don't really have anything in my project-queue that isn't a Python project, I'm happy enough to use this structure until/unless I find that I need to vary it for some other project.
Oh... And since doc_metadata.py belongs to the idic project 
(and eventually namespace), it will live at 
[project-root]/usr/local/lib/idic/doc_metadata.py
That feels like enough for this post, particularly after all of the longer ones of late. The next few posts will delve into module- and package-file templates, then I'll probably generate and share templates or snippets for classes and other language-level elements that it makes sense to have them for.
 
No comments:
Post a Comment