baha 0.1.1 → 0.2.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 +5 -13
- data/.travis.yml +2 -2
- data/Dockerfile +9 -0
- data/Gemfile +2 -1
- data/README.md +52 -6
- data/docker-baha.sh +13 -0
- data/docker-build.sh +11 -0
- data/docker-entrypoint.sh +3 -0
- data/lib/baha/builder.rb +4 -4
- data/lib/baha/config.rb +87 -41
- data/lib/baha/image.rb +14 -5
- data/lib/baha/refinements.rb +18 -0
- data/lib/baha/version.rb +1 -1
- data/lib/baha/workspace.rb +10 -0
- data/spec/fixtures/config_eachimage.yml +1 -1
- data/spec/refinements_spec.rb +30 -0
- metadata +35 -30
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
             | 
| 5 | 
            -
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                YWMwZmM3MmZkZjY5OThlZjA1MWNlZWQ0NzYyZmM1NDg0MTkxZjk2MQ==
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: ba8affb543e198dab103735a8532129b4f665467
         | 
| 4 | 
            +
              data.tar.gz: 157902c703a3a0a23235357ae5a4ca452ba45140
         | 
| 7 5 | 
             
            SHA512:
         | 
| 8 | 
            -
              metadata.gz:  | 
| 9 | 
            -
             | 
| 10 | 
            -
                MjAzZTc2YmM1N2JjMTFhNjYzODI2MzZkM2NlNjgyMzEyOGUyYTk4ZTQ3MzA3
         | 
| 11 | 
            -
                YTk2YjY5Zjg5Yjk2ODg1OGU5YmM0YjZiNTI4NDM0YTM2NTcxMTM=
         | 
| 12 | 
            -
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                NDM1YTRhYWI5YTIxZTI1MjlmMDNiM2I4YzI3ZDBhZmQwZmZhMGMwYWUxM2Zj
         | 
| 14 | 
            -
                ZTY5NWU4Mjc3NDkzYjBhYTA4MDdhYTBkMTFjY2VkODVhYTAxODJkZTY0MDU5
         | 
| 15 | 
            -
                ZDg2OWU5MzFkMzU0ZTM3MjA5ODAyMjhhNWNkNmEwMDQ2ZDU1MmQ=
         | 
| 6 | 
            +
              metadata.gz: 73584d341c995c1342d132a4f3a0cb9113e788563418585a66328e3900211d45fdd8d7cd343c26844a68f58e5fccad1064fc48d553235eecb799bfc361bbb13b
         | 
| 7 | 
            +
              data.tar.gz: 7000c9c1aa3a59905bcfbcf58406bba7bf20c4b7455fbb819bda789f85ceacb8118fa1b3706ed634f01df3b1e7c1c9a7ee244c2dbf30377c62d16e7c6cb4affc
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Dockerfile
    ADDED
    
    | @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            FROM ruby:2.1
         | 
| 2 | 
            +
            RUN bundle config --global frozen 1
         | 
| 3 | 
            +
            RUN mkdir -p /usr/src/app && mkdir -p /baha && mkdir -p /workspace
         | 
| 4 | 
            +
            COPY . /usr/src/app
         | 
| 5 | 
            +
            WORKDIR /usr/src/app
         | 
| 6 | 
            +
            RUN bundle install && bundle exec rake install
         | 
| 7 | 
            +
            COPY docker-entrypoint.sh /entrypoint.sh
         | 
| 8 | 
            +
            WORKDIR /baha
         | 
| 9 | 
            +
            ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            Baha | 
| 1 | 
            +
            Baha
         | 
| 2 2 | 
             
            =======
         | 
| 3 3 |  | 
| 4 4 | 
             
            [](http://badge.fury.io/rb/baha)
         | 
| @@ -24,7 +24,7 @@ Baha attempts to address the shortcomings of Dockerfiles by factoring out redund | |
| 24 24 | 
             
            ### 1. Baha forbids more than 1 layer per image
         | 
| 25 25 |  | 
| 26 26 | 
             
            If you split statements across multiple `RUN` statements, each of these results in a new layer.
         | 
| 27 | 
            -
            The more commands you run, the more layers you create.  If you want to *minimize the number of layers* (See [Official Recommendations](https://docs.docker.com/articles/dockerfile_best-practices/)) | 
| 27 | 
            +
            The more commands you run, the more layers you create.  If you want to *minimize the number of layers* (See [Official Recommendations](https://docs.docker.com/articles/dockerfile_best-practices/))
         | 
| 28 28 | 
             
            then you must ensure that all statements can be condensed into one line - sacrificing maintainability in the process.
         | 
| 29 29 |  | 
| 30 30 | 
             
            Baha encourages using scripts instead of `RUN` statements to ensure that only one layer is created per image.
         | 
| @@ -32,7 +32,7 @@ Baha encourages using scripts instead of `RUN` statements to ensure that only on | |
| 32 32 | 
             
            ### 2. Baha encourages smaller images
         | 
| 33 33 |  | 
| 34 34 | 
             
            The nature of the way the dockerfiles are processed means that each command you run commits a new image.
         | 
| 35 | 
            -
            This means, that if you have a `RUN` statement that downloads packages for installation. | 
| 35 | 
            +
            This means, that if you have a `RUN` statement that downloads packages for installation.
         | 
| 36 36 | 
             
            This will commit a layer with the installation files.  Later on if you clean up these files with further `RUN` commands, they will still exist in your image lineage - thus having no space savings. Without proper precautions, you'll end up having unnecessarily large images.
         | 
| 37 37 |  | 
| 38 38 | 
             
            Baha ensures that all setup tasks happen in a single commit - so you can write cleanup statements and be assured that they will indeed be absent in the resulting images.
         | 
| @@ -48,10 +48,10 @@ Baha will rebuild your entire lineage if the base image changes, but will not re | |
| 48 48 |  | 
| 49 49 | 
             
            **Caveat**
         | 
| 50 50 |  | 
| 51 | 
            -
            Baha relies on tagging your releases, noticing when the tag has changed, and treating tags as immutable. | 
| 51 | 
            +
            Baha relies on tagging your releases, noticing when the tag has changed, and treating tags as immutable.
         | 
| 52 52 | 
             
            This is analogous to how **git** treats tags.
         | 
| 53 53 |  | 
| 54 | 
            -
            Tagging your images is another best-practice ([2](http://crosbymichael.com/dockerfile-best-practices-take-2.html): #5) anyway, so this is encouraged by design. | 
| 54 | 
            +
            Tagging your images is another best-practice ([2](http://crosbymichael.com/dockerfile-best-practices-take-2.html): #5) anyway, so this is encouraged by design.
         | 
| 55 55 |  | 
| 56 56 | 
             
            Bottom line is: If you change your image, you should change the tag/version.
         | 
| 57 57 |  | 
| @@ -128,7 +128,7 @@ Options: | |
| 128 128 | 
             
                                    # Default: STDOUT
         | 
| 129 129 |  | 
| 130 130 | 
             
            Description:
         | 
| 131 | 
            -
              Reads the given Dockerfile and outputs a Baha-compatible image.yml | 
| 131 | 
            +
              Reads the given Dockerfile and outputs a Baha-compatible image.yml
         | 
| 132 132 | 
             
              which can be included or embedded within a CONFIG
         | 
| 133 133 | 
             
            ```
         | 
| 134 134 |  | 
| @@ -180,6 +180,52 @@ It will build each image in the order they appear by doing the following. | |
| 180 180 | 
             
            ### Tags the resulting image
         | 
| 181 181 | 
             
            Adds the appropriate tags to the image as defined in the image config for both the remote registry and local repository.
         | 
| 182 182 |  | 
| 183 | 
            +
            Baha inside Docker
         | 
| 184 | 
            +
            ------------------
         | 
| 185 | 
            +
             | 
| 186 | 
            +
            If you'd like to use baha completely inside docker, you can follow these additional instructions.
         | 
| 187 | 
            +
             | 
| 188 | 
            +
             | 
| 189 | 
            +
            ### 1. Build baha as a docker image
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            Included with this git repository is a `Dockerfile`. Run the following command inside your working-copy to create a new local container called 'baha'
         | 
| 192 | 
            +
             | 
| 193 | 
            +
            ```
         | 
| 194 | 
            +
            docker build -t baha .
         | 
| 195 | 
            +
            ```
         | 
| 196 | 
            +
             | 
| 197 | 
            +
            ### 2. Copy docker-baha.sh to somewhere in your $PATH and make it executable
         | 
| 198 | 
            +
            ```
         | 
| 199 | 
            +
            cp docker-baha.sh /usr/local/bin/baha
         | 
| 200 | 
            +
            chmod 755 /usr/local/bin/baha
         | 
| 201 | 
            +
            ```
         | 
| 202 | 
            +
             | 
| 203 | 
            +
            ### 3. Set up your environment
         | 
| 204 | 
            +
             | 
| 205 | 
            +
            There are a few environment variables that Baha needs in order to work within docker.
         | 
| 206 | 
            +
             | 
| 207 | 
            +
            **BAHA_MOUNT** is the location on the docker host that contains the config files. By default, this is the current working directory: `$PWD`
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            **BAHA_WORKSPACE_MOUNT** is the location where files generated by the build process will be stored and also where Baha will instruct docker to mount volumes from. By default, this is `$BAHA_MOUNT/workspace`
         | 
| 210 | 
            +
             | 
| 211 | 
            +
            **DOCKER_SOCKET** is the location of the unix socket for communicating with docker. baha-docker.sh mounts this inside the container so that it can interact with docker directly. By default, this is `/var/run/docker.sock` which should be correct for **boot2docker** and Linux, unless you've modified the path.
         | 
| 212 | 
            +
             | 
| 213 | 
            +
            *Note*: **boot2docker** only mounts `/Users`, so setting `BAHA_MOUNT` or `BAHA_WORKSPACE_MOUNT` outside this setting will not work.
         | 
| 214 | 
            +
             | 
| 215 | 
            +
            #### Example
         | 
| 216 | 
            +
             | 
| 217 | 
            +
            ```
         | 
| 218 | 
            +
            export BAHA_MOUNT=/Users/myself/baha
         | 
| 219 | 
            +
            export BAHA_WORKSPACE_MOUNT=/Users/mysql/baha/workspace
         | 
| 220 | 
            +
            export DOCKER_SOCKET=/var/run/docker.sock
         | 
| 221 | 
            +
            ```
         | 
| 222 | 
            +
             | 
| 223 | 
            +
            ### Run baha as you would normally
         | 
| 224 | 
            +
             | 
| 225 | 
            +
            ```
         | 
| 226 | 
            +
            baha build example.yml
         | 
| 227 | 
            +
            ```
         | 
| 228 | 
            +
             | 
| 183 229 | 
             
            How to Contribute
         | 
| 184 230 | 
             
            -----------------
         | 
| 185 231 |  | 
    
        data/docker-baha.sh
    ADDED
    
    | @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            #! /bin/bash
         | 
| 2 | 
            +
            BAHA_MOUNT=${BAHA_MOUNT:-$PWD}
         | 
| 3 | 
            +
            BAHA_WORKSPACE_MOUNT=${BAHA_WORKSPACE_MOUNT:-"$BAHA_MOUNT/workspace"}
         | 
| 4 | 
            +
            DOCKER_SOCKET=${DOCKER_SOCK:-"/var/run/docker.sock"}
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            docker run --rm \
         | 
| 7 | 
            +
              -v $BAHA_MOUNT:/baha \
         | 
| 8 | 
            +
              -v $BAHA_WORKSPACE_MOUNT:/workspace \
         | 
| 9 | 
            +
              -v $DOCKER_SOCKET:/var/run/docker.sock \
         | 
| 10 | 
            +
              -e BAHA_MOUNT=$BAHA_MOUNT \
         | 
| 11 | 
            +
              -e BAHA_WORKSPACE_MOUNT=$BAHA_WORKSPACE_MOUNT \
         | 
| 12 | 
            +
              -e DOCKER_HOST=unix:///var/run/docker.sock \
         | 
| 13 | 
            +
              baha "$@"
         | 
    
        data/docker-build.sh
    ADDED
    
    | @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            #! /bin/bash
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            echo "===================================="
         | 
| 4 | 
            +
            echo "==== Removing old baha docker image"
         | 
| 5 | 
            +
            echo "===================================="
         | 
| 6 | 
            +
            docker rmi baha
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            echo "===================================="
         | 
| 9 | 
            +
            echo "==== Building image"
         | 
| 10 | 
            +
            echo "===================================="
         | 
| 11 | 
            +
            docker build -t baha .
         | 
    
        data/lib/baha/builder.rb
    CHANGED
    
    | @@ -42,7 +42,7 @@ class Builder | |
| 42 42 | 
             
                    build_log.info { "Skipped image #{image.name} - No update needed" }
         | 
| 43 43 | 
             
                    next
         | 
| 44 44 | 
             
                  end
         | 
| 45 | 
            -
             | 
| 45 | 
            +
             | 
| 46 46 | 
             
                  ## Prepare Workspace
         | 
| 47 47 | 
             
                  workspace = Pathname.new(@config.workspace) + image.name
         | 
| 48 48 | 
             
                  unless workspace.exist?
         | 
| @@ -54,7 +54,7 @@ class Builder | |
| 54 54 | 
             
                  ## Image Run Config
         | 
| 55 55 | 
             
                  if image.run
         | 
| 56 56 | 
             
                    build_log.debug { "Image has RUN commands"}
         | 
| 57 | 
            -
                    run = '.init.sh' | 
| 57 | 
            +
                    run = '.init.sh'
         | 
| 58 58 | 
             
                    File.open(workspace + run,'w') do |f|
         | 
| 59 59 | 
             
                      f.write("#!/bin/sh\n")
         | 
| 60 60 | 
             
                      f.write("set -xe\n")
         | 
| @@ -97,7 +97,7 @@ class Builder | |
| 97 97 |  | 
| 98 98 | 
             
                  build_log.debug { "Running container for #{image.name}: #{command}" }
         | 
| 99 99 | 
             
                  container.start({
         | 
| 100 | 
            -
                    'Binds' => "#{image. | 
| 100 | 
            +
                    'Binds' => "#{image.host_mount.expand_path}:#{image.bind}"
         | 
| 101 101 | 
             
                  })
         | 
| 102 102 |  | 
| 103 103 | 
             
                  begin
         | 
| @@ -107,7 +107,7 @@ class Builder | |
| 107 107 | 
             
                      when :stdout
         | 
| 108 108 | 
             
                        build_log.info { "++ #{msg.chomp}" }
         | 
| 109 109 | 
             
                      when :stderr
         | 
| 110 | 
            -
                        build_log.warn { "++ #{msg.chomp}" } | 
| 110 | 
            +
                        build_log.warn { "++ #{msg.chomp}" }
         | 
| 111 111 | 
             
                      end
         | 
| 112 112 | 
             
                    end
         | 
| 113 113 | 
             
                    ## Wait for finish
         | 
    
        data/lib/baha/config.rb
    CHANGED
    
    | @@ -2,9 +2,11 @@ require 'yaml' | |
| 2 2 | 
             
            require 'pathname'
         | 
| 3 3 | 
             
            require 'baha/log'
         | 
| 4 4 | 
             
            require 'baha/dockerfile'
         | 
| 5 | 
            +
            require 'baha/refinements'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module Baha
         | 
| 7 8 | 
             
            class Config
         | 
| 9 | 
            +
              using Baha::Refinements
         | 
| 8 10 | 
             
              DEFAULTS = {
         | 
| 9 11 | 
             
                :parent => 'ubuntu:14.04.1',
         | 
| 10 12 | 
             
                :bind   => '/.baha',
         | 
| @@ -18,6 +20,7 @@ class Config | |
| 18 20 | 
             
                def load(file)
         | 
| 19 21 | 
             
                  LOG.debug { "Loading file #{file}"}
         | 
| 20 22 | 
             
                  filepath = Pathname.new(file)
         | 
| 23 | 
            +
                  LOG.debug { "Loading file #{filepath.expand_path}"}
         | 
| 21 24 | 
             
                  raise ArgumentError.new("Cannot read config file #{file}") unless filepath.readable?
         | 
| 22 25 | 
             
                  config = YAML.load_file(filepath)
         | 
| 23 26 | 
             
                  config['configdir'] ||= filepath.dirname
         | 
| @@ -30,49 +33,20 @@ class Config | |
| 30 33 |  | 
| 31 34 | 
             
              def initialize(config)
         | 
| 32 35 | 
             
                @config = config
         | 
| 33 | 
            -
                
         | 
| 36 | 
            +
                config_workspace
         | 
| 37 | 
            +
             | 
| 34 38 | 
             
                # Defaults
         | 
| 35 39 | 
             
                defaults = config['defaults'] || {}
         | 
| 36 40 | 
             
                raise ArgumentError.new("Expected Hash for defaults") unless defaults.is_a?(Hash)
         | 
| 37 41 | 
             
                @defaults = {}
         | 
| 38 42 | 
             
                DEFAULTS.keys.each do |k|
         | 
| 39 | 
            -
                  @defaults[k] = defaults[k] ||  | 
| 43 | 
            +
                  @defaults[k] = defaults[k] || DEFAULTS[k]
         | 
| 40 44 | 
             
                end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                @configdir = Pathname.new(config['configdir'] || Pathname.pwd)
         | 
| 43 | 
            -
                @workspace = Pathname.new(config['workspace'] || @configdir + 'workspace')
         | 
| 44 45 | 
             
                @secure = false
         | 
| 45 46 | 
             
                @options = {}
         | 
| 46 47 | 
             
                init_security if ENV.has_key?('DOCKER_CERT_PATH') || config.has_key?('ssl')
         | 
| 47 48 | 
             
              end
         | 
| 48 49 |  | 
| 49 | 
            -
              def init_security
         | 
| 50 | 
            -
                @secure = true
         | 
| 51 | 
            -
                cert_path = ''
         | 
| 52 | 
            -
                ssl_options = { }
         | 
| 53 | 
            -
                if ENV['DOCKER_CERT_PATH']
         | 
| 54 | 
            -
                  cert_path = Pathname.new(ENV['DOCKER_CERT_PATH'])
         | 
| 55 | 
            -
                  ssl_options[:ssl_verify_peer] = (ENV['DOCKER_TLS_VERIFY'] == '1')
         | 
| 56 | 
            -
                  ssl_options[:client_cert] = (cert_path + 'cert.pem').expand_path.to_s
         | 
| 57 | 
            -
                  ssl_options[:client_key] = (cert_path + 'key.pem').expand_path.to_s
         | 
| 58 | 
            -
                  ssl_options[:ssl_ca_file] = (cert_path + 'ca.pem').expand_path.to_s
         | 
| 59 | 
            -
                elsif @config.has_key?('ssl')
         | 
| 60 | 
            -
                  ssl = @config['ssl']
         | 
| 61 | 
            -
                  ssl_options[:ssl_verify_peer] = ssl['verify'] || false
         | 
| 62 | 
            -
                  if ssl.has_key?('cert_path')
         | 
| 63 | 
            -
                    cert_path = Pathname.new(ssl['cert_path'])
         | 
| 64 | 
            -
                    ssl_options[:client_cert] = (cert_path + 'cert.pem').expand_path.to_s
         | 
| 65 | 
            -
                    ssl_options[:client_key] = (cert_path + 'key.pem').expand_path.to_s
         | 
| 66 | 
            -
                    ssl_options[:ssl_ca_file] = (cert_path + 'ca.pem').expand_path.to_s
         | 
| 67 | 
            -
                  else
         | 
| 68 | 
            -
                    ssl_options[:client_cert] = ssl['cert']
         | 
| 69 | 
            -
                    ssl_options[:client_key] = ssl['key']
         | 
| 70 | 
            -
                    ssl_options[:ssl_ca_file] = ssl['ca']
         | 
| 71 | 
            -
                  end
         | 
| 72 | 
            -
                end
         | 
| 73 | 
            -
                @options.merge!(ssl_options)
         | 
| 74 | 
            -
              end
         | 
| 75 | 
            -
             | 
| 76 50 | 
             
              def each_image
         | 
| 77 51 | 
             
                return unless @config.has_key?('images')
         | 
| 78 52 | 
             
                @config['images'].each do |image|
         | 
| @@ -104,10 +78,18 @@ class Config | |
| 104 78 | 
             
                end
         | 
| 105 79 | 
             
              end
         | 
| 106 80 |  | 
| 81 | 
            +
              def workspace_for(image)
         | 
| 82 | 
            +
                if @ws_mount
         | 
| 83 | 
            +
                  @ws_mount + image
         | 
| 84 | 
            +
                else
         | 
| 85 | 
            +
                  @workspace + image
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
              end
         | 
| 88 | 
            +
             | 
| 107 89 | 
             
              def resolve_file(file)
         | 
| 108 90 | 
             
                filepath = Pathname.new(file)
         | 
| 109 91 | 
             
                LOG.debug { "resolve_file(#{file})" }
         | 
| 110 | 
            -
                paths = [ | 
| 92 | 
            +
                paths = [
         | 
| 111 93 | 
             
                  filepath,            # 0. Absolute path
         | 
| 112 94 | 
             
                  @workspace + file,   # 1. Workspace
         | 
| 113 95 | 
             
                  @configdir + file,   # 2. Config
         | 
| @@ -121,7 +103,7 @@ class Config | |
| 121 103 | 
             
                    else
         | 
| 122 104 | 
             
                      LOG.debug("did not find file at: #{path}")
         | 
| 123 105 | 
             
                    end
         | 
| 124 | 
            -
                  end | 
| 106 | 
            +
                  end
         | 
| 125 107 | 
             
                  result
         | 
| 126 108 | 
             
                end
         | 
| 127 109 | 
             
              end
         | 
| @@ -129,13 +111,7 @@ class Config | |
| 129 111 | 
             
              # Initialize Docker Client
         | 
| 130 112 | 
             
              def init_docker!
         | 
| 131 113 | 
             
                Docker.options = @options
         | 
| 132 | 
            -
                 | 
| 133 | 
            -
                  url = @config['docker_url']
         | 
| 134 | 
            -
                  Docker.url = url
         | 
| 135 | 
            -
                end
         | 
| 136 | 
            -
                if @secure
         | 
| 137 | 
            -
                  Docker.url = Docker.url.gsub(/^tcp:/,'https:')
         | 
| 138 | 
            -
                end
         | 
| 114 | 
            +
                set_docker_url
         | 
| 139 115 | 
             
                LOG.debug { "Docker URL: #{Docker.url}"}
         | 
| 140 116 | 
             
                LOG.debug { "Docker Options: #{Docker.options.inspect}"}
         | 
| 141 117 | 
             
                Docker.validate_version!
         | 
| @@ -153,5 +129,75 @@ class Config | |
| 153 129 | 
             
                >
         | 
| 154 130 | 
             
                eos
         | 
| 155 131 | 
             
              end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              private
         | 
| 134 | 
            +
             | 
| 135 | 
            +
              def config_workspace
         | 
| 136 | 
            +
                def nonnil(*args)
         | 
| 137 | 
            +
                  args.find{ |x| not x.nil? }
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                if ENV['BAHA_MOUNT']
         | 
| 141 | 
            +
                  @ws_mount  = Pathname.new(ENV['BAHA_WORKSPACE_MOUNT'])
         | 
| 142 | 
            +
                  @cfg_mount = Pathname.new(ENV['BAHA_MOUNT'])
         | 
| 143 | 
            +
                  @configdir = Pathname.new('/baha')
         | 
| 144 | 
            +
                  @workspace = Pathname.new('/workspace')
         | 
| 145 | 
            +
                else
         | 
| 146 | 
            +
                  cfgdir = @config['configdir'] || Pathname.pwd.to_s
         | 
| 147 | 
            +
                  @configdir = Pathname.new(cfgdir)
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                  work = @config['workspace'] || (@configdir + 'workspace').to_s
         | 
| 150 | 
            +
                  @workspace = Pathname.new(work)
         | 
| 151 | 
            +
                end
         | 
| 152 | 
            +
              end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
              def set_docker_url
         | 
| 155 | 
            +
                if @config.has_key?('docker_url')
         | 
| 156 | 
            +
                  Docker.url = @config['docker_url']
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
                if @secure
         | 
| 159 | 
            +
                  Docker.url = Docker.url.gsub(/^tcp:/,'https:')
         | 
| 160 | 
            +
                end
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              def ssl_from_env
         | 
| 164 | 
            +
                ssl_options = {}
         | 
| 165 | 
            +
                cert_path = Pathname.new(ENV['DOCKER_CERT_PATH'])
         | 
| 166 | 
            +
                ssl_options[:ssl_verify_peer] = (ENV['DOCKER_TLS_VERIFY'] == '1')
         | 
| 167 | 
            +
                ssl_options[:client_cert] = (cert_path + 'cert.pem').expand_path.to_s
         | 
| 168 | 
            +
                ssl_options[:client_key] = (cert_path + 'key.pem').expand_path.to_s
         | 
| 169 | 
            +
                ssl_options[:ssl_ca_file] = (cert_path + 'ca.pem').expand_path.to_s
         | 
| 170 | 
            +
                ssl_options
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
              def ssl_from_config
         | 
| 174 | 
            +
                ssl = @config['ssl']
         | 
| 175 | 
            +
                ssl_options = {}
         | 
| 176 | 
            +
                ssl_options[:ssl_verify_peer] = ssl['verify'] || false
         | 
| 177 | 
            +
                if ssl.has_key?('cert_path')
         | 
| 178 | 
            +
                  cert_path = Pathname.new(ssl['cert_path'])
         | 
| 179 | 
            +
                  ssl_options[:client_cert] = (cert_path + 'cert.pem').expand_path.to_s
         | 
| 180 | 
            +
                  ssl_options[:client_key] = (cert_path + 'key.pem').expand_path.to_s
         | 
| 181 | 
            +
                  ssl_options[:ssl_ca_file] = (cert_path + 'ca.pem').expand_path.to_s
         | 
| 182 | 
            +
                else
         | 
| 183 | 
            +
                  ssl_options[:client_cert] = ssl['cert']
         | 
| 184 | 
            +
                  ssl_options[:client_key] = ssl['key']
         | 
| 185 | 
            +
                  ssl_options[:ssl_ca_file] = ssl['ca']
         | 
| 186 | 
            +
                end
         | 
| 187 | 
            +
                ssl_options
         | 
| 188 | 
            +
              end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
              def init_security
         | 
| 191 | 
            +
                @secure = true
         | 
| 192 | 
            +
                cert_path = ''
         | 
| 193 | 
            +
                ssl = { }
         | 
| 194 | 
            +
                if ENV['DOCKER_CERT_PATH']
         | 
| 195 | 
            +
                  ssl = ssl_from_env
         | 
| 196 | 
            +
                elsif @config.has_key?('ssl')
         | 
| 197 | 
            +
                  ssl = ssl_from_config
         | 
| 198 | 
            +
                end
         | 
| 199 | 
            +
                @options.merge!(ssl)
         | 
| 200 | 
            +
              end
         | 
| 201 | 
            +
             | 
| 156 202 | 
             
            end
         | 
| 157 203 | 
             
            end
         | 
    
        data/lib/baha/image.rb
    CHANGED
    
    | @@ -45,7 +45,7 @@ module Baha | |
| 45 45 | 
             
                      LOG.debug { "get_image!(#{image.inspect})" }
         | 
| 46 46 | 
             
                      tag = image[:tag] || 'latest'
         | 
| 47 47 | 
             
                      repo = "#{image[:ns]}/#{image[:name]}"
         | 
| 48 | 
            -
                      img = [ | 
| 48 | 
            +
                      img = [
         | 
| 49 49 | 
             
                        lambda { Docker::Image.get("#{image[:name]}:#{image[:tag]}") },
         | 
| 50 50 | 
             
                        lambda { Docker::Image.create('fromImage'=> image[:name], 'tag' => tag) },
         | 
| 51 51 | 
             
                        lambda { Docker::Image.create('fromImage' => repo, 'tag' => tag) }
         | 
| @@ -65,9 +65,10 @@ module Baha | |
| 65 65 | 
             
                    end
         | 
| 66 66 |  | 
| 67 67 | 
             
                end
         | 
| 68 | 
            -
                attr_reader :parent, :image, :maintainer, :options, :pre_build, :bind, :command, :timeout, : | 
| 68 | 
            +
                attr_reader :parent, :image, :maintainer, :options, :pre_build, :bind, :command, :timeout, :name, :tags, :run
         | 
| 69 69 |  | 
| 70 70 | 
             
                def initialize(config,image)
         | 
| 71 | 
            +
                  @config = config
         | 
| 71 72 | 
             
                  @parent = Baha::Image.parse_with_default(image['parent'] || config.defaults[:parent], config.defaults[:repository])
         | 
| 72 73 | 
             
                  @image  = Baha::Image.parse_with_default(image['name'], config.defaults[:repository])
         | 
| 73 74 | 
             
                  @image[:tag] = image['tag'] if image.has_key?('tag')
         | 
| @@ -78,7 +79,7 @@ module Baha | |
| 78 79 | 
             
                  @command = image['command'] || config.defaults[:command]
         | 
| 79 80 | 
             
                  @run = image['run']
         | 
| 80 81 | 
             
                  @timeout = image['timeout'] || config.defaults[:timeout]
         | 
| 81 | 
            -
                  @workspace =  | 
| 82 | 
            +
                  @workspace = image['workspace'] || @image[:name]
         | 
| 82 83 | 
             
                  @name = @image[:name]
         | 
| 83 84 | 
             
                  @tags = Set.new [
         | 
| 84 85 | 
             
                    "#{@image[:name]}:#{@image[:tag]}",
         | 
| @@ -90,6 +91,14 @@ module Baha | |
| 90 91 | 
             
                  end
         | 
| 91 92 | 
             
                end
         | 
| 92 93 |  | 
| 94 | 
            +
                def host_mount
         | 
| 95 | 
            +
                  @config.workspace_for(@workspace)
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                def workspace
         | 
| 99 | 
            +
                  @config.workspace + @workspace
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 93 102 | 
             
                def env
         | 
| 94 103 | 
             
                  {
         | 
| 95 104 | 
             
                    :parent => @parent,
         | 
| @@ -97,7 +106,7 @@ module Baha | |
| 97 106 | 
             
                    :bind => @bind,
         | 
| 98 107 | 
             
                    :name => @image[:name],
         | 
| 99 108 | 
             
                    :tag  => @image[:tag],
         | 
| 100 | 
            -
                    :workspace =>  | 
| 109 | 
            +
                    :workspace => workspace.expand_path.to_s
         | 
| 101 110 | 
             
                  }
         | 
| 102 111 | 
             
                end
         | 
| 103 112 |  | 
| @@ -152,4 +161,4 @@ module Baha | |
| 152 161 | 
             
                  eos
         | 
| 153 162 | 
             
                end
         | 
| 154 163 | 
             
              end
         | 
| 155 | 
            -
            end
         | 
| 164 | 
            +
            end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            module Baha::Refinements
         | 
| 2 | 
            +
              refine Hash do
         | 
| 3 | 
            +
                # Allow hash to use symbol keys or string keys
         | 
| 4 | 
            +
                def [](key)
         | 
| 5 | 
            +
                  super(key.to_s) || super(key.to_sym)
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
                # Pick the first key that exists in the hash
         | 
| 8 | 
            +
                # If none of them exist, return the default
         | 
| 9 | 
            +
                def pick(keys,default = nil)
         | 
| 10 | 
            +
                  k = keys.find { |x| self.has_key?(x) }
         | 
| 11 | 
            +
                  if not k.nil?
         | 
| 12 | 
            +
                    self[k]
         | 
| 13 | 
            +
                  else
         | 
| 14 | 
            +
                    default
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
    
        data/lib/baha/version.rb
    CHANGED
    
    
    
        data/lib/baha/workspace.rb
    CHANGED
    
    | @@ -8,6 +8,16 @@ module Baha | |
| 8 8 | 
             
                  @options = {}
         | 
| 9 9 | 
             
                  @options.merge!(options)
         | 
| 10 10 | 
             
                  @directory = @options['directory'] || Dir.pwd
         | 
| 11 | 
            +
                  @mount_dir = @options['mount_dir'] || @directory
         | 
| 12 | 
            +
                  @image = @options['image']
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def +(file)
         | 
| 16 | 
            +
                  Pathname.new(@mount_dir) + @image + file
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def directory
         | 
| 20 | 
            +
                  Pathname.new(@workspace)
         | 
| 11 21 | 
             
                end
         | 
| 12 22 | 
             
              end
         | 
| 13 23 | 
             
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'baha/refinements'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe "Baha::Refinements" do
         | 
| 5 | 
            +
              using Baha::Refinements
         | 
| 6 | 
            +
              describe "Hash#[]" do
         | 
| 7 | 
            +
                let(:h) {
         | 
| 8 | 
            +
                  {
         | 
| 9 | 
            +
                    :symkey   => 100,
         | 
| 10 | 
            +
                    "strkey"  => 200
         | 
| 11 | 
            +
                  }
         | 
| 12 | 
            +
                }
         | 
| 13 | 
            +
                it { expect(h[:symkey]).to  eq(100) }
         | 
| 14 | 
            +
                it { expect(h['symkey']).to eq(100) }
         | 
| 15 | 
            +
                it { expect(h[:strkey]).to  eq(200) }
         | 
| 16 | 
            +
                it { expect(h['strkey']).to eq(200) }
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
              describe "Hash#pick" do
         | 
| 19 | 
            +
                let(:h) {
         | 
| 20 | 
            +
                  {
         | 
| 21 | 
            +
                    :a => 'a',
         | 
| 22 | 
            +
                    :z => 'z'
         | 
| 23 | 
            +
                  }
         | 
| 24 | 
            +
                }
         | 
| 25 | 
            +
                it { expect(h.pick([:a,:b,:c])).to  eq('a') }
         | 
| 26 | 
            +
                it { expect(h.pick([:x,:y,:z])).to  eq('z') }
         | 
| 27 | 
            +
                it { expect(h.pick([:x,:y])).to  be_nil }
         | 
| 28 | 
            +
                it { expect(h.pick([:x,:y],'z')).to eq('z') }
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,146 +1,144 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: baha
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Justen Walker
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-04-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| 15 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 16 | 
             
                requirements:
         | 
| 17 | 
            -
                - - ~>
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 19 | 
             
                    version: 0.19.1
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 | 
            -
                - - ~>
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: 0.19.1
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: docker-api
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 | 
            -
                - - ~>
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 33 | 
             
                    version: 1.14.0
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 | 
            -
                - - ~>
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: 1.14.0
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: json
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 | 
            -
                - - ~>
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 47 | 
             
                    version: 1.8.1
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 | 
            -
                - - ~>
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: 1.8.1
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: bundler
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 | 
            -
                - - ~>
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 61 | 
             
                    version: '1.7'
         | 
| 62 62 | 
             
              type: :development
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 | 
            -
                - - ~>
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 68 | 
             
                    version: '1.7'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: rake
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                requirements:
         | 
| 73 | 
            -
                - - ~>
         | 
| 73 | 
            +
                - - "~>"
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 75 | 
             
                    version: '10.0'
         | 
| 76 76 | 
             
              type: :development
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 | 
            -
                - - ~>
         | 
| 80 | 
            +
                - - "~>"
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 82 | 
             
                    version: '10.0'
         | 
| 83 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 84 | 
             
              name: rspec
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 86 | 
             
                requirements:
         | 
| 87 | 
            -
                - - ~>
         | 
| 87 | 
            +
                - - "~>"
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 89 | 
             
                    version: 3.1.0
         | 
| 90 90 | 
             
              type: :development
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 | 
            -
                - - ~>
         | 
| 94 | 
            +
                - - "~>"
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 96 | 
             
                    version: 3.1.0
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: rspec-mocks
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 100 | 
             
                requirements:
         | 
| 101 | 
            -
                - - ~>
         | 
| 101 | 
            +
                - - "~>"
         | 
| 102 102 | 
             
                  - !ruby/object:Gem::Version
         | 
| 103 103 | 
             
                    version: 3.1.3
         | 
| 104 104 | 
             
              type: :development
         | 
| 105 105 | 
             
              prerelease: false
         | 
| 106 106 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 107 | 
             
                requirements:
         | 
| 108 | 
            -
                - - ~>
         | 
| 108 | 
            +
                - - "~>"
         | 
| 109 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 110 | 
             
                    version: 3.1.3
         | 
| 111 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 112 | 
             
              name: rspec-its
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 114 | 
             
                requirements:
         | 
| 115 | 
            -
                - - ~>
         | 
| 115 | 
            +
                - - "~>"
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 117 | 
             
                    version: 1.1.0
         | 
| 118 118 | 
             
              type: :development
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 | 
            -
                - - ~>
         | 
| 122 | 
            +
                - - "~>"
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 124 | 
             
                    version: 1.1.0
         | 
| 125 125 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 126 126 | 
             
              name: simplecov
         | 
| 127 127 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 128 | 
             
                requirements:
         | 
| 129 | 
            -
                - - ~>
         | 
| 129 | 
            +
                - - "~>"
         | 
| 130 130 | 
             
                  - !ruby/object:Gem::Version
         | 
| 131 131 | 
             
                    version: 0.9.1
         | 
| 132 132 | 
             
              type: :development
         | 
| 133 133 | 
             
              prerelease: false
         | 
| 134 134 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 135 | 
             
                requirements:
         | 
| 136 | 
            -
                - - ~>
         | 
| 136 | 
            +
                - - "~>"
         | 
| 137 137 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 138 | 
             
                    version: 0.9.1
         | 
| 139 | 
            -
            description:  | 
| 140 | 
            -
              images.
         | 
| 141 | 
            -
             | 
| 142 | 
            -
              It addresses some of Dockerfiles shortcomings and encourages smaller, reusable,
         | 
| 143 | 
            -
              tagged images.'
         | 
| 139 | 
            +
            description: |-
         | 
| 140 | 
            +
              Baha is a command-line utility that assists in the creation of docker images.
         | 
| 141 | 
            +
              It addresses some of Dockerfiles shortcomings and encourages smaller, reusable, tagged images.
         | 
| 144 142 | 
             
            email:
         | 
| 145 143 | 
             
            - justen.walker+github@gmail.com
         | 
| 146 144 | 
             
            executables:
         | 
| @@ -148,15 +146,19 @@ executables: | |
| 148 146 | 
             
            extensions: []
         | 
| 149 147 | 
             
            extra_rdoc_files: []
         | 
| 150 148 | 
             
            files:
         | 
| 151 | 
            -
            - .gitignore
         | 
| 152 | 
            -
            - .travis.yml
         | 
| 149 | 
            +
            - ".gitignore"
         | 
| 150 | 
            +
            - ".travis.yml"
         | 
| 153 151 | 
             
            - CHANGELOG.md
         | 
| 152 | 
            +
            - Dockerfile
         | 
| 154 153 | 
             
            - Gemfile
         | 
| 155 154 | 
             
            - LICENSE.txt
         | 
| 156 155 | 
             
            - README.md
         | 
| 157 156 | 
             
            - Rakefile
         | 
| 158 157 | 
             
            - baha.gemspec
         | 
| 159 158 | 
             
            - bin/baha
         | 
| 159 | 
            +
            - docker-baha.sh
         | 
| 160 | 
            +
            - docker-build.sh
         | 
| 161 | 
            +
            - docker-entrypoint.sh
         | 
| 160 162 | 
             
            - example/.gitignore
         | 
| 161 163 | 
             
            - example/base/init.sh.erb
         | 
| 162 164 | 
             
            - example/base/test-template.erb
         | 
| @@ -183,6 +185,7 @@ files: | |
| 183 185 | 
             
            - lib/baha/pre_build/command.rb
         | 
| 184 186 | 
             
            - lib/baha/pre_build/download.rb
         | 
| 185 187 | 
             
            - lib/baha/pre_build/template.rb
         | 
| 188 | 
            +
            - lib/baha/refinements.rb
         | 
| 186 189 | 
             
            - lib/baha/version.rb
         | 
| 187 190 | 
             
            - lib/baha/workspace.rb
         | 
| 188 191 | 
             
            - spec/builder_spec.rb
         | 
| @@ -213,6 +216,7 @@ files: | |
| 213 216 | 
             
            - spec/pre_build/download_spec.rb
         | 
| 214 217 | 
             
            - spec/pre_build/template_spec.rb
         | 
| 215 218 | 
             
            - spec/pre_build_spec.rb
         | 
| 219 | 
            +
            - spec/refinements_spec.rb
         | 
| 216 220 | 
             
            - spec/spec_helper.rb
         | 
| 217 221 | 
             
            homepage: https://github.com/justenwalker/baha
         | 
| 218 222 | 
             
            licenses:
         | 
| @@ -224,17 +228,17 @@ require_paths: | |
| 224 228 | 
             
            - lib
         | 
| 225 229 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 226 230 | 
             
              requirements:
         | 
| 227 | 
            -
              - -  | 
| 231 | 
            +
              - - ">="
         | 
| 228 232 | 
             
                - !ruby/object:Gem::Version
         | 
| 229 233 | 
             
                  version: '0'
         | 
| 230 234 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 231 235 | 
             
              requirements:
         | 
| 232 | 
            -
              - -  | 
| 236 | 
            +
              - - ">="
         | 
| 233 237 | 
             
                - !ruby/object:Gem::Version
         | 
| 234 238 | 
             
                  version: '0'
         | 
| 235 239 | 
             
            requirements: []
         | 
| 236 240 | 
             
            rubyforge_project: 
         | 
| 237 | 
            -
            rubygems_version: 2.1 | 
| 241 | 
            +
            rubygems_version: 2.2.0.rc.1
         | 
| 238 242 | 
             
            signing_key: 
         | 
| 239 243 | 
             
            specification_version: 4
         | 
| 240 244 | 
             
            summary: Baha is a command-line utility that assists in the creation of docker images.
         | 
| @@ -267,4 +271,5 @@ test_files: | |
| 267 271 | 
             
            - spec/pre_build/download_spec.rb
         | 
| 268 272 | 
             
            - spec/pre_build/template_spec.rb
         | 
| 269 273 | 
             
            - spec/pre_build_spec.rb
         | 
| 274 | 
            +
            - spec/refinements_spec.rb
         | 
| 270 275 | 
             
            - spec/spec_helper.rb
         |