Class: Runbook::Generators::Project

Inherits:
Thor::Group
  • Object
show all
Includes:
Base
Defined in:
lib/runbook/generators/project/project.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

included, set_base_options

Class Method Details

.descriptionObject



7
8
9
# File 'lib/runbook/generators/project/project.rb', line 7

def self.description
  "Generate a project for your runbooks"
end

.long_descriptionObject



11
12
13
14
15
16
17
# File 'lib/runbook/generators/project/project.rb', line 11

def self.long_description
  <<-LONG_DESC
  This generator generates a project for your runbooks. It creates a
  project skeleton to hold your runbooks, runbook extensions, shared
  code, configuration, tests, and dependencies.
  LONG_DESC
end

Instance Method Details

#create_base_fileObject



115
116
117
118
119
120
121
122
123
124
# File 'lib/runbook/generators/project/project.rb', line 115

def create_base_file
  target = File.join(
    parent_options[:root],
    _name,
    "lib",
    "#{_name}.rb",
  )

  template("templates/base_file.rb.tt", target)
end

#create_extensions_directoryObject



178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/runbook/generators/project/project.rb', line 178

def create_extensions_directory
  dirs = [
    parent_options[:root],
    _name,
    "lib",
    "runbook",
    "extensions",
  ]
  target = File.join(*dirs)

  empty_directory(target)
  _keep_dir(target)
end

#create_gemfileObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/runbook/generators/project/project.rb', line 95

def create_gemfile
  target = File.join(
    parent_options[:root],
    _name,
    "Gemfile",
  )

  template("templates/Gemfile.tt", target)

  # Add development dependencies from gemspec
  return unless @gemspec_file_contents
  gems = @gemspec_file_contents.select do |line|
    line =~ /  spec.add_development_dependency/
  end.map do |line|
    line.gsub(/  spec.add_development_dependency/, "gem")
  end.join

  append_to_file(target, "\n#{gems}", verbose: false)
end

#create_generators_directoryObject



192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/runbook/generators/project/project.rb', line 192

def create_generators_directory
  dirs = [
    parent_options[:root],
    _name,
    "lib",
    "runbook",
    "generators",
  ]
  target = File.join(*dirs)

  empty_directory(target)
  _keep_dir(target)
end

#create_lib_directoryObject



206
207
208
209
210
211
212
213
214
215
216
# File 'lib/runbook/generators/project/project.rb', line 206

def create_lib_directory
  dirs = [
    parent_options[:root],
    _name,
    @shared_lib_dir,
  ]
  target = File.join(*dirs)

  empty_directory(target)
  _keep_dir(target)
end

#create_readmeObject



85
86
87
88
89
90
91
92
93
# File 'lib/runbook/generators/project/project.rb', line 85

def create_readme
  target = File.join(
    parent_options[:root],
    _name,
    "README.md",
  )

  template("templates/README.md.tt", target)
end

#create_ruby_gemsetObject



146
147
148
149
150
151
152
153
154
# File 'lib/runbook/generators/project/project.rb', line 146

def create_ruby_gemset
  target = File.join(
    parent_options[:root],
    _name,
    ".ruby-gemset",
  )

  create_file(target, "#{_name}\n")
end

#create_ruby_versionObject



136
137
138
139
140
141
142
143
144
# File 'lib/runbook/generators/project/project.rb', line 136

def create_ruby_version
  target = File.join(
    parent_options[:root],
    _name,
    ".ruby-version",
  )

  create_file(target, "ruby-#{RUBY_VERSION}\n")
end

#create_runbookfileObject



156
157
158
159
160
161
162
163
164
# File 'lib/runbook/generators/project/project.rb', line 156

def create_runbookfile
  target = File.join(
    parent_options[:root],
    _name,
    "Runbookfile",
  )

  template("templates/Runbookfile.tt", target)
end

#create_runbooks_directoryObject



166
167
168
169
170
171
172
173
174
175
176
# File 'lib/runbook/generators/project/project.rb', line 166

def create_runbooks_directory
  dirs = [
    parent_options[:root],
    _name,
    "runbooks",
  ]
  target = File.join(*dirs)

  empty_directory(target)
  _keep_dir(target)
end

#init_gemObject



26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/runbook/generators/project/project.rb', line 26

def init_gem
  bundle_exists = "which bundle 2>&1 1>/dev/null"
  raise "Please ensure bundle is installed" unless system(bundle_exists)

  inside(parent_options[:root]) do
    test = "--test #{options[:test]}"
    continue = (
      run("bundle gem #{_name} #{test} --no-coc --no-mit") ||
      options[:pretend]
    )
    exit 1 unless continue
  end
end

#modify_rakefileObject



126
127
128
129
130
131
132
133
134
# File 'lib/runbook/generators/project/project.rb', line 126

def modify_rakefile
  target = File.join(
    parent_options[:root],
    _name,
    "Rakefile",
  )

  gsub_file(target, /^require "bundler\/gem_tasks"\n/, "", verbose: false)
end

#remove_bad_testObject



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/runbook/generators/project/project.rb', line 237

def remove_bad_test
  path = [
    parent_options[:root],
    _name,
  ]

  case options["test"]
  when "rspec"
    path << "spec"
    path << "#{_name}_spec.rb"
  when "minitest"
    path << "test"
    path << "#{_name}_test.rb"
  end
  target = File.join(*path)

  bad_test = /  .*version.*\n.*\n  end\n\n/m
  gsub_file(target, bad_test, "", verbose: false)
end

#remove_unneeded_filesObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/runbook/generators/project/project.rb', line 40

def remove_unneeded_files
  dirs = [
    parent_options[:root],
    _name,
  ]

  gemspec_file = File.join(*dirs, "#{_name}.gemspec")
  if File.exist?(gemspec_file)
    @gemspec_file_contents = File.readlines(gemspec_file)
  end
  remove_file(gemspec_file)

  readme = File.join(*dirs, "README.md")
  remove_file(readme)

  gemfile = File.join(*dirs, "Gemfile")
  remove_file(gemfile)

  base_file = File.join(*dirs, "lib", "#{_name}.rb")
  remove_file(base_file)

  version_file_path = [
    "lib",
    _name,
    "version.rb",
  ]
  version_file = File.join(*dirs, *version_file_path)
  remove_file(version_file)
end

#runbook_project_overviewObject



257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/runbook/generators/project/project.rb', line 257

def runbook_project_overview
  msg = [
    "",
    "Your runbook project was successfully created.",
    "Remember to run `./bin/setup` in your project to install dependencies.",
    "Add runbooks to the `runbooks` directory.",
    "Add shared code to `#{@shared_lib_dir}`.",
    "Execute runbooks using `bundle exec runbook exec <RUNBOOK_PATH>` from your project root.",
    "See the README.md for more details.",
    "\n",
  ]

  say(msg.join("\n"))
end

#shared_lib_dirObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/runbook/generators/project/project.rb', line 70

def shared_lib_dir
  msg = [
    "Where should shared runbook code live?",
    "Use `lib/#{_name}` for runbook-only projects",
    "Use `lib/#{_name}/runbook` for projects used for non-runbook tasks",
    "Shared runbook code path:",
  ]

  if options.has_key?("shared-lib-dir")
    @shared_lib_dir = options["shared-lib-dir"]
  else
    @shared_lib_dir = ask(msg.join("\n"))
  end
end

#update_bin_consoleObject



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/runbook/generators/project/project.rb', line 218

def update_bin_console
  path = [
    parent_options[:root],
    _name,
    "bin",
    "console",
  ]
  target = File.join(*path)

  old_require = /require "#{_name}"/
  new_require = %Q(require_relative "../lib/#{_name}")
  new_require += "\n\nRunbook::Configuration.load_config"
  gsub_file(target, old_require, new_require, verbose: false)

  old_require = /require "#{_name}"/
  new_require = %Q(require_relative "../lib/#{_name}")
  gsub_file(target, old_require, new_require, verbose: false)
end