blubber 0.1.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 +7 -0
- data/Gemfile +6 -0
- data/README.md +35 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/blubber.gemspec +28 -0
- data/exe/blubber +6 -0
- data/lib/blubber.rb +5 -0
- data/lib/blubber/builder.rb +68 -0
- data/lib/blubber/cli.rb +28 -0
- data/lib/blubber/flow.rb +39 -0
- data/lib/blubber/runner.rb +37 -0
- data/lib/blubber/tagger.rb +82 -0
- data/lib/blubber/version.rb +3 -0
- metadata +128 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 6bc3ea1f6956edf83146f2f382ef7e79d4ab9bb0666050a6d4524384075fde9a
         | 
| 4 | 
            +
              data.tar.gz: 002aa4a490a6c0839824a791867663f59f6e6fb9733c71c995ad8b5266cd4d37
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 434c08fa0f6119eda6dbe65fb6d9cddd49644c13ab5e6b4f959b95bb734e7e42b0f3311ec56be276314f5e41f66d5fb090c338a18071cdfcd9f9abdbc63ea42e
         | 
| 7 | 
            +
              data.tar.gz: 9ef949da9b2b19c1d19c150c13096f5317b9cb77eac020db1c353786ceba9dc876e8dc9ca602345b8bd787596bca221a2c13f983c977bee7d3a3473d72c2dcc9
         | 
    
        data/Gemfile
    ADDED
    
    
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # Blubber
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/blubber`. To experiment with that code, run `bin/console` for an interactive prompt.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            TODO: Delete this and the text above, and describe your gem
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## Installation
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Add this line to your application's Gemfile:
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ```ruby
         | 
| 12 | 
            +
            gem 'blubber'
         | 
| 13 | 
            +
            ```
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            And then execute:
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                $ bundle
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            Or install it yourself as:
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                $ gem install blubber
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            ## Usage
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            TODO: Write usage instructions here
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            ## Development
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            ## Contributing
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/blubber.
         | 
    
        data/Rakefile
    ADDED
    
    
    
        data/bin/console
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "bundler/setup"
         | 
| 4 | 
            +
            require "blubber"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # You can add fixtures and/or initialization code here to make experimenting
         | 
| 7 | 
            +
            # with your gem easier. You can also use a different console, if you like.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # (If you use this, don't forget to add pry to your Gemfile!)
         | 
| 10 | 
            +
            # require "pry"
         | 
| 11 | 
            +
            # Pry.start
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            require "irb"
         | 
| 14 | 
            +
            IRB.start(__FILE__)
         | 
    
        data/bin/setup
    ADDED
    
    
    
        data/blubber.gemspec
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            lib = File.expand_path('lib', __dir__)
         | 
| 2 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 3 | 
            +
            require 'blubber/version'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |spec|
         | 
| 6 | 
            +
              spec.name          = 'blubber'
         | 
| 7 | 
            +
              spec.version       = Blubber::VERSION
         | 
| 8 | 
            +
              spec.authors       = ['Mikko Kokkonen']
         | 
| 9 | 
            +
              spec.email         = ['mikko@mikian.com']
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              spec.summary       = 'Blubber - build collection of docker images'
         | 
| 12 | 
            +
              spec.description   = 'Blubber allows easily to build collection of docker-images at ease.'
         | 
| 13 | 
            +
              spec.homepage      = 'https://github.com/mikian/blubber'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              spec.files         = `git ls-files -z`.split("\x0").reject do |f|
         | 
| 16 | 
            +
                f.match(%r{^(test|spec|features)/})
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
              spec.bindir        = 'exe'
         | 
| 19 | 
            +
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 20 | 
            +
              spec.require_paths = ['lib']
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              spec.add_dependency 'highline'
         | 
| 23 | 
            +
              spec.add_dependency 'thor'
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              spec.add_development_dependency 'bundler', '~> 1.16'
         | 
| 26 | 
            +
              spec.add_development_dependency 'rake', '~> 10.0'
         | 
| 27 | 
            +
              spec.add_development_dependency 'rspec', '~> 3.0'
         | 
| 28 | 
            +
            end
         | 
    
        data/exe/blubber
    ADDED
    
    
    
        data/lib/blubber.rb
    ADDED
    
    
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            require 'highline'
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
            require 'open3'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'blubber/runner'
         | 
| 6 | 
            +
            require 'blubber/tagger'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module Blubber
         | 
| 9 | 
            +
              class Builder
         | 
| 10 | 
            +
                def initialize(layer:, logger: nil)
         | 
| 11 | 
            +
                  @layer = layer
         | 
| 12 | 
            +
                  @logger = logger
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def run
         | 
| 16 | 
            +
                  logger.info ui.color("BUILDING", :yellow)
         | 
| 17 | 
            +
                  retval = build(layer)
         | 
| 18 | 
            +
                  level, color = retval.zero? ? [:info, :green] : [:error, :red]
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  logger.public_send(level, ui.color("#{layer}: #{retval.zero? ? 'SUCCESS' : 'ERROR'}", color))
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  { success: retval.zero?, id: build_ids[layer] }
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                private
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                attr_reader :layer, :logger
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def docker_registry
         | 
| 30 | 
            +
                  format('%<host>s/%<project>s',
         | 
| 31 | 
            +
                         host: ENV.fetch('DOCKER_REGISTRY'),
         | 
| 32 | 
            +
                         project: 'etl')
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def ui
         | 
| 36 | 
            +
                  @ui ||= HighLine.new
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def runner
         | 
| 40 | 
            +
                  @runner ||= Runner.new(logger: logger)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def tags
         | 
| 44 | 
            +
                  @tags ||= Tagger.new(layer: layer, image_id: nil).tags
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def build_ids
         | 
| 48 | 
            +
                  @build_ids ||= {}
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def build(layer)
         | 
| 52 | 
            +
                  # NOTICE : Speed up build for fresh slave
         | 
| 53 | 
            +
                  tags.each do |tag|
         | 
| 54 | 
            +
                    runner.run("docker pull #{docker_registry}/#{layer}:#{tag}")
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  status = nil
         | 
| 58 | 
            +
                  Dir.chdir(layer) do
         | 
| 59 | 
            +
                    status = runner.run('docker build .') do |stdout, _, _|
         | 
| 60 | 
            +
                      if stdout && (m = stdout.match(/Successfully built ([a-z0-9]{12})/))
         | 
| 61 | 
            +
                        build_ids[layer] = m[1]
         | 
| 62 | 
            +
                      end
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                  status
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
    
        data/lib/blubber/cli.rb
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            require 'thor'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'blubber/flow'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Blubber
         | 
| 6 | 
            +
              class Cli < Thor
         | 
| 7 | 
            +
                desc 'build', 'Builds all found Docker images'
         | 
| 8 | 
            +
                def build
         | 
| 9 | 
            +
                  # Build images
         | 
| 10 | 
            +
                  images = layers.map { |layer| Flow.new(layer: layer).run }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  table = [set_color('Layer', :bold), set_color('Tag', :bold)]
         | 
| 13 | 
            +
                  table += images.map do |(project, tags)|
         | 
| 14 | 
            +
                    tags.map do |tag|
         | 
| 15 | 
            +
                      [project, tag ]
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  puts HighLine.new.list(table.flatten, :columns_across, 2)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                no_tasks do
         | 
| 23 | 
            +
                  def layers
         | 
| 24 | 
            +
                    @layers ||= Dir['**/*/Dockerfile'].map { |d| File.dirname(d) }
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
    
        data/lib/blubber/flow.rb
    ADDED
    
    | @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            require 'open3'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'blubber/builder'
         | 
| 4 | 
            +
            require 'blubber/tagger'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Blubber
         | 
| 7 | 
            +
              class Flow
         | 
| 8 | 
            +
                def initialize(layer:)
         | 
| 9 | 
            +
                  @layer = layer
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def run
         | 
| 13 | 
            +
                  image = Builder.new(layer: layer, logger: logger).run
         | 
| 14 | 
            +
                  return unless image[:success]
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  tagger = Tagger.new(layer: layer, image_id: image[:id], logger: logger)
         | 
| 17 | 
            +
                  tagger.run
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  [tagger.project, tagger.tags]
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                private
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                attr_reader :layer
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def logger
         | 
| 27 | 
            +
                  @logger ||= Logger.new(STDOUT).tap do |logger|
         | 
| 28 | 
            +
                    logger.progname = layer
         | 
| 29 | 
            +
                    logger.formatter = proc do |severity, datetime, progname, msg|
         | 
| 30 | 
            +
                      format("%<severity>s, [%<datetime>s] -- %<progname>s: %<msg>s\n",
         | 
| 31 | 
            +
                             severity: severity[0],
         | 
| 32 | 
            +
                             datetime: datetime.strftime('%Y-%m-%d %H:%M:%S'),
         | 
| 33 | 
            +
                             progname: progname,
         | 
| 34 | 
            +
                             msg: msg)
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            require 'open3'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Blubber
         | 
| 4 | 
            +
              class Runner
         | 
| 5 | 
            +
                def initialize(logger:)
         | 
| 6 | 
            +
                  @logger = logger
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def run(cmd)
         | 
| 10 | 
            +
                  # see: http://stackoverflow.com/a/1162850/83386
         | 
| 11 | 
            +
                  Open3.popen3(cmd) do |_stdin, stdout, stderr, thread|
         | 
| 12 | 
            +
                    # read each stream from a new thread
         | 
| 13 | 
            +
                    { out: stdout, err: stderr }.each do |key, stream|
         | 
| 14 | 
            +
                      Thread.new do
         | 
| 15 | 
            +
                        until (line = stream.gets).nil?
         | 
| 16 | 
            +
                          # yield the block depending on the stream
         | 
| 17 | 
            +
                          if key == :out
         | 
| 18 | 
            +
                            logger.info line.strip
         | 
| 19 | 
            +
                            yield line, nil, thread if block_given?
         | 
| 20 | 
            +
                          else
         | 
| 21 | 
            +
                            logger.error line.strip
         | 
| 22 | 
            +
                            yield nil, line, thread if block_given?
         | 
| 23 | 
            +
                          end
         | 
| 24 | 
            +
                        end
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    thread.join
         | 
| 29 | 
            +
                    thread.value.exitstatus
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                private
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                attr_reader :logger
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,82 @@ | |
| 1 | 
            +
            require 'highline'
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
            require 'open3'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'blubber/runner'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Blubber
         | 
| 8 | 
            +
              class Tagger
         | 
| 9 | 
            +
                def initialize(layer:, image_id:, logger: nil)
         | 
| 10 | 
            +
                  @layer = layer
         | 
| 11 | 
            +
                  @image_id = image_id
         | 
| 12 | 
            +
                  @logger = logger
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def run
         | 
| 16 | 
            +
                  logger.info ui.color("#{layer}: PUSHING", :yellow)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  push
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def project
         | 
| 22 | 
            +
                  "#{docker_registry}/#{layer}"
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def tags
         | 
| 26 | 
            +
                  @tags ||= [].tap do |tags|
         | 
| 27 | 
            +
                    tags << "#{commit}#{dirty? ? '-dirty' : ''}"
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    unless dirty?
         | 
| 30 | 
            +
                      tags << branch_name.gsub(/[^\w.-]/, '_') unless branch_name.empty?
         | 
| 31 | 
            +
                      tags << 'latest' if branch_name == 'master'
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    tags.append(*File.read("#{layer}/Dockerfile").scan(/LABEL version=([\w][\w.-]*)/).flatten)
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                private
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                attr_reader :layer, :image_id, :logger
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def runner
         | 
| 43 | 
            +
                  @runner ||= Runner.new(logger: logger)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def docker_registry
         | 
| 47 | 
            +
                  format('%<host>s/%<project>s',
         | 
| 48 | 
            +
                         host: ENV.fetch('DOCKER_REGISTRY'),
         | 
| 49 | 
            +
                         project: 'etl')
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def ui
         | 
| 53 | 
            +
                  @ui ||= HighLine.new
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def dirty?
         | 
| 57 | 
            +
                  @dirty ||= system("git status --porcelain 2>&1 | grep -q '#{layer}'")
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def commit
         | 
| 61 | 
            +
                  @commit ||= ENV['GIT_COMMIT'] || `git rev-parse HEAD`.strip
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def branch_name
         | 
| 65 | 
            +
                  @branch_name ||= ENV['BRANCH_NAME'] || `git rev-parse HEAD | git branch -a --contains | sed -n 2p | cut -d'/' -f 3-`.strip
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def push
         | 
| 69 | 
            +
                  status = true
         | 
| 70 | 
            +
                  tags.each do |tag|
         | 
| 71 | 
            +
                    logger.info "Tagging #{image_id} as #{layer}:#{tag}"
         | 
| 72 | 
            +
                    retval = runner.run("docker tag #{image_id} #{project}:#{tag}")
         | 
| 73 | 
            +
                    next unless retval.zero?
         | 
| 74 | 
            +
                    retval = runner.run("docker push #{project}:#{tag}")
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    status &= retval.zero?
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  tags if status
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,128 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: blubber
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Mikko Kokkonen
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: exe
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2018-05-12 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: highline
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: thor
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: bundler
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '1.16'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '1.16'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: rake
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '10.0'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '10.0'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: rspec
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - "~>"
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '3.0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - "~>"
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '3.0'
         | 
| 83 | 
            +
            description: Blubber allows easily to build collection of docker-images at ease.
         | 
| 84 | 
            +
            email:
         | 
| 85 | 
            +
            - mikko@mikian.com
         | 
| 86 | 
            +
            executables:
         | 
| 87 | 
            +
            - blubber
         | 
| 88 | 
            +
            extensions: []
         | 
| 89 | 
            +
            extra_rdoc_files: []
         | 
| 90 | 
            +
            files:
         | 
| 91 | 
            +
            - Gemfile
         | 
| 92 | 
            +
            - README.md
         | 
| 93 | 
            +
            - Rakefile
         | 
| 94 | 
            +
            - bin/console
         | 
| 95 | 
            +
            - bin/setup
         | 
| 96 | 
            +
            - blubber.gemspec
         | 
| 97 | 
            +
            - exe/blubber
         | 
| 98 | 
            +
            - lib/blubber.rb
         | 
| 99 | 
            +
            - lib/blubber/builder.rb
         | 
| 100 | 
            +
            - lib/blubber/cli.rb
         | 
| 101 | 
            +
            - lib/blubber/flow.rb
         | 
| 102 | 
            +
            - lib/blubber/runner.rb
         | 
| 103 | 
            +
            - lib/blubber/tagger.rb
         | 
| 104 | 
            +
            - lib/blubber/version.rb
         | 
| 105 | 
            +
            homepage: https://github.com/mikian/blubber
         | 
| 106 | 
            +
            licenses: []
         | 
| 107 | 
            +
            metadata: {}
         | 
| 108 | 
            +
            post_install_message: 
         | 
| 109 | 
            +
            rdoc_options: []
         | 
| 110 | 
            +
            require_paths:
         | 
| 111 | 
            +
            - lib
         | 
| 112 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 113 | 
            +
              requirements:
         | 
| 114 | 
            +
              - - ">="
         | 
| 115 | 
            +
                - !ruby/object:Gem::Version
         | 
| 116 | 
            +
                  version: '0'
         | 
| 117 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 118 | 
            +
              requirements:
         | 
| 119 | 
            +
              - - ">="
         | 
| 120 | 
            +
                - !ruby/object:Gem::Version
         | 
| 121 | 
            +
                  version: '0'
         | 
| 122 | 
            +
            requirements: []
         | 
| 123 | 
            +
            rubyforge_project: 
         | 
| 124 | 
            +
            rubygems_version: 2.7.3
         | 
| 125 | 
            +
            signing_key: 
         | 
| 126 | 
            +
            specification_version: 4
         | 
| 127 | 
            +
            summary: Blubber - build collection of docker images
         | 
| 128 | 
            +
            test_files: []
         |