Class: Rake::Puppet

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec_puppet_utils/rake/project_tasks.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePuppet

Returns a new instance of Puppet.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 25

def initialize
  extend Rake::DSL  # makes 'namespace' and 'task' methods available to instance

  @librarian_dir      = 'modules'
  @site_dir           = 'site'
  @lib_dir            = 'lib'
  @excluded_dirs      = ['.', '..']
  @excluded_modules   = []
  @package_dir        = 'pkg'
  @package_files      = ['hieradata', 'environment.conf']
  @package_name       = 'puppet'
  @package_version    = nil
  @package_versioning = true
end

Instance Attribute Details

#excluded_modulesObject

Returns the value of attribute excluded_modules.



12
13
14
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 12

def excluded_modules
  @excluded_modules
end

#package_dirObject

Returns the value of attribute package_dir.



12
13
14
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 12

def package_dir
  @package_dir
end

#package_filesObject

Returns the value of attribute package_files.



12
13
14
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 12

def package_files
  @package_files
end

#package_versionObject

Returns the value of attribute package_version.



12
13
14
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 12

def package_version
  @package_version
end

#package_versioningObject

Returns the value of attribute package_versioning.



12
13
14
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 12

def package_versioning
  @package_versioning
end

Instance Method Details

#filter_modules(modules) ⇒ Object



59
60
61
62
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 59

def filter_modules(modules)
  modules.select! { |m| module_has_specs?(m) and module_has_rakefile?(m) }
  modules
end

#load_build_tasksObject

Raises:

  • (ArgumentError)


111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 111

def load_build_tasks

  raise ArgumentError, 'Please provide a package_version (e.g. "1.0.0")' if @package_version.nil?

  full_package_name = @package_versioning ? "puppet-#{@package_version}.zip" : 'puppet.zip'
  package_desc      = @package_versioning ? full_package_name : "#{full_package_name} v#{@package_version}"
  package_path      = File.expand_path "#{@package_dir}/#{full_package_name}"
  build_dir         = "#{@package_dir}/puppet"

  namespace :build do

    # Preps build directory
    task :prep do
      puts 'Preparing build'

      FileUtils.rm package_path if File.exist?(package_path)
      FileUtils.rm_r build_dir if File.exist?(build_dir)
      FileUtils.mkdir_p build_dir
    end

    task :copy_files => [:prep] do

      # Copy librarian and site modules into build dir
      puts 'Copying external and site modules'
      FileUtils.cp_r @site_dir, build_dir
      FileUtils.cp_r @librarian_dir, build_dir

      # Copy lib modules into the librarian build dir
      puts 'Copying lib modules'
      FileUtils.cp_r "#{@lib_dir}/.", "#{build_dir}/#{@librarian_dir}"

      # Copy other package files
      @package_files.each {|f|
        fail "Could not find package file or directory #{f}" unless File.exist? f
        puts "Copying #{f} to #{build_dir}"
        FileUtils.cp_r f, build_dir
      }
    end

    task :package => [:copy_files] do
      puts "Creating #{full_package_name}"
      # Exclude all the spec code as it's not needed once deployed
      exclude_patterns = ['\*/\*/spec/\*']
      exclude_string   = "-x #{exclude_patterns.join(' ')}"
      FileUtils.cd(build_dir) {
        out = `zip -qr '#{package_path}' . #{exclude_string}`
        fail("Error creating package: #{out}") unless $?.exitstatus == 0
      }
    end

    task :cleanup do
      puts "Cleaning up #{build_dir}"
      FileUtils.rm_r build_dir if File.exist?(build_dir)
    end
  end

  desc "Build #{package_desc} without tests"
  task :quick_build => ['build:package', 'build:cleanup'] do
    puts "Built #{package_desc}"
  end

  desc "Build #{package_desc}"
  task :build => [:spec, :quick_build]
end

#load_module_tasksObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 85

def load_module_tasks

  modules      = testable_modules
  module_names = testable_modules.collect { |m| m.split('/')[1] }
  spec_tasks   = module_names.collect { |mn| "#{mn}:#{:spec}" }

  modules.each_with_index { |module_path, i|

    module_name = module_names[i]

    namespace module_name do
      desc "Run #{module_name} module specs"
      task :spec do
        Dir.chdir module_path do
          success = system('rake spec') # This isn't perfect but ...
          exit 1 unless success
        end
      end
    end
  }

  desc 'Run specs in all modules'
  task :spec    => spec_tasks
  task :default => :spec
end

#load_tasksObject



40
41
42
43
44
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 40

def load_tasks
  validate_unique_module_names
  load_module_tasks
  load_build_tasks
end

#module_has_rakefile?(module_dir) ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
71
72
73
74
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 68

def module_has_rakefile?(module_dir)
  rakefiles = ['rakefile', 'rakefile.rb']
  entries   = Dir.entries module_dir
  entries.collect! { |f| f.downcase }
  rakefiles.each { |rf| return true if entries.include? rf }
  false
end

#module_has_specs?(module_dir) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 64

def module_has_specs?(module_dir)
  File.directory? "#{module_dir}/spec"
end

#testable_modulesObject

private

Raises:

  • (ArgumentError)


48
49
50
51
52
53
54
55
56
57
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 48

def testable_modules
  raise ArgumentError, 'excluded_modules must be an array' unless @excluded_modules.is_a? Array
  modules = []
  [@lib_dir, @site_dir].each { |module_dir|
    raise ArgumentError, "Module path #{module_dir} could not be found" unless Dir.exist?(module_dir)
    entries = Dir.entries(module_dir) - @excluded_dirs - @excluded_modules
    modules.concat entries.collect { |entry| "#{module_dir}/#{entry}" }
  }
  filter_modules modules
end

#validate_unique_module_namesObject



76
77
78
79
80
81
82
83
# File 'lib/rspec_puppet_utils/rake/project_tasks.rb', line 76

def validate_unique_module_names
  # & == intersection : Returns elements common to the both arrays
  duplicates =  Dir.entries(@site_dir) & Dir.entries(@librarian_dir)
  duplicates += Dir.entries(@librarian_dir) & Dir.entries(@lib_dir)
  duplicates += Dir.entries(@lib_dir) & Dir.entries(@site_dir)
  duplicates -= @excluded_dirs
  fail "Duplicate module names: #{duplicates.join ', '}" unless duplicates.empty?
end