prick 0.3.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/TODO +7 -0
- data/exe/prick +235 -163
- data/lib/ext/fileutils.rb +7 -0
- data/lib/prick.rb +7 -5
- data/lib/prick/builder.rb +31 -8
- data/lib/prick/cache.rb +34 -0
- data/lib/prick/constants.rb +106 -54
- data/lib/prick/database.rb +26 -20
- data/lib/prick/diff.rb +103 -25
- data/lib/prick/git.rb +31 -9
- data/lib/prick/head.rb +183 -0
- data/lib/prick/migration.rb +41 -181
- data/lib/prick/program.rb +255 -0
- data/lib/prick/project.rb +264 -0
- data/lib/prick/rdbms.rb +3 -12
- data/lib/prick/schema.rb +6 -11
- data/lib/prick/state.rb +129 -74
- data/lib/prick/version.rb +41 -28
- data/prick.gemspec +3 -1
- data/share/diff/diff.after-tables.sql +4 -0
- data/share/diff/diff.before-tables.sql +4 -0
- data/share/diff/diff.tables.sql +8 -0
- data/share/migration/diff.tables.sql +8 -0
- data/share/{release_migration → migration}/features.yml +0 -0
- data/share/migration/migrate.sql +3 -0
- data/share/{release_migration → migration}/migrate.yml +3 -0
- data/share/migration/tables.sql +3 -0
- data/share/{schemas → schema/schema}/build.yml +0 -0
- data/share/{schemas → schema/schema}/prick/build.yml +0 -0
- data/share/schema/schema/prick/data.sql +7 -0
- data/share/{schemas → schema/schema}/prick/schema.sql +0 -0
- data/share/{schemas → schema/schema}/prick/tables.sql +2 -2
- data/share/{schemas → schema/schema}/public/.keep +0 -0
- data/share/{schemas → schema/schema}/public/build.yml +0 -0
- data/share/{schemas → schema/schema}/public/schema.sql +0 -0
- data/test_refactor +34 -0
- metadata +23 -21
- data/file +0 -0
- data/lib/prick/build.rb +0 -376
- data/lib/prick/migra.rb +0 -22
- data/share/feature_migration/diff.sql +0 -2
- data/share/feature_migration/migrate.sql +0 -2
- data/share/release_migration/diff.sql +0 -3
- data/share/release_migration/migrate.sql +0 -5
- data/share/schemas/prick/data.sql +0 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 98dae1ae969be39dba2d394c5ef973837bddd75b57e95a50984369b9b63b68a9
         | 
| 4 | 
            +
              data.tar.gz: 2d346ef2b8b6ea0bde7c6a0442278f9c9a3132a8268555417790f7cd5f45a936
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: fe461c8c031c7279cdd53329b92808a92367939841d30c4e7a995ae2c42e089fbdf0c8e143beef9997512bb94dc0b2c838df83d8990b545a27dec1ab94e0f3ba
         | 
| 7 | 
            +
              data.tar.gz: 03cd1324f95be8e3672cc0e1a05e1818c287d62e786a4ac27eebf42d9f71151766d7002f1f19de0c1f44b86568797e80d96e6209103661ba1d4cb8132d959ca8
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/TODO
    CHANGED
    
    | @@ -1,3 +1,10 @@ | |
| 1 1 |  | 
| 2 | 
            +
            o Check for commits to tags
         | 
| 3 | 
            +
            o Accumulate version history in prick.versions instead of just having the newest
         | 
| 4 | 
            +
            o Using rc's in migration syntax: fork-version-fork-version.rc1 ?
         | 
| 2 5 | 
             
            o Make it possible to execute prick in any subdirecty instead of only in the root
         | 
| 6 | 
            +
            o Hack migra to create separate file(s) for table changes
         | 
| 7 | 
            +
            o Also execute subject/ directory if only a subject.sql is found. subject.yml
         | 
| 8 | 
            +
              should still override everything
         | 
| 9 | 
            +
            o Track included files - this will make dependency checks much easier
         | 
| 3 10 |  | 
    
        data/exe/prick
    CHANGED
    
    | @@ -4,180 +4,163 @@ require 'prick.rb' | |
| 4 4 | 
             
            require 'prick/program.rb'
         | 
| 5 5 |  | 
| 6 6 | 
             
            require 'shellopts'
         | 
| 7 | 
            -
            require 'indented_io'
         | 
| 8 7 |  | 
| 9 8 | 
             
            require 'tempfile'
         | 
| 10 9 |  | 
| 11 10 | 
             
            include ShellOpts
         | 
| 12 11 | 
             
            include Prick
         | 
| 13 12 |  | 
| 14 | 
            -
            PROGRAM = File.basename($0)
         | 
| 15 | 
            -
             | 
| 16 13 | 
             
            SPEC = %(
         | 
| 17 | 
            -
              n,name=NAME
         | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
              v,verbose
         | 
| 21 | 
            -
              q,quiet
         | 
| 22 | 
            -
              version
         | 
| 14 | 
            +
              -n,name=NAME
         | 
| 15 | 
            +
                  Name of project. Defauls to the environment variable `PRICK_PROJECT` if
         | 
| 16 | 
            +
                  set and else the name of the current directory
         | 
| 23 17 |  | 
| 24 | 
            -
               | 
| 18 | 
            +
              -C,directory=DIR
         | 
| 19 | 
            +
                  Change to directory DIR before doing anything else
         | 
| 25 20 |  | 
| 26 | 
            -
               | 
| 27 | 
            -
             | 
| 21 | 
            +
              -h,help COMMAND...
         | 
| 22 | 
            +
                  Print this page
         | 
| 28 23 |  | 
| 29 | 
            -
               | 
| 30 | 
            -
             | 
| 31 | 
            -
              load! d,database=DATABASE
         | 
| 32 | 
            -
              save! d,database=DATABASE
         | 
| 33 | 
            -
              migrate!
         | 
| 24 | 
            +
              +v,verbose
         | 
| 25 | 
            +
                  Be verbose. Repeated --verbose options increase the verbosity level
         | 
| 34 26 |  | 
| 35 | 
            -
               | 
| 36 | 
            -
             | 
| 37 | 
            -
              check!
         | 
| 27 | 
            +
              -q,quiet
         | 
| 28 | 
            +
                  Be quiet
         | 
| 38 29 |  | 
| 39 | 
            -
               | 
| 40 | 
            -
             | 
| 30 | 
            +
              --version
         | 
| 31 | 
            +
                  Print prick version
         | 
| 41 32 |  | 
| 42 | 
            -
               | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
            )
         | 
| 33 | 
            +
              init! -u,user=USER [DIR]
         | 
| 34 | 
            +
                  Initialize a project in the given directory. DIR defaults to the current
         | 
| 35 | 
            +
                  directory. The USER is the postgres user, it defaults to the project name
         | 
| 46 36 |  | 
| 47 | 
            -
             | 
| 37 | 
            +
              info!
         | 
| 38 | 
            +
                  Print project information
         | 
| 48 39 |  | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 40 | 
            +
              list.releases! -m,migrations -c,cancelled 
         | 
| 41 | 
            +
                  List releases. Include migration releases if the --migration option is
         | 
| 42 | 
            +
                  present and also include cancelled releases if the --cancelled option is
         | 
| 43 | 
            +
                  present
         | 
| 52 44 |  | 
| 53 | 
            -
               | 
| 54 | 
            -
             | 
| 45 | 
            +
              list.migrations! 
         | 
| 46 | 
            +
                  List migrations
         | 
| 55 47 |  | 
| 56 | 
            -
               | 
| 57 | 
            -
             | 
| 58 | 
            -
                  Name of project. Defauls to the environment variable `PRICK_PROJECT` if
         | 
| 59 | 
            -
                  set and else the name of the current directory
         | 
| 48 | 
            +
              list.upgrades! [FROM [TO]]
         | 
| 49 | 
            +
                  List available upgrades
         | 
| 60 50 |  | 
| 61 | 
            -
             | 
| 62 | 
            -
                   | 
| 51 | 
            +
              list.cache!
         | 
| 52 | 
            +
                  List cache files
         | 
| 63 53 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
                   | 
| 54 | 
            +
              build! -d,database=DATABASE -C,no-cache [TAG]
         | 
| 55 | 
            +
                  Build the current database from the content in the schemas/ directory.
         | 
| 56 | 
            +
                  With a tag the version is built into the associated versioned database
         | 
| 57 | 
            +
                  and the result is saved to cache unless the -C option is given. The -d
         | 
| 58 | 
            +
                  option overrides the default database
         | 
| 66 59 |  | 
| 67 | 
            -
             | 
| 68 | 
            -
                   | 
| 60 | 
            +
              make! -d,database=DATABASE -C,no-cache [TAG]
         | 
| 61 | 
            +
                  Build the current database from the content in the schemas/ directory.
         | 
| 62 | 
            +
                  With a tag the associated versioned database is loaded from cache if
         | 
| 63 | 
            +
                  present. The -C option ignores the cache and the -d option overrides
         | 
| 64 | 
            +
                  the default database
         | 
| 69 65 |  | 
| 70 | 
            -
             | 
| 71 | 
            -
                   | 
| 66 | 
            +
              make.clean! -a,all
         | 
| 67 | 
            +
                  Drop versioned databases and remove cached and other temporary files.
         | 
| 68 | 
            +
                  Also drop the project database if the -a option is given
         | 
| 72 69 |  | 
| 73 | 
            -
               | 
| 74 | 
            -
             | 
| 75 | 
            -
                   | 
| 76 | 
            -
             | 
| 77 | 
            -
                    current directory. The USER is the postgres user, it defaults to 
         | 
| 78 | 
            -
                    the project name
         | 
| 70 | 
            +
              load! -d,database=DATABASE VERSION|FILE
         | 
| 71 | 
            +
                  Load the cached version or the file into the associated versioned
         | 
| 72 | 
            +
                  database. It is an error if the version hasn't been cached. The --database 
         | 
| 73 | 
            +
                  argument overrides the database
         | 
| 79 74 |  | 
| 80 | 
            -
             | 
| 81 | 
            -
                   | 
| 75 | 
            +
              save! VERSION [FILE]
         | 
| 76 | 
            +
                  Save the versioned database associated with version to the cache or the
         | 
| 77 | 
            +
                  given file
         | 
| 82 78 |  | 
| 83 | 
            -
             | 
| 84 | 
            -
                   | 
| 85 | 
            -
                   | 
| 86 | 
            -
                    List releases/migrations/upgrades
         | 
| 79 | 
            +
              drop! -a,all [DATABASE]
         | 
| 80 | 
            +
                  Drop the given database or all versioned databases. The --all option also
         | 
| 81 | 
            +
                  drops the project database
         | 
| 87 82 |  | 
| 88 | 
            -
             | 
| 89 | 
            -
                   | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
                    if a cache file is present. The -d option overrides the database
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                  make
         | 
| 96 | 
            -
                    Not yet implemented
         | 
| 97 | 
            -
              
         | 
| 98 | 
            -
                  load -d database file|version
         | 
| 99 | 
            -
                    Load a version or file into a database. If the argument is a version the
         | 
| 100 | 
            -
                    assocated versioned database will be loaded from cache. If the argument is
         | 
| 101 | 
            -
                    a file the project database is loaded. The -d option overrides what
         | 
| 102 | 
            -
                    database is used. This is often used to load a specific version into the
         | 
| 103 | 
            -
                    project database ('prick load -d <project-name> <version>') or to load into
         | 
| 104 | 
            -
                    an unrelated database not controlled by prick
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                  save -d database [file]
         | 
| 107 | 
            -
                    Save the project database to the given file. Default file name is the
         | 
| 108 | 
            -
                    username suffixed with project name, custom name, and branch
         | 
| 83 | 
            +
              diff! -m,mark -t,tables -T,notables
         | 
| 84 | 
            +
                  diff [FROM-DATABASE|FROM-VERSION [TO-DATABASE|TO-VERSION]]
         | 
| 85 | 
            +
                  Create a schema diff between the given databases or versions. Default
         | 
| 86 | 
            +
                  to-version is the current schema and default from-version is the base
         | 
| 87 | 
            +
                  version of this branch/tag
         | 
| 109 88 |  | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 89 | 
            +
              migrate!
         | 
| 90 | 
            +
                  Not yet implemented
         | 
| 112 91 |  | 
| 113 | 
            -
             | 
| 114 | 
            -
                  prepare release
         | 
| 115 | 
            -
                    Populate the current migration directory with migration files
         | 
| 92 | 
            +
              prepare! 
         | 
| 93 | 
            +
                  Prepare a release. Just a shorthand for 'prick prepare release'
         | 
| 116 94 |  | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
                    directory. Also prepares the current release directory
         | 
| 95 | 
            +
              prepare.release! [FORK]
         | 
| 96 | 
            +
                  Populate the current migration directory with migration files
         | 
| 120 97 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 98 | 
            +
              prepare.feature! NAME
         | 
| 99 | 
            +
                  Create and populate a feature as a subdirectory of the current directory.
         | 
| 100 | 
            +
                  Also prepares the current release directory
         | 
| 123 101 |  | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
                    directories are kept
         | 
| 102 | 
            +
              prepare.migration! [FROM]
         | 
| 103 | 
            +
                  Create and populate a migration directory
         | 
| 127 104 |  | 
| 128 | 
            -
             | 
| 105 | 
            +
              prepare.schema! NAME
         | 
| 106 | 
            +
                  Create and populate a new schema directory. Existing files and
         | 
| 107 | 
            +
                  directories are kept
         | 
| 108 | 
            +
                
         | 
| 109 | 
            +
              prepare.diff! [VERSION]
         | 
| 110 | 
            +
                  Not yet implemented
         | 
| 129 111 |  | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 112 | 
            +
              include.feature! FEATURE
         | 
| 113 | 
            +
                  Include the given feature in the current pre-release
         | 
| 132 114 |  | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 115 | 
            +
              check!
         | 
| 116 | 
            +
                  Check that the current migration applied to the base version yields the
         | 
| 117 | 
            +
                  same result as loading the current schema
         | 
| 136 118 |  | 
| 137 | 
            -
             | 
| 138 | 
            -
                  create release  | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
                    can be left out if the current branch is a prerelease branch
         | 
| 119 | 
            +
              create.release! [RELEASE]
         | 
| 120 | 
            +
                  Prepare a release and create release directory and migration file before
         | 
| 121 | 
            +
                  tagging and branching to a release branch. The RELEASE argument can be
         | 
| 122 | 
            +
                  left out if the current branch is a prerelease branch
         | 
| 142 123 |  | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
                    
         | 
| 147 | 
            -
                  create feature NAME
         | 
| 148 | 
            -
                    Prepare a feature before branching to a feature branch
         | 
| 124 | 
            +
              create.prerelease! RELEASE
         | 
| 125 | 
            +
                  Prepare a release and create release directory and migration file before
         | 
| 126 | 
            +
                  branching to a prerelease branch
         | 
| 149 127 |  | 
| 150 | 
            -
             | 
| 151 | 
            -
             | 
| 152 | 
            -
                    added a special cancel-tag to the release that makes prick ignore it
         | 
| 128 | 
            +
              create.feature! NAME
         | 
| 129 | 
            +
                  Prepare a feature before branching to a feature branch
         | 
| 153 130 |  | 
| 154 | 
            -
             | 
| 155 | 
            -
                   | 
| 156 | 
            -
             | 
| 131 | 
            +
              cancel! 
         | 
| 132 | 
            +
                  Cancel a release. Just a shorthand for 'prick cancel release'
         | 
| 133 | 
            +
              
         | 
| 134 | 
            +
              cancel.release!
         | 
| 135 | 
            +
                  Cancel a release. Since tags are immutable, the release is cancelled by
         | 
| 136 | 
            +
                  added a special cancel-tag to the release that makes prick ignore it
         | 
| 157 137 |  | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
                    directory
         | 
| 138 | 
            +
              generate.migration! 
         | 
| 139 | 
            +
                  Create a script to migrate the database
         | 
| 161 140 |  | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 141 | 
            +
              generate.schema!
         | 
| 142 | 
            +
                  Create a script to create the database
         | 
| 143 | 
            +
             | 
| 144 | 
            +
              upgrade!
         | 
| 145 | 
            +
                  Migrate the database to match the current schema
         | 
| 146 | 
            +
             | 
| 147 | 
            +
              backup! [FILE]
         | 
| 148 | 
            +
                  Saves a backup of the database to the given file or to the var/spool
         | 
| 149 | 
            +
                  directory
         | 
| 150 | 
            +
                
         | 
| 151 | 
            +
              restore! [FILE]
         | 
| 152 | 
            +
                  Restore the database from the given backup file or from the latest backup
         | 
| 153 | 
            +
                  in the var/spool directory
         | 
| 165 154 | 
             
            )
         | 
| 166 155 |  | 
| 167 156 |  | 
| 168 | 
            -
             | 
| 157 | 
            +
             | 
| 158 | 
            +
            opts, args = ShellOpts.process(SPEC, ARGV)
         | 
| 169 159 |  | 
| 170 160 | 
             
            # Handle --help
         | 
| 171 | 
            -
            if opts.help? | 
| 172 | 
            -
               | 
| 173 | 
            -
             | 
| 174 | 
            -
                file.puts HELP.split("\n").map { |l| l.sub(/^  /, "") } 
         | 
| 175 | 
            -
                file.flush 
         | 
| 176 | 
            -
                system "less #{file.path}" 
         | 
| 177 | 
            -
              ensure 
         | 
| 178 | 
            -
                file.close 
         | 
| 179 | 
            -
              end 
         | 
| 180 | 
            -
              exit 
         | 
| 161 | 
            +
            if opts.help?
         | 
| 162 | 
            +
              ShellOpts.help
         | 
| 163 | 
            +
              exit
         | 
| 181 164 | 
             
            end 
         | 
| 182 165 |  | 
| 183 166 | 
             
            # Handle --version
         | 
| @@ -188,7 +171,7 @@ end | |
| 188 171 |  | 
| 189 172 | 
             
            begin
         | 
| 190 173 | 
             
              # Honor -C option
         | 
| 191 | 
            -
              if opts.directory
         | 
| 174 | 
            +
              if opts.directory?
         | 
| 192 175 | 
             
                if File.exist?(opts.directory)
         | 
| 193 176 | 
             
                  begin
         | 
| 194 177 | 
             
                    Dir.chdir(opts.directory)
         | 
| @@ -206,9 +189,9 @@ begin | |
| 206 189 | 
             
              # Handle init command
         | 
| 207 190 | 
             
              if opts.subcommand == :init
         | 
| 208 191 | 
             
                directory = args.expect(0..1)
         | 
| 209 | 
            -
                name = opts.name || directory || File.basename(Dir.getwd)
         | 
| 210 | 
            -
                user = opts.init | 
| 211 | 
            -
                program. | 
| 192 | 
            +
                name = opts.name || (directory && File.basename(directory)) || File.basename(Dir.getwd)
         | 
| 193 | 
            +
                user = opts.init!.user || name
         | 
| 194 | 
            +
                program.init(name, user, directory || ".")
         | 
| 212 195 | 
             
                exit 0
         | 
| 213 196 | 
             
              end
         | 
| 214 197 |  | 
| @@ -218,51 +201,77 @@ begin | |
| 218 201 | 
             
              VERSION == file.read.to_s or 
         | 
| 219 202 | 
             
                  raise Prick::Fail, ".prick-version required prick-#{file.read} but you're using prick-#{VERSION}"
         | 
| 220 203 |  | 
| 204 | 
            +
              # TODO: Check for dirty detached head
         | 
| 205 | 
            +
             | 
| 221 206 | 
             
              # Expect a sub-command
         | 
| 222 | 
            -
              opts.subcommand | 
| 207 | 
            +
              opts.subcommand or raise Prick::Error, "Subcomand expected"
         | 
| 223 208 |  | 
| 224 209 | 
             
              case opts.subcommand
         | 
| 225 210 | 
             
                when :info
         | 
| 226 211 | 
             
                  args.expect(0)
         | 
| 227 212 | 
             
                  program.info
         | 
| 228 213 |  | 
| 229 | 
            -
                when :build
         | 
| 230 | 
            -
                  version = args.expect(0..1)
         | 
| 231 | 
            -
                  program.build(opts.build.database, version, opts.build.nocache)
         | 
| 232 | 
            -
             | 
| 233 | 
            -
                when :save
         | 
| 234 | 
            -
                  file_or_version = args.expect(0..1)
         | 
| 235 | 
            -
                  program.save(opts.save.database, file_or_version)
         | 
| 236 | 
            -
             | 
| 237 | 
            -
                when :load
         | 
| 238 | 
            -
                  file_or_version = args.expect(1)
         | 
| 239 | 
            -
                  program.load(opts.load.database, file_or_version)
         | 
| 240 | 
            -
             | 
| 241 | 
            -
                when :make
         | 
| 242 | 
            -
                  raise NotYet
         | 
| 243 | 
            -
             | 
| 244 | 
            -
                when :migrate
         | 
| 245 | 
            -
                  raise NotYet
         | 
| 246 | 
            -
             | 
| 247 214 | 
             
                when :list
         | 
| 248 | 
            -
                  command = opts.list
         | 
| 215 | 
            +
                  command = opts.list!
         | 
| 249 216 | 
             
                  case command.subcommand
         | 
| 250 217 | 
             
                    when :releases;
         | 
| 251 | 
            -
                      obj = command.releases
         | 
| 218 | 
            +
                      obj = command.releases!
         | 
| 252 219 | 
             
                      program.list_releases(migrations: obj.migrations?, cancelled: obj.cancelled?)
         | 
| 253 220 | 
             
                    when :migrations; program.list_migrations
         | 
| 254 221 | 
             
                    when :upgrades; program.list_upgrades(*args.expect(0..2).compact)
         | 
| 222 | 
            +
                    when :cache; 
         | 
| 223 | 
            +
                      args.expect(0)
         | 
| 224 | 
            +
                      program.list_cache
         | 
| 255 225 | 
             
                    when NilClass; raise Prick::Error, "list requires a releases|migrations|upgrades sub-command"
         | 
| 256 226 | 
             
                  else
         | 
| 257 227 | 
             
                    raise Prick::Internal, "Subcommand #{opts.subcommand}.#{command.subcommand} is not matched"
         | 
| 258 228 | 
             
                  end
         | 
| 259 229 |  | 
| 230 | 
            +
                when :build
         | 
| 231 | 
            +
                  version = args.expect(0..1)
         | 
| 232 | 
            +
                  program.build(opts.build!.database, version, opts.build!.no_cache?)
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                when :make
         | 
| 235 | 
            +
                  command = opts.make!
         | 
| 236 | 
            +
                  case command.subcommand
         | 
| 237 | 
            +
                    when :clean
         | 
| 238 | 
            +
                      args.expect(0)
         | 
| 239 | 
            +
                      program.make_clean(command.clean!.all?)
         | 
| 240 | 
            +
                    else
         | 
| 241 | 
            +
                      version = args.expect(0..1)
         | 
| 242 | 
            +
                      program.make(opts.make!.database, version, opts.make!.no_cache?)
         | 
| 243 | 
            +
                  end
         | 
| 244 | 
            +
             | 
| 245 | 
            +
                when :load
         | 
| 246 | 
            +
                  version_or_file = args.expect(1)
         | 
| 247 | 
            +
                  program.load(opts.load!.database, version_or_file)
         | 
| 248 | 
            +
             | 
| 249 | 
            +
                when :save
         | 
| 250 | 
            +
                  version, file = args.expect(1..2)
         | 
| 251 | 
            +
                  program.save(version, file)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                when :drop
         | 
| 254 | 
            +
                  program.drop(args.expect(0..1), opts.drop!.all)
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                when :diff
         | 
| 257 | 
            +
                  mark = opts.diff!.mark
         | 
| 258 | 
            +
                  tables = opts.diff!.tables
         | 
| 259 | 
            +
                  no_tables = opts.diff!.notables
         | 
| 260 | 
            +
                  tables.nil? && no_tables.nil? || tables ^ no_tables or
         | 
| 261 | 
            +
                      raise Error, "--tables and --no-tables options are exclusive"
         | 
| 262 | 
            +
                  select = tables ? :tables : (no_tables ? :no_tables : :all)
         | 
| 263 | 
            +
                  from, to = args.expect(0..2)
         | 
| 264 | 
            +
                  program.diff(from, to, mark, select)
         | 
| 265 | 
            +
             | 
| 266 | 
            +
                when :migrate
         | 
| 267 | 
            +
                  raise NotYet
         | 
| 268 | 
            +
             | 
| 260 269 | 
             
                when :prepare
         | 
| 261 | 
            -
                  cmd = opts.prepare | 
| 270 | 
            +
                  cmd = opts.prepare!.subcommand || :release
         | 
| 262 271 | 
             
                  case cmd
         | 
| 263 | 
            -
                    when :release; args.expect(0) | 
| 264 | 
            -
                    when :feature;  | 
| 265 | 
            -
                    when :migration; program.prepare_migration(args.expect(1))
         | 
| 272 | 
            +
                    when :release; program.prepare_release(args.expect(0..1))
         | 
| 273 | 
            +
                    when :feature; program.prepare_feature(args.expect(1))
         | 
| 274 | 
            +
                    when :migration; program.prepare_migration(args.expect(0..1))
         | 
| 266 275 | 
             
                    when :schema; program.prepare_schema(args.expect(1))
         | 
| 267 276 | 
             
                    when :diff; program.prepare_diff(args.expect(0..1))
         | 
| 268 277 | 
             
                  else
         | 
| @@ -270,7 +279,7 @@ begin | |
| 270 279 | 
             
                  end
         | 
| 271 280 |  | 
| 272 281 | 
             
                when :include
         | 
| 273 | 
            -
                  cmd = opts.include | 
| 282 | 
            +
                  cmd = opts.include!.subcommand || :feature
         | 
| 274 283 | 
             
                  case cmd
         | 
| 275 284 | 
             
                    when :feature; program.include_feature(args.expect(1))
         | 
| 276 285 | 
             
                  else
         | 
| @@ -282,7 +291,7 @@ begin | |
| 282 291 | 
             
                  program.check
         | 
| 283 292 |  | 
| 284 293 | 
             
                when :create
         | 
| 285 | 
            -
                  cmd = opts.create | 
| 294 | 
            +
                  cmd = opts.create!.subcommand || :release
         | 
| 286 295 | 
             
                  case cmd
         | 
| 287 296 | 
             
                    when :release; program.create_release(args.expect(0..1))
         | 
| 288 297 | 
             
                    when :prerelease; program.create_prerelease(args.expect(0..1))
         | 
| @@ -292,10 +301,20 @@ begin | |
| 292 301 | 
             
                  end
         | 
| 293 302 |  | 
| 294 303 | 
             
                when :cancel
         | 
| 295 | 
            -
                  cmd = opts.cancel | 
| 304 | 
            +
                  cmd = opts.cancel!.subcommand
         | 
| 296 305 | 
             
                  case cmd
         | 
| 297 306 | 
             
                    when :release; program.cancel_release(args.expect(1))
         | 
| 298 | 
            -
                    when nil; raise Prick::Error, "'cancel' subcommand  | 
| 307 | 
            +
                    when nil; raise Prick::Error, "'cancel' subcommand requires a release argument"
         | 
| 308 | 
            +
                  else
         | 
| 309 | 
            +
                    raise Prick::Internal, "Subcommand #{opts.subcommand}.#{cmd} is not matched"
         | 
| 310 | 
            +
                  end
         | 
| 311 | 
            +
             | 
| 312 | 
            +
                when :generate
         | 
| 313 | 
            +
                  cmd = opts.generate!.subcommand
         | 
| 314 | 
            +
                  case cmd
         | 
| 315 | 
            +
                    when :schema; program.generate_schema
         | 
| 316 | 
            +
                    when :migration; program.generate_migration
         | 
| 317 | 
            +
                    when nil; raise Prick::Error, "'generate' subcommand requires a 'schema' or 'migration' argument"
         | 
| 299 318 | 
             
                  else
         | 
| 300 319 | 
             
                    raise Prick::Internal, "Subcommand #{opts.subcommand}.#{cmd} is not matched"
         | 
| 301 320 | 
             
                  end
         | 
| @@ -319,3 +338,56 @@ rescue Prick::Error => ex | |
| 319 338 | 
             
              ShellOpts.error(ex.message)
         | 
| 320 339 | 
             
            end
         | 
| 321 340 |  | 
| 341 | 
            +
            __END__
         | 
| 342 | 
            +
             | 
| 343 | 
            +
            # Awaits support for sections in ShellOpts
         | 
| 344 | 
            +
            HELP = %(
         | 
| 345 | 
            +
              OPTIONS
         | 
| 346 | 
            +
                -n, --name=NAME
         | 
| 347 | 
            +
                -C, --directory=DIR
         | 
| 348 | 
            +
                -h, --help
         | 
| 349 | 
            +
                -v, --verbose
         | 
| 350 | 
            +
                --version
         | 
| 351 | 
            +
             | 
| 352 | 
            +
              COMMANDS
         | 
| 353 | 
            +
                INITIALIZATION
         | 
| 354 | 
            +
                  init --user=USER [DIR]
         | 
| 355 | 
            +
             | 
| 356 | 
            +
                INFO COMMANDS
         | 
| 357 | 
            +
                  info
         | 
| 358 | 
            +
                  list releases --migrations --cancelled
         | 
| 359 | 
            +
                  list migrations
         | 
| 360 | 
            +
                  list upgrades --all
         | 
| 361 | 
            +
             | 
| 362 | 
            +
                BUILDING
         | 
| 363 | 
            +
                  build -d DATABASE -C --nocache [TAG]
         | 
| 364 | 
            +
                  make -d DATABASE -C --nocache [TAG]
         | 
| 365 | 
            +
                  make clean -a
         | 
| 366 | 
            +
                  load -d DATABASE VERSION|FILE
         | 
| 367 | 
            +
                  save VERSION [FILE]
         | 
| 368 | 
            +
                  drop --all [DATABASE]
         | 
| 369 | 
            +
                  diff [FROM-DATABASE|FROM-VERSION [TO-DATABASE|TO-VERSION]]
         | 
| 370 | 
            +
                  migrate
         | 
| 371 | 
            +
             | 
| 372 | 
            +
                PREPARING RELEASES
         | 
| 373 | 
            +
                  prepare release [FORK]
         | 
| 374 | 
            +
                  prepare feature NAME
         | 
| 375 | 
            +
                  prepare migration FROM
         | 
| 376 | 
            +
                  prepare schema NAME
         | 
| 377 | 
            +
                  prepare diff [VERSION]
         | 
| 378 | 
            +
                  include feature FEATURE
         | 
| 379 | 
            +
                  check
         | 
| 380 | 
            +
             | 
| 381 | 
            +
                CREATING RELEASES
         | 
| 382 | 
            +
                  create release [RELEASE]
         | 
| 383 | 
            +
                  create prerelease RELEASE
         | 
| 384 | 
            +
                  create feature NAME
         | 
| 385 | 
            +
                  cancel release RELEASE
         | 
| 386 | 
            +
             | 
| 387 | 
            +
                DEPLOYING RELEASES
         | 
| 388 | 
            +
                  generate migration
         | 
| 389 | 
            +
                  generate schema
         | 
| 390 | 
            +
                  upgrade
         | 
| 391 | 
            +
                  backup [FILE]
         | 
| 392 | 
            +
                  restore [FILE]
         | 
| 393 | 
            +
            )
         |