Merge Source Files from Directories in Chain

Concept

Import source files from a chain of application modules.

Synposis

Put a configuration file .app_stack.yml in your application directory, in format like:

stack_dir: '../'

The directory contains other modules to import.

stack:
  - module-1
  - module-2: [defaults, tests]
  - module-3:
    - defaults
    - file_a.html: file_a.htm
    - file_b.txt: ''

Define three modules to import (in directory ../module-1, ...). Accord to the above setting, stack_app will copy default set of files exported by module-1, the default and tests set of files from module-2 (file sets defined as string in array), and defaults set of files from module-3, plus file_a.html copied as file_a.htm and file_b.txt copied as it is (single files defined as a hash).

exclude:
  - config/*
  - filename_2

Do not copy config/* and single file filename_2 from the stack.

export:
  - lib/**/*.rb
  - app/**/*.rb
  - tests:
      - spec/**/*.rb

When used as a stack module, export the above files where ruby files under lib/ and app are in the defaults set, besides with the tests set.

attrs:
  application_name: App Name
  application_code: app_code
  database_password: the very secret
  gems:
    default:
      - rspec: '~> 2.0.0'
      - ...
    development:

attrs can be inserted into .erb files.

stack_dir: '../'

Define directory where the source code of stack modules located. Default is ../

tpl_ext: ['.erb', '.haml', '.liquid']

Default as above (refer to document below).

Copy Precedence

For a module chain a, b, c, ..., files exported by b will over-write the same files exported by a and so on.

If you want the files defined in a, manually copy it to the local directory and set it to exclude list.

Note: exclude means 'use local file if exists, otherwise copy it', not 'do not copy it'.

Template

If defined to export, for example Gemfile, and also defined a Gemfile.erb, the later will be used as a template to render Gemefile.

For a module chain a, b, c, ..., attrs defined in c will merged into attrs defined in b ... and then assigned into the erb template.

App_stack use tilt to support .erb, .haml and .liquid, if a file have more than one template defined, the later will silently over-write the former. You can change the order in tpl_ext setting.