    # File lib/chef/provider/directory.rb, line 42
          def define_resource_requirements
            # this must be evaluated before whyrun messages are printed
            access_controls.requires_changes?

            requirements.assert(:create) do |a|
              # Make sure the parent dir exists, or else fail.
              # for why run, print a message explaining the potential error.
              parent_directory = ::File.dirname(@new_resource.path)
              a.assertion { @new_resource.recursive || ::File.directory?(parent_directory) }
              a.failure_message(Chef::Exceptions::EnclosingDirectoryDoesNotExist, "Parent directory #{parent_directory} does not exist, cannot create #{@new_resource.path}")
              a.whyrun("Assuming directory #{parent_directory} would have been created")
            end

            requirements.assert(:create) do |a|
              parent_directory = ::File.dirname(@new_resource.path)
              a.assertion do
                if @new_resource.recursive
                  # find the lowest-level directory in @new_resource.path that already exists
                  # make sure we have write permissions to that directory
                  is_parent_writable = lambda do |base_dir|
                    base_dir = ::File.dirname(base_dir)
                    if ::File.exist?(base_dir)
                      ::File.writable?(base_dir)
                    else
                      is_parent_writable.call(base_dir)
                    end
                  end
                  is_parent_writable.call(@new_resource.path)
                else
                  # in why run mode & parent directory does not exist no permissions check is required
                  # If not in why run, permissions must be valid and we rely on prior assertion that dir exists
                  if !whyrun_mode? || ::File.exist?(parent_directory)
                    ::File.writable?(parent_directory)
                  else
                    true
                  end
                end
              end
              a.failure_message(Chef::Exceptions::InsufficientPermissions,
                "Cannot create #{@new_resource} at #{@new_resource.path} due to insufficient permissions")
            end

            requirements.assert(:delete) do |a|
              a.assertion do
                if ::File.exist?(@new_resource.path)
                  ::File.directory?(@new_resource.path) && ::File.writable?(@new_resource.path)
                else
                  true
                end
              end
              a.failure_message(RuntimeError, "Cannot delete #{@new_resource} at #{@new_resource.path}!")
              # No why-run handling here:
              #  * if we don't have permissions, this is unlikely to be changed earlier in the run
              #  * if the target is a file (not a dir), there's no reasonable path by which this would have been changed
            end
          end