# More info at https://github.com/guard/guard#readme

# You'll need to make sure Guard, and any of its plugins are in your Gemfile.local
#
# Example:
#  # Automatically run tests on file changes
#  gem 'guard', require: false
#  gem 'guard-rspec', require: false
#  gem 'guard-bundler', require: false
#  gem 'terminal-notifier-guard', require: false
#
# After running `bundle install`, you can run Guard via `bundle exec guard`
# from the top of the repository checkout.

notification(:terminal_notifier, app_name: "Puppet ::", group: `pwd`.chomp) if `uname` =~ /Darwin/

## Uncomment and set this to only include directories you want to watch
# directories %w(app lib config test spec features) \
#  .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")}

## Note: if you are using the `directories` clause above and you are not
## watching the project directory ('.'), then you will want to move
## the Guardfile to a watched dir and symlink it back, e.g.
#
#  $ mkdir config
#  $ mv Guardfile config/
#  $ ln -s config/Guardfile .
#
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"

guard :bundler do
  require 'guard/bundler'
  require 'guard/bundler/verify'
  helper = Guard::Bundler::Verify.new

  files = ['Gemfile', 'Gemfile.local']
  files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }

  # Assume files are symlinked from somewhere
  files.each { |file| watch(helper.real_path(file)) }
end

def file2specs(match)
  file = match[0]
  puts "Lib file changed: #{file.inspect}"
  %w{spec/unit spec/integration}.collect { |d|
    file.sub('lib/puppet', d).sub(".rb", "_spec.rb")
  }.find_all { |f|
    File.exist?(f)
  }
end

rspec_options = {
  cmd: "bundle exec rspec",
  run_all: {
    cmd: "bundle exec parallel_rspec -o '--format progress ",
    cmd_additional_args: "'"
  },
  all_after_pass: false
}
guard :rspec, rspec_options do
  require "guard/rspec/dsl"
  dsl = Guard::RSpec::Dsl.new(self)

  # Feel free to open issues for suggestions and improvements

  # RSpec files
  rspec = dsl.rspec
  watch(rspec.spec_helper) { rspec.spec_dir }
  watch(rspec.spec_support) { rspec.spec_dir }
  watch(rspec.spec_files)

  # Ruby files
  ruby = dsl.ruby
  watch(ruby.lib_files) { |f| file2specs(f) }
end
