ridley 0.8.6 → 0.9.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.
- data/.travis.yml +0 -4
- data/lib/ridley/chef/cookbook/syntax_check.rb +7 -19
- data/lib/ridley/chef/cookbook.rb +9 -5
- data/lib/ridley/errors.rb +2 -0
- data/lib/ridley/resources/cookbook_resource.rb +28 -19
- data/lib/ridley/version.rb +1 -1
- data/spec/unit/ridley/chef/cookbook_spec.rb +8 -0
- data/spec/unit/ridley/resources/cookbook_resource_spec.rb +10 -1
- metadata +3 -3
    
        data/.travis.yml
    CHANGED
    
    
| @@ -12,9 +12,9 @@ module Ridley::Chef | |
| 12 12 | 
             
                # Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 13 13 | 
             
                # you may not use this file except in compliance with the License.
         | 
| 14 14 | 
             
                # You may obtain a copy of the License at
         | 
| 15 | 
            -
                # | 
| 15 | 
            +
                #
         | 
| 16 16 | 
             
                #     http://www.apache.org/licenses/LICENSE-2.0
         | 
| 17 | 
            -
                # | 
| 17 | 
            +
                #
         | 
| 18 18 | 
             
                # Unless required by applicable law or agreed to in writing, software
         | 
| 19 19 | 
             
                # distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 20 20 | 
             
                # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| @@ -91,13 +91,7 @@ module Ridley::Chef | |
| 91 91 | 
             
                  end
         | 
| 92 92 |  | 
| 93 93 | 
             
                  def untested_ruby_files
         | 
| 94 | 
            -
                    ruby_files.reject  | 
| 95 | 
            -
                      if validated?(file)
         | 
| 96 | 
            -
                        true
         | 
| 97 | 
            -
                      else
         | 
| 98 | 
            -
                        false
         | 
| 99 | 
            -
                      end
         | 
| 100 | 
            -
                    end
         | 
| 94 | 
            +
                    ruby_files.reject { |file| validated?(file) }
         | 
| 101 95 | 
             
                  end
         | 
| 102 96 |  | 
| 103 97 | 
             
                  def template_files
         | 
| @@ -105,13 +99,7 @@ module Ridley::Chef | |
| 105 99 | 
             
                  end
         | 
| 106 100 |  | 
| 107 101 | 
             
                  def untested_template_files
         | 
| 108 | 
            -
                    template_files.reject  | 
| 109 | 
            -
                      if validated?(file)
         | 
| 110 | 
            -
                        true
         | 
| 111 | 
            -
                      else
         | 
| 112 | 
            -
                        false
         | 
| 113 | 
            -
                      end
         | 
| 114 | 
            -
                    end
         | 
| 102 | 
            +
                    template_files.reject { |file| validated?(file) }
         | 
| 115 103 | 
             
                  end
         | 
| 116 104 |  | 
| 117 105 | 
             
                  def validated?(file)
         | 
| @@ -137,18 +125,18 @@ module Ridley::Chef | |
| 137 125 | 
             
                  end
         | 
| 138 126 |  | 
| 139 127 | 
             
                  def validate_template(erb_file)
         | 
| 140 | 
            -
                    result = shell_out("erubis -x #{erb_file} | ruby -c")
         | 
| 128 | 
            +
                    result = quietly { shell_out("erubis -x #{erb_file} | ruby -c") }
         | 
| 141 129 | 
             
                    result.error!
         | 
| 142 130 | 
             
                    true
         | 
| 143 131 | 
             
                  rescue Mixlib::ShellOut::ShellCommandFailed
         | 
| 144 132 | 
             
                    file_relative_path = erb_file[/^#{Regexp.escape(cookbook_path+File::Separator)}(.*)/, 1]
         | 
| 145 133 | 
             
                    log.error { "Erb template #{file_relative_path} has a syntax error:" }
         | 
| 146 | 
            -
                    result.stderr.each_line { |l| Ridley.log | 
| 134 | 
            +
                    result.stderr.each_line { |l| Ridley.log.fatal(l.chomp) }
         | 
| 147 135 | 
             
                    false
         | 
| 148 136 | 
             
                  end
         | 
| 149 137 |  | 
| 150 138 | 
             
                  def validate_ruby_file(ruby_file)
         | 
| 151 | 
            -
                    result = shell_out("ruby -c #{ruby_file}")
         | 
| 139 | 
            +
                    result = quietly { shell_out("ruby -c #{ruby_file}") }
         | 
| 152 140 | 
             
                    result.error!
         | 
| 153 141 | 
             
                    true
         | 
| 154 142 | 
             
                  rescue Mixlib::ShellOut::ShellCommandFailed
         | 
    
        data/lib/ridley/chef/cookbook.rb
    CHANGED
    
    | @@ -74,6 +74,9 @@ module Ridley::Chef | |
| 74 74 | 
             
                #     }
         | 
| 75 75 | 
             
                attr_reader :manifest
         | 
| 76 76 |  | 
| 77 | 
            +
                # @return [Boolean]
         | 
| 78 | 
            +
                attr_accessor :frozen
         | 
| 79 | 
            +
             | 
| 77 80 | 
             
                def_delegator :@metadata, :version
         | 
| 78 81 |  | 
| 79 82 | 
             
                def initialize(name, path, metadata)
         | 
| @@ -92,6 +95,7 @@ module Ridley::Chef | |
| 92 95 | 
             
                    providers: Array.new,
         | 
| 93 96 | 
             
                    root_files: Array.new
         | 
| 94 97 | 
             
                  )
         | 
| 98 | 
            +
                  @frozen        = false
         | 
| 95 99 |  | 
| 96 100 | 
             
                  load_files
         | 
| 97 101 | 
             
                end
         | 
| @@ -166,11 +170,11 @@ module Ridley::Chef | |
| 166 170 | 
             
                def validate
         | 
| 167 171 | 
             
                  raise IOError, "No Cookbook found at: #{path}" unless path.exist?
         | 
| 168 172 |  | 
| 169 | 
            -
                  unless  | 
| 170 | 
            -
                    raise Ridley::Errors::CookbookSyntaxError, "Invalid ruby files in cookbook: #{ | 
| 173 | 
            +
                  unless syntax_checker.validate_ruby_files
         | 
| 174 | 
            +
                    raise Ridley::Errors::CookbookSyntaxError, "Invalid ruby files in cookbook: #{cookbook_name} (#{version})."
         | 
| 171 175 | 
             
                  end
         | 
| 172 | 
            -
                  unless  | 
| 173 | 
            -
                    raise Ridley::Errors::CookbookSyntaxError, "Invalid template files in cookbook: #{ | 
| 176 | 
            +
                  unless syntax_checker.validate_templates
         | 
| 177 | 
            +
                    raise Ridley::Errors::CookbookSyntaxError, "Invalid template files in cookbook: #{cookbook_name} (#{version})."
         | 
| 174 178 | 
             
                  end
         | 
| 175 179 |  | 
| 176 180 | 
             
                  true
         | 
| @@ -183,13 +187,13 @@ module Ridley::Chef | |
| 183 187 | 
             
                  result[:cookbook_name] = cookbook_name
         | 
| 184 188 | 
             
                  result[:version]       = version
         | 
| 185 189 | 
             
                  result[:metadata]      = metadata
         | 
| 190 | 
            +
                  result[:frozen?]       = frozen
         | 
| 186 191 | 
             
                  result.to_hash
         | 
| 187 192 | 
             
                end
         | 
| 188 193 |  | 
| 189 194 | 
             
                def to_json(*args)
         | 
| 190 195 | 
             
                  result               = self.to_hash
         | 
| 191 196 | 
             
                  result['json_class'] = CHEF_JSON_CLASS
         | 
| 192 | 
            -
                  result['frozen?']    = false
         | 
| 193 197 | 
             
                  result.to_json(*args)
         | 
| 194 198 | 
             
                end
         | 
| 195 199 |  | 
    
        data/lib/ridley/errors.rb
    CHANGED
    
    
| @@ -29,10 +29,6 @@ module Ridley | |
| 29 29 | 
             
                    end
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 |  | 
| 32 | 
            -
                  def create(*args)
         | 
| 33 | 
            -
                    raise NotImplementedError
         | 
| 34 | 
            -
                  end
         | 
| 35 | 
            -
             | 
| 36 32 | 
             
                  # Delete a cookbook of the given name and version on the remote Chef server
         | 
| 37 33 | 
             
                  #
         | 
| 38 34 | 
             
                  # @param [Ridley::Client] client
         | 
| @@ -140,15 +136,12 @@ module Ridley | |
| 140 136 | 
             
                    nil
         | 
| 141 137 | 
             
                  end
         | 
| 142 138 |  | 
| 143 | 
            -
                  #  | 
| 139 | 
            +
                  # Update or create a new Cookbook Version of the given name, version with the
         | 
| 144 140 | 
             
                  # given manifest of files and checksums.
         | 
| 145 141 | 
             
                  #
         | 
| 146 142 | 
             
                  # @param [Ridley::Client] client
         | 
| 147 | 
            -
                  # @param [ | 
| 148 | 
            -
                  #  | 
| 149 | 
            -
                  # @param [String] manifest
         | 
| 150 | 
            -
                  #   a JSON blob containing file names, file paths, and checksums for each
         | 
| 151 | 
            -
                  #   that describe the cookbook version being uploaded.
         | 
| 143 | 
            +
                  # @param [Ridley::Chef::Cookbook] cookbook
         | 
| 144 | 
            +
                  #   the cookbook to save
         | 
| 152 145 | 
             
                  #
         | 
| 153 146 | 
             
                  # @option options [Boolean] :force
         | 
| 154 147 | 
             
                  #   Upload the Cookbook even if the version already exists and is frozen on
         | 
| @@ -157,19 +150,25 @@ module Ridley | |
| 157 150 | 
             
                  #   Freeze the uploaded Cookbook on the Chef Server so that it cannot be
         | 
| 158 151 | 
             
                  #   overwritten
         | 
| 159 152 | 
             
                  #
         | 
| 153 | 
            +
                  # @raise [Ridley::Errors::FrozenCookbook]
         | 
| 154 | 
            +
                  #   if a cookbook of the same name and version already exists on the remote Chef server
         | 
| 155 | 
            +
                  #   and is frozen. If the :force option is provided the given cookbook will be saved
         | 
| 156 | 
            +
                  #   regardless.
         | 
| 157 | 
            +
                  #
         | 
| 160 158 | 
             
                  # @return [Hash]
         | 
| 161 | 
            -
                  def  | 
| 159 | 
            +
                  def update(client, cookbook, options = {})
         | 
| 162 160 | 
             
                    options.reverse_merge(force: false, freeze: false)
         | 
| 163 161 |  | 
| 164 | 
            -
                     | 
| 165 | 
            -
                    url << "?force=true" if options[:force]
         | 
| 162 | 
            +
                    cookbook.frozen = options[:freeze]
         | 
| 166 163 |  | 
| 167 | 
            -
                     | 
| 168 | 
            -
             | 
| 164 | 
            +
                    url = "cookbooks/#{cookbook.cookbook_name}/#{cookbook.version}"
         | 
| 165 | 
            +
                    url << "?force=true" if options[:force]
         | 
| 169 166 |  | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 167 | 
            +
                    client.connection.put(url, cookbook.to_json)
         | 
| 168 | 
            +
                  rescue Ridley::Errors::HTTPConflict => ex
         | 
| 169 | 
            +
                    raise Ridley::Errors::FrozenCookbook, ex
         | 
| 172 170 | 
             
                  end
         | 
| 171 | 
            +
                  alias_method :create, :update
         | 
| 173 172 |  | 
| 174 173 | 
             
                  # Uploads a cookbook to the remote Chef server from the contents of a filepath
         | 
| 175 174 | 
             
                  #
         | 
| @@ -195,17 +194,24 @@ module Ridley | |
| 195 194 | 
             
                    options   = options.reverse_merge(validate: true, force: false, freeze: false)
         | 
| 196 195 | 
             
                    cookbook  = Ridley::Chef::Cookbook.from_path(path, options.slice(:name))
         | 
| 197 196 |  | 
| 197 | 
            +
                    unless (existing = find(client, cookbook.cookbook_name, cookbook.version)).nil?
         | 
| 198 | 
            +
                      if existing.frozen? && options[:force] == false
         | 
| 199 | 
            +
                        msg = "The cookbook #{cookbook.cookbook_name} (#{cookbook.version}) already exists and is"
         | 
| 200 | 
            +
                        msg << " frozen on the Chef server. Use the 'force' option to override."
         | 
| 201 | 
            +
                        raise Ridley::Errors::FrozenCookbook, msg
         | 
| 202 | 
            +
                      end
         | 
| 203 | 
            +
                    end
         | 
| 204 | 
            +
             | 
| 198 205 | 
             
                    if options[:validate]
         | 
| 199 206 | 
             
                      cookbook.validate
         | 
| 200 207 | 
             
                    end
         | 
| 201 208 |  | 
| 202 | 
            -
                    name      = options[:name] || cookbook.name
         | 
| 203 209 | 
             
                    checksums = cookbook.checksums.dup
         | 
| 204 210 | 
             
                    sandbox   = client.sandbox.create(checksums.keys)
         | 
| 205 211 |  | 
| 206 212 | 
             
                    sandbox.upload(checksums)
         | 
| 207 213 | 
             
                    sandbox.commit
         | 
| 208 | 
            -
                     | 
| 214 | 
            +
                    update(client, cookbook, options.slice(:force, :freeze))
         | 
| 209 215 | 
             
                  end
         | 
| 210 216 |  | 
| 211 217 | 
             
                  # Return a list of versions for the given cookbook present on the remote Chef server
         | 
| @@ -293,6 +299,9 @@ module Ridley | |
| 293 299 | 
             
                attribute :version,
         | 
| 294 300 | 
             
                  type: String
         | 
| 295 301 |  | 
| 302 | 
            +
                attribute :frozen?,
         | 
| 303 | 
            +
                  type: Boolean
         | 
| 304 | 
            +
             | 
| 296 305 | 
             
                # Download the entire cookbook
         | 
| 297 306 | 
             
                #
         | 
| 298 307 | 
             
                # @param [String] destination (Dir.mktmpdir)
         | 
    
        data/lib/ridley/version.rb
    CHANGED
    
    
| @@ -150,6 +150,10 @@ describe Ridley::Chef::Cookbook do | |
| 150 150 | 
             
              describe "#to_hash" do
         | 
| 151 151 | 
             
                subject { cookbook.to_hash }
         | 
| 152 152 |  | 
| 153 | 
            +
                it "has a :frozen? flag" do
         | 
| 154 | 
            +
                  subject.should have_key(:frozen?)
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
             | 
| 153 157 | 
             
                it "has a :recipes key with a value of an Array Hashes" do
         | 
| 154 158 | 
             
                  subject.should have_key(:recipes)
         | 
| 155 159 | 
             
                  subject[:recipes].should be_a(Array)
         | 
| @@ -408,5 +412,9 @@ describe Ridley::Chef::Cookbook do | |
| 408 412 | 
             
                  @json.should have_json_path('json_class')
         | 
| 409 413 | 
             
                  parse_json(@json)['json_class'].should eql(Ridley::Chef::Cookbook::CHEF_JSON_CLASS)
         | 
| 410 414 | 
             
                end
         | 
| 415 | 
            +
             | 
| 416 | 
            +
                it "has a 'frozen?' flag" do
         | 
| 417 | 
            +
                  @json.should have_json_path('frozen?')
         | 
| 418 | 
            +
                end
         | 
| 411 419 | 
             
              end
         | 
| 412 420 | 
             
            end
         | 
| @@ -6,6 +6,7 @@ describe Ridley::CookbookResource do | |
| 6 6 | 
             
              subject { described_class.new(client) }
         | 
| 7 7 |  | 
| 8 8 | 
             
              describe "ClassMethods" do
         | 
| 9 | 
            +
                subject { described_class }
         | 
| 9 10 | 
             
                let(:server_url) { "https://api.opscode.com/organizations/vialstudios" }
         | 
| 10 11 | 
             
                let(:client_name) { "reset" }
         | 
| 11 12 | 
             
                let(:client_key) { fixtures_path.join("reset.pem") }
         | 
| @@ -132,7 +133,7 @@ describe Ridley::CookbookResource do | |
| 132 133 | 
             
                end
         | 
| 133 134 |  | 
| 134 135 | 
             
                describe "::versions" do
         | 
| 135 | 
            -
                  let(:cookbook) { "artifact" } | 
| 136 | 
            +
                  let(:cookbook) { "artifact" }
         | 
| 136 137 | 
             
                  subject { described_class.versions(client, cookbook) }
         | 
| 137 138 |  | 
| 138 139 | 
             
                  before(:each) do
         | 
| @@ -169,6 +170,14 @@ describe Ridley::CookbookResource do | |
| 169 170 | 
             
                    subject.should include("1.2.0")
         | 
| 170 171 | 
             
                  end
         | 
| 171 172 | 
             
                end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                describe "::upload" do
         | 
| 175 | 
            +
                  pending
         | 
| 176 | 
            +
                end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                describe "::update" do
         | 
| 179 | 
            +
                  pending
         | 
| 180 | 
            +
                end
         | 
| 172 181 | 
             
              end
         | 
| 173 182 |  | 
| 174 183 | 
             
              describe "#download" do
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ridley
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.9.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-03- | 
| 12 | 
            +
            date: 2013-03-22 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: json
         | 
| @@ -401,7 +401,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 401 401 | 
             
                  version: '0'
         | 
| 402 402 | 
             
                  segments:
         | 
| 403 403 | 
             
                  - 0
         | 
| 404 | 
            -
                  hash:  | 
| 404 | 
            +
                  hash: 141649622166830890
         | 
| 405 405 | 
             
            requirements: []
         | 
| 406 406 | 
             
            rubyforge_project: 
         | 
| 407 407 | 
             
            rubygems_version: 1.8.24
         |